Подтвердить что ты не робот

Не удалось развернуть RemoteViews - Неправильное уведомление

В последнее время я получаю все больше и больше сообщений о том, что пользователи получают ошибку RemoteServiceException. Трассировка стека, которую я даю каждый раз, выглядит следующим образом:

android.app.RemoteServiceException: Bad notification posted from package com.smithyproductions.fasttracks: Couldn't expand RemoteViews for: StatusBarNotification(pkg=com.smithyproductions.fasttracks id=311095 tag=null score=0 notn=Notification(pri=0 contentView=com.smithyproductions.fasttracks/0x7f03007d vibrate=null sound=null defaults=0x0 flags=0x62 kind=[null]) user=UserHandle{0})
   at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1523)
   at android.os.Handler.dispatchMessage(Handler.java:99)
   at android.os.Looper.loop(Looper.java:153)
   at android.app.ActivityThread.main(ActivityThread.java:5341)
   at java.lang.reflect.Method.invokeNative(Method.java)
   at java.lang.reflect.Method.invoke(Method.java:511)
   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:929)
   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:696)
   at dalvik.system.NativeStart.main(NativeStart.java)

Я никогда не могу воспроизвести проблему самостоятельно на HTC Sensation или HTC One X, что заставляет меня думать, что это может быть специфично для устройства. Я получил сообщения об этой ошибке со следующих устройств:

  • Huawei G610 U15
  • bq Aquaris 5 HD
  • Лестница Enspert
  • JYT JY-G5

... и все они работают под управлением Android 4.2.1 - может быть, есть ошибка с этой версией Android?

Я просмотрел интернет и StackOverflow для людей с аналогичными проблемами, и хотя в этой проблеме много людей, причина которых в том, что он не работал должным образом, из-за неправильных идентификаторов ресурсов или использования неподдерживаемых Просмотры в RemoteViews. Я не понимаю, как это может быть что-то, что я делаю неправильно, если оно работает на 98% устройств, но я не хочу говорить этим людям, что я ничего не могу с этим поделать.

С точки зрения способа создания уведомления я использую класс NotificationCompat.Builder вместе с настраиваемым RemoteViews - по существу, это уведомление о музыкальном проигрывателе, поэтому на нем есть и ImageButtons.

Здесь мой код, где я настраиваю уведомление:

PendingIntent pi = PendingIntent.getActivity(
                getApplicationContext(), 0, new Intent(getApplicationContext(), Showcase.class),
                PendingIntent.FLAG_UPDATE_CURRENT);

RemoteViews smallContentView = new RemoteViews(getPackageName(),
                R.layout.notif_layout);

nowPlayingNotification = new NotificationCompat.Builder(this)
                .setSmallIcon(R.drawable.notification_icon)
                .setContentTitle(
                        "Playing: "
                                + playbackManager.getCurrentTrack()
                                        .getName()).setContentIntent(pi)
                .setOngoing(true)
                .setWhen(System.currentTimeMillis())
                .setContent(smallContentView).build();

а затем я установил все обратные вызовы для кнопок RemoteViews:

Intent playIntent = new Intent(this, RemoteControlReceiver.class);
    playIntent.setAction(ACTION_TOGGLE_PLAYBACK);
    PendingIntent playPausePendingIntent = PendingIntent.getBroadcast(this,
            0, playIntent, 0);

    Intent nextIntent = new Intent(this, RemoteControlReceiver.class);
    nextIntent.setAction(ACTION_SKIP);
    PendingIntent nextPendingIntent = PendingIntent.getBroadcast(this, 0,
            nextIntent, 0);

    Intent stopIntent = new Intent(this, RemoteControlReceiver.class);
    stopIntent.setAction(ACTION_STOP);
    PendingIntent stopPendingIntent = PendingIntent.getBroadcast(this, 0,
            stopIntent, 0);

    nowPlayingNotification.contentView.setTextViewText(R.id.title,
            playbackManager.getCurrentTrack().getName());

    nowPlayingNotification.contentView.setProgressBar(
            android.R.id.progress, 100, mediaProgress, false);

    if (notificationIconMixBitmap != null)
        nowPlayingNotification.contentView.setImageViewBitmap(R.id.icon,
                notificationIconMixBitmap);
    else {
        nowPlayingNotification.contentView.setImageViewResource(R.id.icon,
                R.drawable.notification_icon);

    }

    nowPlayingNotification.contentView.setOnClickPendingIntent(
            R.id.playPause, playPausePendingIntent);

    if (playbackManager.getCurrentPlaybackState() == State.Paused) {
        nowPlayingNotification.contentView.setImageViewResource(
                R.id.playPause, R.drawable.play_icon_solid);
    } else {
        nowPlayingNotification.contentView.setImageViewResource(
                R.id.playPause, R.drawable.pause_icon_solid);
    }

    if (!playbackManager.isSkipAllowed()) {
        nowPlayingNotification.contentView.setImageViewResource(R.id.next,
                R.drawable.next_icon_disabled);
    } else {
        nowPlayingNotification.contentView.setImageViewResource(R.id.next,
                R.drawable.next_icon_solid);
    }

    if (playbackManager.getCurrentPlaybackState() == State.Preparing) {
        nowPlayingNotification.contentView.setProgressBar(
                android.R.id.progress, 100, mediaProgress, true);
    }

    nowPlayingNotification.contentView.setOnClickPendingIntent(R.id.next,
            nextPendingIntent);
    nowPlayingNotification.contentView.setOnClickPendingIntent(R.id.close,
            stopPendingIntent);

за которым следует

mNotificationManager.notify(NOTIFICATION_ID, nowPlayingNotification);

Если кто-нибудь знает что-нибудь, что может помочь, возможно, признанная ошибка в 4.2.1, это было бы очень признательно! Благодаря

4b9b3361

Ответ 1

У меня была такая же проблема с моим телефоном.

вы создаете уведомление с помощью кода ниже:

nowPlayingNotification = new NotificationCompat.Builder(this)
                .setSmallIcon(R.drawable.notification_icon)
                .setContentTitle(
                        "Playing: "
                                + playbackManager.getCurrentTrack()
                                        .getName()).setContentIntent(pi)

Приложение вылетает, если ваш ожидающий намерение → pi, указывающий намерение запускаться, устанавливается равным нулю:

  PendingIntent pi= PendingIntent.getActivity(
                getApplicationContext(),
                0,
                ***null***,
                0
            );

замените null новым Intent() и проверьте, разрешает ли проблема.

В Gingerbread.setcontentIntent(намерение) является обязательным, иначе будет отменено исключение IllegalArgumentException. Но в Jellybean не исключение исключается, если мы удалим .setcontentIntent(намерение)