解析一个 Bundle,它是 Remotemessage 中的一个 JSONString 到 JSON 对象
Parse a Bundle which is a JSONString in Remotemessage to JSON object
我正在尝试解析 FCM 中的通知数据。我会尽可能详细地解释我的问题。我有两个应用程序,一个是 android,另一个是 javascript webapp。因此,当从 webapp 向 androd app 发送 pushnotification 时,我将以 jsonstring 格式发送通知数据。现在我无法在 java 端 (android) 将其转换为 JSONObject。下面是我的代码
var notification = {
'TITLE': currentUser.displayName,
'MSG': message,
'CHAT_KEY': chatKey,
'MSG_KEY': 'messageKey',
'USER_DISPLAY_NAME': currentUser.displayName,
'USER_EMAIL': currentUserEmail,
'USER_FCM_DEVICE_ID': toKey,
'USER_FCM_DEVICE_ID_SENDER': fromKey,
};
fetch('https://fcm.googleapis.com/fcm/send', {
'method': 'POST',
'headers': {
'Authorization': 'key=' + fromKey,
'Content-Type': 'application/json'
},
'body': JSON.stringify({
'notification': notification,
'to': toKey
})
}).then(function(response) {
console.log(response);
}).catch(function(error) {
console.error(error);
})
};
在android这边
@Override public void onMessageReceived(RemoteMessage remoteMessage) {
if (remoteMessage.getNotification() != null) {
sendDefaultNotification(remoteMessage.getNotification().getTitle(),
remoteMessage.getNotification().getBody());
} else {
String currentUserEmail = "";
FirebaseAuth auth = FirebaseAuth.getInstance();
if (auth.getCurrentUser() != null && auth.getCurrentUser().getEmail() != null) {
currentUserEmail = auth.getCurrentUser().getEmail();
}
String userName = remoteMessage.getData().get(Constants.KEY_USER_DISPLAY_NAME);
String userEmail = remoteMessage.getData().get(Constants.KEY_USER_EMAIL);
String chatKey = remoteMessage.getData().get(Constants.KEY_CHAT_KEY);
String deviceId = remoteMessage.getData().get(Constants.KEY_USER_FCM_DEVICE_ID);
String deviceIdSender = remoteMessage.getData().get(Constants.KEY_USER_FCM_DEVICE_ID_SENDER);
String title = remoteMessage.getData().get(Constants.KEY_MSG_TITLE);
String msg = remoteMessage.getData().get(Constants.KEY_MSG);
String msgKey = remoteMessage.getData().get(Constants.KEY_MSG_KEY);
/*if (chatKey.equals(ConstantsFirebase.FIREBASE_LOCATION_CHAT_GLOBAL)) {
title = String.format("%s- %s", title, ConstantsFirebase.CHAT_GLOBAL_HELPER);
} else {*/
if (!currentUserEmail.equals(Utils.decodeEmail(userEmail))) {
setMessageReceived(FirebaseDatabase.getInstance().getReference()
.child(ConstantsFirebase.FIREBASE_LOCATION_CHAT).child(chatKey).child(msgKey)
.child(ConstantsFirebase.FIREBASE_PROPERTY_MESSAGE_STATUS));
}
/* }*/
boolean notificationIsActive = PreferenceManager.getDefaultSharedPreferences(this)
.getBoolean(Constants.KEY_PREF_NOTIFICATION, false);
if (auth.getCurrentUser() != null && notificationIsActive) {
if (!currentUserEmail.equals(Utils.decodeEmail(userEmail))) {
Utils.setAdditionalData(new PushNotificationObject
.AdditionalData(title, msg, chatKey, msgKey, userName,
userEmail, deviceId, deviceIdSender));
sendNotification(title, msg);
}
}
}
}
在这里,我将 Remotemessage 直接视为 JSONObject,但它是捆绑在 jsonstring 中的。我该如何解析它?
输出:
Bundle[{gcm.notification.USER_DISPLAY_NAME=ishku sukshi, google.sent_time=1512190657773, gcm.notification.TITLE=ishku sukshi, gcm.notification.USER_FCM_DEVICE_ID=fXLDo7zU7c0:APA91bFx0sIGwIZ9jIm7xi7QvSrWKrL29uWJnNT0jujlyVHTScUteuRZ37nB-FgEeBXokZdQfmyGKhhRLjCILraS8sTif4p6DRJ_jZkNlh-J_yhKTAU3WnBYzGBtlaTorcAJhDtd1AIy, gcm.notification.CHAT_KEY=-L-FVx8eZBuz-QIsnXvx, from=1028795933953, gcm.notification.USER_EMAIL=ishkumihu@gmail,com, google.message_id=0:1512190657780774%bfd1fc79bfd1fc79, gcm.notification.MSG_KEY=messageKey, gcm.notification.MSG=, gcm.notification.USER_FCM_DEVICE_ID_SENDER=AAAA74kEJQE:APA91bHN5lJf0S8KNXzhU4XL1rz1rqyZ6ziY4UghZudtW6iH84ytQksWMSvSKsaBqQEsw7P2txk-yTGp5DOYElb7pdg8VFgj8wecJUcsPKJ6JCASCO_ihXh6xpo3a2aDuw8HnHPvL0Mr, collapse_key=com.sukshi.sukshichat}]
其实gcm.notification追加每个键也不应该来,我不知道为什么会这样。
实际上您是从 RemoteMessage#getData() 方法获取 Map 对象。
所以如果你需要一个 json 对象,你可以像下面那样自己创建它
JSONObject json = new JSONObject();
//data is RemoteMessage#getData();
Set<String> keys = data.keySet();
for (String key : keys) {
try {
json.put(key, JSONObject.wrap(data.get(key)));
} catch(JSONException e) {
//Handle exception here
}
}
尝试从 json 的字符串表示形式制作 JSONObject
。在服务器端代码上将 notification
更改为 data
。喜欢 -
fetch('https://fcm.googleapis.com/fcm/send', {
'method': 'POST',
'headers': {
'Authorization': 'key=' + fromKey,
'Content-Type': 'application/json'
},
'body': JSON.stringify({
'data': notification,
'to': toKey
})
}).then(function(response) {
console.log(response);
}).catch(function(error) {
console.error(error);
})
};
并在 Android 端获取您的 fcm 消息 -
String body = remoteMessage.getData();
JSONObject json = new JSONObject(body );
Log.d("json", json.toString());
然后你可以通过从javascript分配的键获取值。喜欢 - json.get("USER_DISPLAY_NAME");
让我知道进展如何。
我正在尝试解析 FCM 中的通知数据。我会尽可能详细地解释我的问题。我有两个应用程序,一个是 android,另一个是 javascript webapp。因此,当从 webapp 向 androd app 发送 pushnotification 时,我将以 jsonstring 格式发送通知数据。现在我无法在 java 端 (android) 将其转换为 JSONObject。下面是我的代码
var notification = {
'TITLE': currentUser.displayName,
'MSG': message,
'CHAT_KEY': chatKey,
'MSG_KEY': 'messageKey',
'USER_DISPLAY_NAME': currentUser.displayName,
'USER_EMAIL': currentUserEmail,
'USER_FCM_DEVICE_ID': toKey,
'USER_FCM_DEVICE_ID_SENDER': fromKey,
};
fetch('https://fcm.googleapis.com/fcm/send', {
'method': 'POST',
'headers': {
'Authorization': 'key=' + fromKey,
'Content-Type': 'application/json'
},
'body': JSON.stringify({
'notification': notification,
'to': toKey
})
}).then(function(response) {
console.log(response);
}).catch(function(error) {
console.error(error);
})
};
在android这边
@Override public void onMessageReceived(RemoteMessage remoteMessage) {
if (remoteMessage.getNotification() != null) {
sendDefaultNotification(remoteMessage.getNotification().getTitle(),
remoteMessage.getNotification().getBody());
} else {
String currentUserEmail = "";
FirebaseAuth auth = FirebaseAuth.getInstance();
if (auth.getCurrentUser() != null && auth.getCurrentUser().getEmail() != null) {
currentUserEmail = auth.getCurrentUser().getEmail();
}
String userName = remoteMessage.getData().get(Constants.KEY_USER_DISPLAY_NAME);
String userEmail = remoteMessage.getData().get(Constants.KEY_USER_EMAIL);
String chatKey = remoteMessage.getData().get(Constants.KEY_CHAT_KEY);
String deviceId = remoteMessage.getData().get(Constants.KEY_USER_FCM_DEVICE_ID);
String deviceIdSender = remoteMessage.getData().get(Constants.KEY_USER_FCM_DEVICE_ID_SENDER);
String title = remoteMessage.getData().get(Constants.KEY_MSG_TITLE);
String msg = remoteMessage.getData().get(Constants.KEY_MSG);
String msgKey = remoteMessage.getData().get(Constants.KEY_MSG_KEY);
/*if (chatKey.equals(ConstantsFirebase.FIREBASE_LOCATION_CHAT_GLOBAL)) {
title = String.format("%s- %s", title, ConstantsFirebase.CHAT_GLOBAL_HELPER);
} else {*/
if (!currentUserEmail.equals(Utils.decodeEmail(userEmail))) {
setMessageReceived(FirebaseDatabase.getInstance().getReference()
.child(ConstantsFirebase.FIREBASE_LOCATION_CHAT).child(chatKey).child(msgKey)
.child(ConstantsFirebase.FIREBASE_PROPERTY_MESSAGE_STATUS));
}
/* }*/
boolean notificationIsActive = PreferenceManager.getDefaultSharedPreferences(this)
.getBoolean(Constants.KEY_PREF_NOTIFICATION, false);
if (auth.getCurrentUser() != null && notificationIsActive) {
if (!currentUserEmail.equals(Utils.decodeEmail(userEmail))) {
Utils.setAdditionalData(new PushNotificationObject
.AdditionalData(title, msg, chatKey, msgKey, userName,
userEmail, deviceId, deviceIdSender));
sendNotification(title, msg);
}
}
}
}
在这里,我将 Remotemessage 直接视为 JSONObject,但它是捆绑在 jsonstring 中的。我该如何解析它?
输出:
Bundle[{gcm.notification.USER_DISPLAY_NAME=ishku sukshi, google.sent_time=1512190657773, gcm.notification.TITLE=ishku sukshi, gcm.notification.USER_FCM_DEVICE_ID=fXLDo7zU7c0:APA91bFx0sIGwIZ9jIm7xi7QvSrWKrL29uWJnNT0jujlyVHTScUteuRZ37nB-FgEeBXokZdQfmyGKhhRLjCILraS8sTif4p6DRJ_jZkNlh-J_yhKTAU3WnBYzGBtlaTorcAJhDtd1AIy, gcm.notification.CHAT_KEY=-L-FVx8eZBuz-QIsnXvx, from=1028795933953, gcm.notification.USER_EMAIL=ishkumihu@gmail,com, google.message_id=0:1512190657780774%bfd1fc79bfd1fc79, gcm.notification.MSG_KEY=messageKey, gcm.notification.MSG=, gcm.notification.USER_FCM_DEVICE_ID_SENDER=AAAA74kEJQE:APA91bHN5lJf0S8KNXzhU4XL1rz1rqyZ6ziY4UghZudtW6iH84ytQksWMSvSKsaBqQEsw7P2txk-yTGp5DOYElb7pdg8VFgj8wecJUcsPKJ6JCASCO_ihXh6xpo3a2aDuw8HnHPvL0Mr, collapse_key=com.sukshi.sukshichat}]
其实gcm.notification追加每个键也不应该来,我不知道为什么会这样。
实际上您是从 RemoteMessage#getData() 方法获取 Map 对象。 所以如果你需要一个 json 对象,你可以像下面那样自己创建它
JSONObject json = new JSONObject();
//data is RemoteMessage#getData();
Set<String> keys = data.keySet();
for (String key : keys) {
try {
json.put(key, JSONObject.wrap(data.get(key)));
} catch(JSONException e) {
//Handle exception here
}
}
尝试从 json 的字符串表示形式制作 JSONObject
。在服务器端代码上将 notification
更改为 data
。喜欢 -
fetch('https://fcm.googleapis.com/fcm/send', {
'method': 'POST',
'headers': {
'Authorization': 'key=' + fromKey,
'Content-Type': 'application/json'
},
'body': JSON.stringify({
'data': notification,
'to': toKey
})
}).then(function(response) {
console.log(response);
}).catch(function(error) {
console.error(error);
})
};
并在 Android 端获取您的 fcm 消息 -
String body = remoteMessage.getData();
JSONObject json = new JSONObject(body );
Log.d("json", json.toString());
然后你可以通过从javascript分配的键获取值。喜欢 - json.get("USER_DISPLAY_NAME");
让我知道进展如何。