I am doing quickblox integration in my app. I have successfully integrated chat functionality and it's working great. But push notification functionality is not working. I have followed the below step to integrate push notifications.
create a project on firebase. Implement cloud messaging and integrate google JSON in the main project.
Login in quickblox account adds the google server key in the push notification.
follow https://docs.quickblox.com/docs/android-push-notifications document and after adding firebase cloude messaging i add below in menifest file.
<meta-data android:name="com.quickblox.messages.TYPE" android:value="FCM" /> <meta-data android:name="com.quickblox.messages.SENDER_ID" android:value="@string/sender_id" /> <meta-data android:name="com.quickblox.messages.QB_ENVIRONMENT" android:value="DEVELOPMENT" />
and register below services in menifest
`<service android:name="com.quickblox.messages.services.fcm.QBFcmPushListenerService">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT" />
</intent-filter>
</service>
<service android:name="com.quickblox.messages.services.fcm.QBFcmPushInstanceIDService">
<intent-filter>
<action android:name="com.google.firebase.INSTANCE_ID_EVENT" />
</intent-filter>
</service>`
`QBSettings.getInstance().setEnablePushNotification(false); // By default is true
boolean isEnabled = QBSettings.getInstance().isEnablePushNotification();`
create a subscription for push notification
QBSubscription subscription = new QBSubscription(QBNotificationChannel.GCM); subscription.setEnvironment(QBEnvironment.DEVELOPMENT); // String deviceId = ""; final TelephonyManager mTelephony = (TelephonyManager) BottomActivity.this.getSystemService( Context.TELEPHONY_SERVICE);
deviceId = Settings.Secure.getString(BottomActivity.this.getContentResolver(),
Settings.Secure.ANDROID_ID);
subscription.setDeviceUdid(deviceId);
subscription.setRegistrationID(registrationID);
subscription.setEnvironment(QBEnvironment.DEVELOPMENT);
QBPushNotifications.createSubscription(subscription);
register a receiver for push notification.
LocalBroadcastManager.getInstance(this).registerReceiver(pushBroadcastReceiver, new IntentFilter(Consts.ACTION_NEW_FCM_EVENT));
send push message.
` String outMessage = messageEditText.getText().toString().trim(); QBEvent qbEvent = new QBEvent(); qbEvent.setNotificationType(QBNotificationType.PUSH); qbEvent.setEnvironment(QBEnvironment.DEVELOPMENT);
qbEvent.setMessage(outMessage);
qbEvent.setPushType(QBPushType.GCM);
StringifyArrayList<Integer> userIds = new StringifyArrayList<>();
userIds.add(QBSessionManager.getInstance().getSessionParameters().getUserId());
userIds.add(qbChatDialog.getRecipientId());
Log.d(TAG, "My Id: " + qbChatDialog.getRecipientId());
qbEvent.setUserIds(userIds);
QBPushNotifications.createEvent(qbEvent).performAsync(new QBEntityCallback<QBEvent>() {
@Override
public void onSuccess(QBEvent qbEvent, Bundle bundle) {
}
@Override
public void onError(QBResponseException e) {
KeyboardUtils.hideKeyboard(messageEditText);
invalidateOptionsMenu();
}
});
`
After following all steps in result I am able to successfully send a message. I can see a message in quickblox admin pannel it shows delivered message. subscription is also created. But I do not receive a notification on my other phone. But when I am trying with firebase cloud to send a force message then I am able to receive a message typed on firebase.
can anyone guide what I am missing in this? I am new to quicblox.
It seems that you already can receive the push but your BroadcastReceiver (extended from QBFcmPushListenerService) didn't do anything to show the notification for the user. Please check how you make your receiver. I have an example for you: https://github.com/QuickBlox/quickblox-android-sdk/blob/master/sample-chat-java/app/src/main/java/com/quickblox/sample/chat/java/fcm/PushListenerService.java
Please take a look at this feature:
public class PushListenerService extends QBFcmPushListenerService {
private static final String TAG = PushListenerService.class.getSimpleName();
private static final int NOTIFICATION_ID = 1;
protected void showNotification(String message) {
NotificationUtils.showNotification(App.getInstance(), SplashActivity.class,
App.getInstance().getString(R.string.notification_title), message,
R.drawable.ic_logo_vector, NOTIFICATION_ID);
}
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
super.onMessageReceived(remoteMessage);
}
@Override
protected void sendPushMessage(Map data, String from, String message) {
super.sendPushMessage(data, from, message);
Log.v(TAG, "From: " + from);
Log.v(TAG, "Message: " + message);
if (ActivityLifecycle.getInstance().isBackground()) {
showNotification(message);
}
}
}
And callback "sendPushMessage" there - it is about receiving the Push Message. This is not a sending. It's like sending it to the user :)
Please pay attention for:
if (ActivityLifecycle.getInstance().isBackground()) {
showNotification(message);
}
This part of logic depends on application behavior. If the application is running now and in the foreground - Notification will not be shown. If you remove this condition - all caught pushes will be shown.
P.S. And another suggestion is - Permission for showing notifications by your application was disabled in the system, please check this one if all code above you already implemented.