Получение уведомления, когда приложение находится на переднем плане - (круговая диаграмма 28) - PullRequest
0 голосов
/ 31 декабря 2018

Я новичок в создании приложений для 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))

1 Ответ

0 голосов
/ 31 декабря 2018

@ Cesar Пожалуйста, не могли бы вы скопировать и вставить часть журнала, где произошел сбой?Тогда мы можем посмотреть там, чтобы увидеть точную ошибку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...