android 中的 quickblox 推送通知集成
quickblox push notification integration in android
我正在我的应用程序中集成 quickblox。我已经成功地集成了聊天功能并且运行良好。但是推送通知功能不起作用。我已按照以下步骤整合推送通知。
在 Firebase 上创建一个项目。实现云消息并在主项目中集成googleJSON。
登录 quickblox 帐户在推送通知中添加 google 服务器密钥。
遵循 https://docs.quickblox.com/docs/android-push-notifications 文档,在添加 firebase cloude 消息后,我在 menifest 文件中添加以下内容。
<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" />
并在清单中注册以下服务
`<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>`
- 我添加了自动推送通知并在 chatActivity 中的代码下方实现了它
`QBSettings.getInstance().setEnablePushNotification(false);
// 默认为 true
boolean isEnabled = QBSettings.getInstance().isEnablePushNotification();`
创建推送通知订阅
QBSubscription 订阅 = 新 QBSubscription(QBNotificationChannel.GCM);
subscription.setEnvironment(QBEnvironment.DEVELOPMENT);
//
字符串 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);
为推送通知注册接收者。
LocalBroadcastManager.getInstance(this).registerReceiver(pushBroadcastReceiver, new IntentFilter(Consts.ACTION_NEW_FCM_EVENT));
发送推送消息。
` 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();
}
});
`
按照结果中的所有步骤操作后,我能够成功发送消息。我可以在 quickblox 管理面板中看到一条消息,它显示已发送的消息。订阅也被创建。但是我没有收到关于我的另一个 phone 的通知。但是当我尝试使用 firebase 云发送强制消息时,我能够收到在 firebase 上键入的消息。
任何人都可以指导我在这方面缺少什么吗?我是 quicblox 的新手。
您似乎已经可以收到推送,但是您的 BroadcastReceiver(从 QBFcmPushListenerService 扩展)没有做任何事情来向用户显示通知。请检查您是如何制作接收器的。我有一个例子给你:https://github.com/QuickBlox/quickblox-android-sdk/blob/master/sample-chat-java/app/src/main/java/com/quickblox/sample/chat/java/fcm/PushListenerService.java
请看一下这个功能:
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);
}
}
}
还有回调“sendPushMessage”——它是关于接收推送消息的。这不是发送。这就像将它发送给用户:)
请关注:
if (ActivityLifecycle.getInstance().isBackground()) {
showNotification(message);
}
这部分逻辑取决于应用程序行为。如果应用程序现在 运行 并且在前台 - 将不会显示通知。如果您删除此条件 - 将显示所有捕获的推送。
P.S。另一个建议是 - 系统禁用了您的应用程序显示通知的权限,如果上面的所有代码都已经实现,请检查这个。
我正在我的应用程序中集成 quickblox。我已经成功地集成了聊天功能并且运行良好。但是推送通知功能不起作用。我已按照以下步骤整合推送通知。
在 Firebase 上创建一个项目。实现云消息并在主项目中集成googleJSON。
登录 quickblox 帐户在推送通知中添加 google 服务器密钥。
遵循 https://docs.quickblox.com/docs/android-push-notifications 文档,在添加 firebase cloude 消息后,我在 menifest 文件中添加以下内容。
<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" />
并在清单中注册以下服务
`<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>`
- 我添加了自动推送通知并在 chatActivity 中的代码下方实现了它
`QBSettings.getInstance().setEnablePushNotification(false); // 默认为 true
boolean isEnabled = QBSettings.getInstance().isEnablePushNotification();`
创建推送通知订阅
QBSubscription 订阅 = 新 QBSubscription(QBNotificationChannel.GCM); subscription.setEnvironment(QBEnvironment.DEVELOPMENT); // 字符串 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);
为推送通知注册接收者。
LocalBroadcastManager.getInstance(this).registerReceiver(pushBroadcastReceiver, new IntentFilter(Consts.ACTION_NEW_FCM_EVENT));
发送推送消息。
` 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(); } });
`
按照结果中的所有步骤操作后,我能够成功发送消息。我可以在 quickblox 管理面板中看到一条消息,它显示已发送的消息。订阅也被创建。但是我没有收到关于我的另一个 phone 的通知。但是当我尝试使用 firebase 云发送强制消息时,我能够收到在 firebase 上键入的消息。
任何人都可以指导我在这方面缺少什么吗?我是 quicblox 的新手。
您似乎已经可以收到推送,但是您的 BroadcastReceiver(从 QBFcmPushListenerService 扩展)没有做任何事情来向用户显示通知。请检查您是如何制作接收器的。我有一个例子给你:https://github.com/QuickBlox/quickblox-android-sdk/blob/master/sample-chat-java/app/src/main/java/com/quickblox/sample/chat/java/fcm/PushListenerService.java
请看一下这个功能:
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);
}
}
}
还有回调“sendPushMessage”——它是关于接收推送消息的。这不是发送。这就像将它发送给用户:)
请关注:
if (ActivityLifecycle.getInstance().isBackground()) {
showNotification(message);
}
这部分逻辑取决于应用程序行为。如果应用程序现在 运行 并且在前台 - 将不会显示通知。如果您删除此条件 - 将显示所有捕获的推送。
P.S。另一个建议是 - 系统禁用了您的应用程序显示通知的权限,如果上面的所有代码都已经实现,请检查这个。