我正在构建一个将接收推送通知的 Android 应用.我已经设置了 Firebase Cloud Messaging 并且几乎可以正常工作,这样我就可以将以下有效负载发送到有效令牌并接收通知和数据.
I'm building an Android app which will receive push notifications. I've got Firebase Cloud Messaging setup and pretty much working, such that I can send the following payload to a valid token and the notification and data are received.
使用网址fcm.googleapis/fcm/send
{ "to":"<valid-token>", "notification":{"body":"BODY TEXT","title":"TITLE TEXT","sound":"default"}, "data":{"message":"This is some data"} }我的应用程序正确接收并可以处理它.
My app receives it correctly and can deal with it.
唯一的小问题是我在调试中抛出了以下异常:
The only slight wrinkle is that I get the following exception thrown in the debug:
Error while parsing timestamp in GCM event java.lang.NumberFormatException: Invalid int: "null" at java.lang.Integer.invalidInt(Integer.java:138) ...它不会使应用程序崩溃,只是看起来不整洁.
It doesn't crash the app, it just looks untidy.
我尝试将 timestamp 项添加到主要有效负载、通知、数据中,还尝试了诸如 time 之类的变体,但似乎无法获得摆脱异常(和谷歌一样,我找不到答案).
I've tried adding a timestamp item to the main payload, the notification, the data, and also tried variations such as time but can't seem to get rid of the exception (and google as I might, I can't find an answer).
如何传递时间戳以使其停止抱怨?
How do I pass the timestamp so it stops complaining?
已这是我的 onMessageReceived 方法,但我认为异常在到达此处之前已引发
Edited: Here is my onMessageReceived method, but I think the exception is thrown before it gets here
@Override public void onMessageReceived(RemoteMessage remoteMessage) { Log.d(TAG, "From: " + remoteMessage.getFrom()); // Check if message contains a data payload. if (remoteMessage.getData().size() > 0) { Log.d(TAG, "Message data payload: " + remoteMessage.getData()); //TODO Handle the data } // Check if message contains a notification payload. if (remoteMessage.getNotification() != null) { Log.d(TAG, "Message Notification Body: " + remoteMessage.getNotification().getBody()); } }提前致谢,克里斯
推荐答案尽管 notification 显然是受支持的元素(根据 Firebase 网络文档),但我可以摆脱例外是完全删除它,只使用 data 部分,然后在我的应用程序中创建一个通知(而不是让 firebase 做通知).
Even though notification is apparently a supported element (according to the Firebase web docs), the only way I could get rid of the exception was to remove it entirely, and use the data section only, and then in my app create a notification (rather than letting firebase do the notification).
我使用这个网站来研究如何发出通知:www.androidhive.info/2012/10/android-push-notifications-using-google-cloud-messaging-gcm-php-and-mysql/
I used this site to work out how to raise the notifications: www.androidhive.info/2012/10/android-push-notifications-using-google-cloud-messaging-gcm-php-and-mysql/
我的通知现在如下所示:
My notification now looks like the following:
$fields = array("to" => "<valid-token>", "data" => array("data"=> array( "message"=>"This is some data", "title"=>"This is the title", "is_background"=>false, "payload"=>array("my-data-item"=>"my-data-value"), "timestamp"=>date('Y-m-d G:i:s') ) ) ); ... <curl stuff here> ... curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($fields));我的 onMessageReceived 看起来像这样:
My onMessageReceived looks like this:
@Override public void onMessageReceived(RemoteMessage remoteMessage) { Log.d(TAG, "From: " + remoteMessage.getFrom()); // Check if message contains a data payload. if (remoteMessage.getData().size() > 0) { Log.e(TAG, "Data Payload: " + remoteMessage.getData().toString()); try { JSONObject json = new JSONObject(remoteMessage.getData().toString()); handleDataMessage(json); } catch (Exception e) { Log.e(TAG, "Exception: " + e.getMessage()); } } }调用 handleDataMessage 如下所示:
private void handleDataMessage(JSONObject json) { Log.e(TAG, "push json: " + json.toString()); try { JSONObject data = json.getJSONObject("data"); String title = data.getString("title"); String message = data.getString("message"); boolean isBackground = data.getBoolean("is_background"); String timestamp = data.getString("timestamp"); JSONObject payload = data.getJSONObject("payload"); // play notification sound NotificationUtils notificationUtils = new NotificationUtils(getApplicationContext()); notificationUtils.playNotificationSound(); if (!NotificationUtils.isBackgroundRunning(getApplicationContext())) { // app is in foreground, broadcast the push message Intent pushNotification = new Intent(ntcAppManager.PUSH_NOTIFICATION); pushNotification.putExtra("message", message); LocalBroadcastManager.getInstance(this).sendBroadcast(pushNotification); } else { // app is in background, show the notification in notification tray Intent resultIntent = new Intent(getApplicationContext(), MainActivity.class); resultIntent.putExtra("message", message); showNotificationMessage(getApplicationContext(), title, message, timestamp, resultIntent); } } catch (JSONException e) { Log.e(TAG, "Json Exception: " + e.getMessage()); } catch (Exception e) { Log.e(TAG, "Exception: " + e.getMessage()); } }然后调用 showNotificationMessage
/** * Showing notification with text only */ private void showNotificationMessage(Context context, String title, String message, String timeStamp, Intent intent) { notificationUtils = new NotificationUtils(context); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); notificationUtils.showNotificationMessage(title, message, timeStamp, intent); }随后notificationUtils.showNotificationMessage
public void showNotificationMessage(String title, String message, String timeStamp, Intent intent) { showNotificationMessage(title, message, timeStamp, intent, null); } public void showNotificationMessage(final String title, final String message, final String timeStamp, Intent intent, String imageUrl) { // Check for empty push message if (TextUtils.isEmpty(message)) return; // notification icon final int icon = R.mipmap.ic_launcher; intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); final PendingIntent resultPendingIntent = PendingIntent.getActivity( mContext, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT ); final NotificationCompat.Builder mBuilder = new NotificationCompat.Builder( mContext); final Uri alarmSound = Uri.parse(ContentResolver.SCHEME_ANDROID_RESOURCE + "://" + mContext.getPackageName() + "/raw/notification"); showSmallNotification(mBuilder, icon, title, message, timeStamp, resultPendingIntent, alarmSound); playNotificationSound(); } private void showSmallNotification(NotificationCompat.Builder mBuilder, int icon, String title, String message, String timeStamp, PendingIntent resultPendingIntent, Uri alarmSound) { NotificationCompat.InboxStyle inboxStyle = new NotificationCompat.InboxStyle(); inboxStyle.addLine(message); Notification notification; notification = mBuilder.setSmallIcon(icon).setTicker(title).setWhen(0) .setAutoCancel(true) .setContentTitle(title) .setContentIntent(resultPendingIntent) .setSound(alarmSound) .setStyle(inboxStyle) .setWhen(getTimeMilliSec(timeStamp)) .setSmallIcon(R.mipmap.ic_launcher) .setLargeIcon(BitmapFactory.decodeResource(mContext.getResources(), icon)) .setContentText(message) .build(); NotificationManager notificationManager = (NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE); notificationManager.notify(ntcAppManager.NOTIFICATION_ID, notification); }更多细节在上面的链接中,处理很多,但至少异常消失了,我可以控制通知.
More detail in the link above, and it's a lot of handling but at least the exception's gone and I'm in control of the notifications.
更多推荐
Android/Firebase
发布评论