Я новичок в создании приложений для Android, поэтому, пожалуйста, извините за глупость.
Я получаю уведомления в свое приложение, когда оно находится в фоновом режиме, но не в то время, когда оно находится на переднем плане, о котором я пытаюсь получить уведомлениедля обоих.
Что происходит сейчас, так это то, что когда я получаю уведомление для своего приложения, когда оно находится на переднем плане, оно вылетает из приложения.
Я понимаю, как Android обрабатывает эти 2 события по-разному, когдаони находятся в этих двух разных состояниях, поэтому я должен изменить свой onMessageReceived
для обработки этих данных.Вот что у меня есть
MyFirebaseMessagingService.java
public class MyFirebaseMessagingService extends FirebaseMessagingService {
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
super.onMessageReceived(remoteMessage);
Log.d("msg", "onMessageReceived: " + remoteMessage.getData().get("message"));
Intent intent = new Intent(this, MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_ONE_SHOT);
String channelId = "Default";
NotificationCompat.Builder builder = new NotificationCompat.Builder(this, channelId)
.setSmallIcon(R.mipmap.ic_launcher)
.setSound(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION))
.setContentTitle(remoteMessage.getNotification().getTitle()).setAutoCancel(true).setContentIntent(pendingIntent)
.setContentText(remoteMessage.getNotification().getBody()).setAutoCancel(true).setContentIntent(pendingIntent);
NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
NotificationChannel channel = new NotificationChannel(channelId, "Default channel", NotificationManager.IMPORTANCE_DEFAULT);
manager.createNotificationChannel(channel);
}
manager.notify(0, builder.build());
}
}
Дополнительный вопрос: я не уверен, верна ли эта часть моего кода manager.notify(0, builder.build());
Этонасколько я понимаю, 0
- это какой-то CHANNEL_ID, поэтому я не уверен, является ли 0
правильным значением для использования.
AndroidManifest.xml
<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=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<service
android:name=".MyFirebaseMessagingService"
android:stopWithTask="false">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT" />
</intent-filter>
</service>
</application>
Это также мое понимание, чтобы заставить onMessageReceived
обрабатывать send
, который мне не нужно использовать notification
, и вместо этого использовать data
.Поэтому я отправляю свои данные вот так с php.
$notification = [
'title' => $title,
'body' => $message,
//'icon' =>'myIcon',
'vibrate' => 1,
'sound' => 'default'
];
$fcmNotification = [
'registration_ids' => $token,
'data' => $notification
];
json_encode($fcmNotification));
Logcat
2018-12-31 12:36:26.416 22775-22850/com.domainname.main.domainname D/msg: onMessageReceived: null
2018-12-31 12:36:26.419 22775-22850/com.domainname.main.domainname E/AndroidRuntime: FATAL EXCEPTION: Firebase-MyFirebaseMessagingService
Process: com.domainname.main.domainname, PID: 22775
java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String com.google.firebase.messaging.RemoteMessage$Notification.getBody()' on a null object reference
at com.domainname.main.domainname.MyFirebaseMessagingService.onMessageReceived(MyFirebaseMessagingService.java:31)
at com.google.firebase.messaging.FirebaseMessagingService.zzd(Unknown Source)
at com.google.firebase.iid.zzc.run(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
at com.google.android.gms.common.util.concurrent.zza.run(Unknown Source)
at java.lang.Thread.run(Thread.java:762)
Так что на данный момент я не уверен, что проблема заключается в том, как яотправляю данные или мой код в мой MyFirebaseMessagingService.java
.Есть идеи?
ОБНОВЛЕНО ОБНОВЛЕНИЕ
Хорошо, я понял это, и это было в основном, как я отправлял данные.Мне пришлось изменить свой php на этот
$notification = [
'title' => $title,
'body' => $message,
//'icon' =>'myIcon',
'vibrate' => 1,
'sound' => 'default'
];
$extraNotificationData = [
'title' => $title,
'body' => $message,
//'icon' =>'myIcon',
'vibrate' => 1,
'sound' => 'default'
];
$fcmNotification = [
'registration_ids' => $token, //single token
'notification' => $notification,
'data' => $extraNotificationData
];
Для тех из вас, кто не может понять, как воспроизводить звук по умолчанию для уведомления при использовании onMessageReceived
при отправке data
, вы можете добавить этона ваше расширение FirebaseMessagingService (у меня было MyFirebaseMessagingService.java
) .setSound(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION))