Firebase 云消息传递:android 12 后未收到消息
Firebase Cloud Messaging : not receiving message in android 12
我正在尝试使用 Firebase 消息服务向 android 12 设备 发送推送通知。当我尝试从 nodeJs 发送 FCM 时,调用 onMessageReceived not。我尝试从 Firebase 控制台发送 FCM,但即使该应用程序在后台,该应用程序也没有显示任何通知或错误。我已经在 android 11 和 android 10 中测试了这个应用程序,两者都工作正常。
AndroidManifest.xml
<uses-permission android:name="android.permission.INTERNET" />
<application
android:allowBackup="true"
android:icon="@mipmap/icon"
android:label="@string/app_name"
android:roundIcon="@mipmap/icon_round"
android:supportsRtl="true"
android:theme="@style/Theme.MobileSMSService"
android:usesCleartextTraffic="true">
<service
android:name=".helper.MessagingService"
android:exported="false">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT" />
</intent-filter>
<meta-data
android:name="com.google.firebase.messaging.default_notification_icon"
android:resource="@drawable/sms_icon_foreground" />
<meta-data
android:name="com.google.firebase.messaging.default_notification_color"
android:resource="@color/purple_700" />
</service>
</application>
MessagingService.java
public class MessagingService extends FirebaseMessagingService {
private static final String CHANNEL_ID = "FCM";
private static final String TAG = "MessagingService";
whatsappMessageService messageService;
@Override
public void onNewToken(@NonNull String s) {
super.onNewToken(s);
JSONObject obj = new JSONObject();
SharedPreferences sp = getSharedPreferences("Login", MODE_PRIVATE);
String api = sp.getString("api", null);
sp.edit().putString("token", s).apply();
try {
obj.put("token", s);
obj.put("api", api);
new Server().post(new Server().baseUrl + "update-token", obj.toString(), new Callback() {
@Override
public void onFailure(@NonNull Call call, @NonNull IOException e) {
}
@Override
public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {
}
});
} catch (Exception e) {
Log.e("MessagingService", "onNewToken: ", e);
}
}
@Override
public void onMessageReceived(@NonNull RemoteMessage remoteMessage) {
super.onMessageReceived(remoteMessage);
Log.e(TAG, "onMessageReceived: recived" );
Map<String, String> data = remoteMessage.getData();
if (data.get("web") == null) {
String message = data.get("message"), to = data.get("to"), plat = data.get("plat");
if (plat != null) {
if (plat.equals("w")) {
PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
boolean isScreenOn = pm.isScreenOn();
boolean isScreenOnApi21 = pm.isInteractive();
if (!isScreenOn | !isScreenOnApi21) {
SharedPreferences sp = getApplicationContext().getSharedPreferences("Login", MODE_PRIVATE);
if (sp.getString("wake_phone", null) != null) {
sendSMS(sp.getString("wake_phone", null), "Wake up");
new MessagesDatabaseHelper(this).insertMessage(sp.getString("wake_phone", null), "Wake up");
try {
Thread.sleep(3500);
isScreenOn = pm.isScreenOn();
isScreenOnApi21 = pm.isInteractive();
if (!isScreenOn | !isScreenOnApi21) {
Thread.sleep(3500);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
} else {
return;
}
}
if (messageService == null) {
messageService = new whatsappMessageService(getApplicationContext());
messageService.start();
}
messageService.addMessage(to, message);
new WhatsappDatabaseHelper(this).insertMessage(to, message);
} else {
new MessagesDatabaseHelper(this).insertMessage(to, message);
sendSMS(to, message);
}
Intent intents = new Intent();
intents.setAction("sms_receiver");
getBaseContext().sendBroadcast(intents);
}
} else {
Log.e(TAG, "onMessageReceived: " + "web");
new webManager().onMessage(data);
}
}
您好,您的清单文件格式不正确,请检查下面的清单并进行相应调整,同时确保您有 FirebaseMessagingService
<meta-data
android:name="com.google.firebase.messaging.default_notification_icon"
android:resource="@mipmap/ic_launcher" />
<meta-data
android:name="com.google.firebase.messaging.default_notification_color"
android:resource="@color/colorAccent" />
<meta-data
android:name="com.google.firebase.messaging.default_notification_channel_id"
android:value="@string/default_notification_channel_id" />
<service android:name=".service.MyFcmListenerService">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT" />
</intent-filter>
</service>
同时检查您的 build.gradle 并添加以下依赖项左大括号
apply plugin: 'com.google.gms.google-services'
您的 FirebaseMessagingService 应采用以下格式:
public class MyFirebaseMessagingService extends FirebaseMessagingService {
@Override
public void onMessageReceived(RemoteMessage message) {
String from = message.getFrom();
Map data = message.getData();
Log.e("Message", "Could not parse malformed JSON: \"" + data.toString() + "\"");
//generateNotification(getApplicationContext(), data);
}
@Override
public void onNewToken(String token) {
//Log.d(TAG, "Refreshed token: " + token);
// If you want to send messages to this application instance or
// manage this apps subscriptions on the server side, send the
// Instance ID token to your app server.
Toast.makeText(getApplicationContext(),"Token "+token,Toast.LENGTH_LONG).show();
//App.getInstance().setGcmToken(token);
}
@Override
public void onDeletedMessages() {
sendNotification("Deleted messages on server");
}
@Override
public void onMessageSent(String msgId) {
sendNotification("Upstream message sent. Id=" + msgId);
}
// Put the message into a notification and post it.
// This is just one simple example of what you might choose to do with
// a GCM message.
private void sendNotification(String msg) {
Log.e("Message", "Could not parse malformed JSON: \"" + msg + "\"");
}
}
对于可能遇到这个问题的新人,我遇到了完全相同的问题:
就我而言,我仍在使用具有旧的已弃用架构的 Firebase 库 17.x。
现在我将 firebase 依赖更新到版本 23.0.4,它工作得很好。
我正在尝试使用 Firebase 消息服务向 android 12 设备 发送推送通知。当我尝试从 nodeJs 发送 FCM 时,调用 onMessageReceived not。我尝试从 Firebase 控制台发送 FCM,但即使该应用程序在后台,该应用程序也没有显示任何通知或错误。我已经在 android 11 和 android 10 中测试了这个应用程序,两者都工作正常。
AndroidManifest.xml
<uses-permission android:name="android.permission.INTERNET" />
<application
android:allowBackup="true"
android:icon="@mipmap/icon"
android:label="@string/app_name"
android:roundIcon="@mipmap/icon_round"
android:supportsRtl="true"
android:theme="@style/Theme.MobileSMSService"
android:usesCleartextTraffic="true">
<service
android:name=".helper.MessagingService"
android:exported="false">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT" />
</intent-filter>
<meta-data
android:name="com.google.firebase.messaging.default_notification_icon"
android:resource="@drawable/sms_icon_foreground" />
<meta-data
android:name="com.google.firebase.messaging.default_notification_color"
android:resource="@color/purple_700" />
</service>
</application>
MessagingService.java
public class MessagingService extends FirebaseMessagingService {
private static final String CHANNEL_ID = "FCM";
private static final String TAG = "MessagingService";
whatsappMessageService messageService;
@Override
public void onNewToken(@NonNull String s) {
super.onNewToken(s);
JSONObject obj = new JSONObject();
SharedPreferences sp = getSharedPreferences("Login", MODE_PRIVATE);
String api = sp.getString("api", null);
sp.edit().putString("token", s).apply();
try {
obj.put("token", s);
obj.put("api", api);
new Server().post(new Server().baseUrl + "update-token", obj.toString(), new Callback() {
@Override
public void onFailure(@NonNull Call call, @NonNull IOException e) {
}
@Override
public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {
}
});
} catch (Exception e) {
Log.e("MessagingService", "onNewToken: ", e);
}
}
@Override
public void onMessageReceived(@NonNull RemoteMessage remoteMessage) {
super.onMessageReceived(remoteMessage);
Log.e(TAG, "onMessageReceived: recived" );
Map<String, String> data = remoteMessage.getData();
if (data.get("web") == null) {
String message = data.get("message"), to = data.get("to"), plat = data.get("plat");
if (plat != null) {
if (plat.equals("w")) {
PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
boolean isScreenOn = pm.isScreenOn();
boolean isScreenOnApi21 = pm.isInteractive();
if (!isScreenOn | !isScreenOnApi21) {
SharedPreferences sp = getApplicationContext().getSharedPreferences("Login", MODE_PRIVATE);
if (sp.getString("wake_phone", null) != null) {
sendSMS(sp.getString("wake_phone", null), "Wake up");
new MessagesDatabaseHelper(this).insertMessage(sp.getString("wake_phone", null), "Wake up");
try {
Thread.sleep(3500);
isScreenOn = pm.isScreenOn();
isScreenOnApi21 = pm.isInteractive();
if (!isScreenOn | !isScreenOnApi21) {
Thread.sleep(3500);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
} else {
return;
}
}
if (messageService == null) {
messageService = new whatsappMessageService(getApplicationContext());
messageService.start();
}
messageService.addMessage(to, message);
new WhatsappDatabaseHelper(this).insertMessage(to, message);
} else {
new MessagesDatabaseHelper(this).insertMessage(to, message);
sendSMS(to, message);
}
Intent intents = new Intent();
intents.setAction("sms_receiver");
getBaseContext().sendBroadcast(intents);
}
} else {
Log.e(TAG, "onMessageReceived: " + "web");
new webManager().onMessage(data);
}
}
您好,您的清单文件格式不正确,请检查下面的清单并进行相应调整,同时确保您有 FirebaseMessagingService
<meta-data
android:name="com.google.firebase.messaging.default_notification_icon"
android:resource="@mipmap/ic_launcher" />
<meta-data
android:name="com.google.firebase.messaging.default_notification_color"
android:resource="@color/colorAccent" />
<meta-data
android:name="com.google.firebase.messaging.default_notification_channel_id"
android:value="@string/default_notification_channel_id" />
<service android:name=".service.MyFcmListenerService">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT" />
</intent-filter>
</service>
同时检查您的 build.gradle 并添加以下依赖项左大括号
apply plugin: 'com.google.gms.google-services'
您的 FirebaseMessagingService 应采用以下格式:
public class MyFirebaseMessagingService extends FirebaseMessagingService {
@Override
public void onMessageReceived(RemoteMessage message) {
String from = message.getFrom();
Map data = message.getData();
Log.e("Message", "Could not parse malformed JSON: \"" + data.toString() + "\"");
//generateNotification(getApplicationContext(), data);
}
@Override
public void onNewToken(String token) {
//Log.d(TAG, "Refreshed token: " + token);
// If you want to send messages to this application instance or
// manage this apps subscriptions on the server side, send the
// Instance ID token to your app server.
Toast.makeText(getApplicationContext(),"Token "+token,Toast.LENGTH_LONG).show();
//App.getInstance().setGcmToken(token);
}
@Override
public void onDeletedMessages() {
sendNotification("Deleted messages on server");
}
@Override
public void onMessageSent(String msgId) {
sendNotification("Upstream message sent. Id=" + msgId);
}
// Put the message into a notification and post it.
// This is just one simple example of what you might choose to do with
// a GCM message.
private void sendNotification(String msg) {
Log.e("Message", "Could not parse malformed JSON: \"" + msg + "\"");
}
}
对于可能遇到这个问题的新人,我遇到了完全相同的问题:
就我而言,我仍在使用具有旧的已弃用架构的 Firebase 库 17.x。
现在我将 firebase 依赖更新到版本 23.0.4,它工作得很好。