Firebase push-уведомление, тост-сообщение, фатальное исключение - PullRequest
0 голосов
/ 28 июня 2018

Я получаю странный отчет о сбое от Crashlytics, в котором говорится, что мое приложение упало из-за сообщения Toast, не вызванного из UI thread. Это странно, потому что я не показываю тостовые сообщения из push-уведомлений. Похоже, что он работает для тысяч разных пользователей, но для этого происходит сбой. Я не знаю, что происходит. Ниже приведен отчет:

Fatal Exception: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
       at android.os.Handler.(Handler.java:209)
       at android.os.Handler.(Handler.java:123)
       at android.widget.Toast$TN.(Toast.java:350)
       at android.widget.Toast.(Toast.java:106)
       at android.widget.Toast.makeText(Toast.java:264)
       at android.media.RingtoneManager.isRingtoneExist(RingtoneManager.java:1195)
       at android.app.NotificationManager.notify(NotificationManager.java:235)
       at com.google.firebase.messaging.zza.zzt(Unknown Source)
       at com.google.firebase.messaging.FirebaseMessagingService.handleIntent(Unknown Source)
       at com.google.firebase.iid.zzc.run(Unknown Source)
       at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
       at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
       at java.lang.Thread.run(Thread.java:818)

зависимости приложения:

implementation 'com.google.firebase:firebase-core:12.0.1'
implementation 'com.google.firebase:firebase-messaging:12.0.1'

Устройство : Android 6.0 - Alcatel Shine Lite 5080X

Служба поддержки пожарной базы:

public class FirebasePushService extends FirebaseMessagingService {

    @Override
    public void onMessageReceived(RemoteMessage remoteMessage) {
        Log.d(App.NAME, "message received");

        Map<String, String> map = remoteMessage.getData();
        JSONObject json = new JSONObject();

        for (Map.Entry<String, String> entry : map.entrySet()) {
            String key = entry.getKey();
            String value = entry.getValue();

            json.put(key, value);
        }

        int pushType = json.getInt("push_type", -1);

        if (pushType > 0) {
            Intent intent = new Intent(getApplicationContext(), MainActivity.class);
            PendingIntent pi = PendingIntent.getActivity(this, 100, intent, PendingIntent.FLAG_ONE_SHOT);

            createNotification();
        }
    }

    private void createNotification() {
        // create the channel first
        createChannels();

        Uri defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);

        NotificationCompat.Build b = new NotificationCompat.Builder(context, CHANNEL_ID)
                .setAutoCancel(true)
                .setDefaults(Notification.DEFAULT_ALL)
                .setSound(defaultSoundUri)
                .setColor(ContextCompat.getColor(context, R.color.primaryColor));

        b.setContentIntent(pi);
        b.setAutoCancel(true);
        Notification not = b.build();

        not.flags |= Notification.FLAG_AUTO_CANCEL;

        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
            not.ledARGB = Color.GREEN;
            not.flags = Notification.FLAG_SHOW_LIGHTS;
            not.ledOnMS = 1000;
            not.ledOffMS = 1000;
            not.defaults |= Notification.DEFAULT_VIBRATE;
            not.defaults |= Notification.DEFAULT_SOUND;
        }

        NotificationManager nm = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
        nm.notify(PUSH_NOTIFICATION_ID, not);
    }

    @TargetApi(Build.VERSION_CODES.O)
    private void createChannels() {

        // create android channel
        NotificationChannel androidChannel = new NotificationChannel(CHANNEL_ID, CHANNEL_NAME, NotificationManager.IMPORTANCE_DEFAULT);
        // Sets whether notifications posted to this channel should display notification lights
        androidChannel.enableLights(true);
        // Sets whether notification posted to this channel should vibrate.
        androidChannel.enableVibration(true);
        // Sets the notification light color for notifications posted to this channel
        androidChannel.setLightColor(Color.GREEN);
        // Sets whether notifications posted to this channel appear on the lockscreen or not
        androidChannel.setLockscreenVisibility(Notification.VISIBILITY_PRIVATE);

        getManager().createNotificationChannel(androidChannel);
    }
}

Кто-нибудь знает, что происходит?

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