Android/Firebase

编程入门 行业动态 更新时间:2024-10-11 15:24:47
本文介绍了Android/Firebase - 在 GCM 事件中解析时间戳时出错 - 时间戳为空的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

我正在构建一个将接收推送通知的 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

本文发布于:2023-10-26 17:50:33,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1530895.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:Android   Firebase

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!