我正在尝试构建一个可以在数据库中更改某个值时接收通知的应用。云功能'部分代码正在正确执行但我的应用程序未收到通知。可能是什么问题呢?我已附上以下代码,请帮帮我!
MyFirebaseInstanceIdService:
public class MyFirebaseInstanceIdService extends FirebaseInstanceIdService {
private static final String TAG = "MyFirebaseIIDService";
/**
* Called if InstanceID token is updated. This may occur if the security of
* the previous token had been compromised. Note that this is called when the InstanceID token
* is initially generated so this is where you would retrieve the token.
*/
@Override
public void onTokenRefresh() {
// Get updated InstanceID token.
String refreshedToken = FirebaseInstanceId.getInstance().getToken();
sendRegistrationToServer(refreshedToken);
}
/**
* Persist token to third-party servers.
*
* Modify this method to associate the user's FCM InstanceID token with any server-side account
* maintained by your application.
*
* @param token The new token.
*/
private void sendRegistrationToServer(String token) {
DatabaseReference reference = FirebaseDatabase.getInstance().getReference();
reference
.child(FirebaseAuth.getInstance().getCurrentUser().getUid())
.setValue(token);
}
}
MyFirebaseMessagingService:
public class MyFirebaseMessagingService extends FirebaseMessagingService {
private static final String TAG = "MyFirebaseMsgService";
private static final int BROADCAST_NOTIFICATION_ID = 1;
@Override
public void onDeletedMessages() {
super.onDeletedMessages();
}
/**
* Called when message is received.
*
* @param remoteMessage Object representing the message received from Firebase Cloud Messaging.
*/
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
String notificationBody = "";
String notificationTitle = "";
String notificationData = "";
try{
notificationData = remoteMessage.getData().toString();
notificationTitle = remoteMessage.getNotification().getTitle();
notificationBody = remoteMessage.getNotification().getBody();
}catch (NullPointerException e){
}
String dataType = remoteMessage.getData().get("direct_message");
if(dataType.equals("direct_message")){
String title = remoteMessage.getData().get("title");
String message = remoteMessage.getData().get("message");
sendMessageNotification(title, message);
}
}
/**
* Build a push notification for a chat message
* @param title
* @param message
*/
private void sendMessageNotification(String title, String message){
//get the notification id
int notificationId = (int) System.currentTimeMillis();
// Instantiate a Builder object.
NotificationCompat.Builder builder = new NotificationCompat.Builder(this, "default");
// Creates an Intent for the Activity
Intent pendingIntent = new Intent(this, ChatActivity.class);
// Sets the Activity to start in a new, empty task
pendingIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
// Creates the PendingIntent
PendingIntent notifyPendingIntent =
PendingIntent.getActivity(
this,
0,
pendingIntent,
PendingIntent.FLAG_UPDATE_CURRENT
);
//add properties to the builder
builder.setSmallIcon(R.drawable.ic_notif)
.setLargeIcon(BitmapFactory.decodeResource(getApplicationContext().getResources(),
R.drawable.ic_notif))
.setSound(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION))
.setContentTitle(title)
.setAutoCancel(true)
//.setSubText(message)
.setStyle(new NotificationCompat.BigTextStyle().bigText(message))
.setOnlyAlertOnce(true);
builder.setContentIntent(notifyPendingIntent);
NotificationManager mNotificationManager =
(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
mNotificationManager.notify(notificationId, builder.build());
}
}
我的Firebase功能代码:
exports.rentPaid = functions.database.ref('/Rent_Paid_Status/{UserID}/status').onWrite((change, context) => {
const current_status = change.after.val();
const User_ID = context.params.UserID;
// if(current_status.toString().trim() === "yes")
//{
const token_ref = admin.database().ref('/Tokens/User_ID');
token_ref.once("value", function(data){
//construct single value event listener.
const token = data.val();
console.log("token: ", token);
//we have everythin g we need
//Build the message payload and send the message
console.log("Construction the notification message.");
const payload = {
data: {
data_type: "direct_message",
title: "Rent Paid",
message: "Thank you for paying your rent!",
}
};
return admin.messaging().sendToDevice(token, payload)
.then(function(response) {
console.log("Successfully sent message:", response);
})
.catch(function(error) {
console.log("Error sending message:", error);
});
//send notif saying 'thank you for paying your rent!'
});
}
return null;
})
我的清单文件:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="vision.google.com.gudutenantapp">
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".Login.MainActivity">
</activity>
<service
android:name=".Chat.MyFirebaseInstanceIdService">
<intent-filter>
<action android:name="com.google.firebase.INSTANCE_ID_EVENT"/>
</intent-filter>
</service>
<service
android:name=".Chat.MyFirebaseMessagingService">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT"/>
</intent-filter>
</service>
<activity android:name=".Chat.ChatActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".TenantSettingsActivity" />
<activity android:name=".Login.Information_Activity" />
<activity android:name="com.theartofdev.edmodo.cropper.CropImageActivity"
android:theme="@style/Base.Theme.AppCompat"/>
</application>
答案 0 :(得分:1)
当您收到消息dataType
时,属性键错误:
改变这个:
String dataType = remoteMessage.getData().get("direct_message");
应该是:
String dataType = remoteMessage.getData().get("data_type");