【问题标题】:MediaStyle : RemoteServiceException: Bad notification posted from packageMediaStyle:RemoteServiceException:从包发布的错误通知
【发布时间】:2019-10-03 04:31:18
【问题描述】:

我正在尝试使用下面的代码在我的应用程序中创建一个通知媒体控制器,该代码在所有设备上都可以正常工作,除了 Huawei P8 LiteAndroid 5.0 ,我从 Firebase 测试实验室获取此错误日志:

android.app.RemoteServiceException: 错误通知从 包 maa.app_app:无法扩展 RemoteViews: 状态栏通知(pkg=maa.app_app user=UserHandle{0} id=555 tag=null score=10 key=0|maa.app_app|555|null|10108:通知(pri=1 contentView=maa.app_app/0x109007f 振动=null 声音=null 默认值=0x0 标志=0x62 颜色=0xffbfbfbf 类别=运输 动作=2 vis=PUBLIC)) 致命例外:主进程: maa.app_app,PID:18793 android.app.RemoteServiceException:从发布的错误通知 包 maa.app_app:无法扩展 RemoteViews: 状态栏通知(pkg=maa.app_app user=UserHandle{0} id=555 tag=null score=10 key=0|maa.app_app|555|null|10108:通知(pri=1 contentView=maa.app_app/0x109007f 振动=null 声音=null 默认值=0x0 标志=0x62 颜色=0xffbfbfbf 类别=运输 行动=2 vis=PUBLIC)) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1534) 在 android.os.Handler.dispatchMessage(Handler.java:102) 在 android.os.Looper.loop(Looper.java:135) 在 android.app.ActivityThread.main(ActivityThread.java:5538) 在 java.lang.reflect.Method.invoke(Native Method) 在 java.lang.reflect.Method.invoke(Method.java:372) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:960) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)

这是我的代码:

void startNotify(Context context, String playbackStatus, String title) {
    String titlesonge;
    String artist;
    try {
        titlesonge = StringUtils.substringBefore(title, " - ");
        artist = StringUtils.substringAfter(title, " - ");
    } catch (Exception e) {
        titlesonge = title.substring(0, title.indexOf(" - "));
        artist = title.substring(title.lastIndexOf(" - ") - 1);
    }
    int icon = R.drawable.ic_pause_white;
    Intent playbackAction = new Intent(service, RadioService.class);
    playbackAction.setAction(RadioService.ACTION_PAUSE);
    PendingIntent action = PendingIntent.getService(service, 1, playbackAction, 0);
    if (playbackStatus.equals(PlaybackStatus.PAUSED)) {
        icon = R.drawable.ic_play_white;
        playbackAction.setAction(RadioService.ACTION_PLAY);
        action = PendingIntent.getService(service, 2, playbackAction, 0);

    }
    Intent stopIntent = new Intent(service, RadioService.class);
    stopIntent.setAction(RadioService.ACTION_STOP);
    PendingIntent stopAction = PendingIntent.getService(service, 3, stopIntent, 0);

    Intent intent = new Intent(service, MainActivity.class);
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP |
            Intent.FLAG_ACTIVITY_SINGLE_TOP |
            Intent.FLAG_ACTIVITY_NEW_TASK);
    PendingIntent pendingIntent = PendingIntent.getActivity(service, 0, intent, 0);
    notificationManager.cancel(NOTIFICATION_ID);
    String PRIMARY_CHANNEL = "PRIMARY_CHANNEL_ID";
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        NotificationManager manager = (NotificationManager) service.getSystemService(Context.NOTIFICATION_SERVICE);
        String PRIMARY_CHANNEL_NAME = "PRIMARY";
        NotificationChannel channel = new NotificationChannel(PRIMARY_CHANNEL, PRIMARY_CHANNEL_NAME, NotificationManager.IMPORTANCE_LOW);
        channel.setLockscreenVisibility(Notification.VISIBILITY_PRIVATE);
        if (manager != null) {
            manager.createNotificationChannel(channel);
        }
    }
    NotificationCompat.Builder builder = new NotificationCompat.Builder(service, PRIMARY_CHANNEL)
            .setAutoCancel(false)
            .setContentTitle(titlesonge)
            .setContentText(artist)
            .setLargeIcon(BitmapFactory.decodeResource(resources, R.drawable.largeicon))
            .setContentIntent(pendingIntent)
            .setVisibility(NotificationCompat.VISIBILITY_PUBLIC)
            .setSmallIcon(R.drawable.smallwidth)
            .setColor(ContextCompat.getColor(context, R.color.colorneeded))
            .addAction(icon, "pause", action)
            .addAction(R.drawable.ic_stop_white, "stop", stopAction)
            .setPriority(NotificationCompat.PRIORITY_HIGH)
            .setWhen(System.currentTimeMillis())
            .setStyle(new android.support.v4.media.app.NotificationCompat.MediaStyle()
                    .setMediaSession(service.getMediaSession().getSessionToken())
                    .setShowActionsInCompactView(0, 1)
                    .setShowCancelButton(true)
                    .setCancelButtonIntent(stopAction));
    service.startForeground(NOTIFICATION_ID, builder.build());
}

谁能帮我解决这个问题

【问题讨论】:

    标签: java android notifications android-notifications huawei-mobile-services


    【解决方案1】:

    由于某种原因,Android 5.0 的华为设备在使用.setStyle() 方法时会崩溃,所以您有两种可能:

    1 - 检测设备制造商是否是华为,并且是否具有Android 5.0或更低版本

    public boolean isLolliPopHuawei() {
        return (android.os.Build.VERSION.SDK_INT == Build.VERSION_CODES.LOLLIPOP_MR1 ||
                android.os.Build.VERSION.SDK_INT == Build.VERSION_CODES.LOLLIPOP) && Build.MANUFACTURER.equalsIgnoreCase("HUAWEI");
    }
    

    2 - 改用PlayerNotificationManager

    void exoPlayerNotification(Context context, SimpleExoPlayer exoPlayer, String title) {
        String titlesonge;
        String artist;
        try {
            titlesonge = StringUtils.substringBefore(title, " - ");
            artist = StringUtils.substringAfter(title, " - ");
        } catch (Exception e) {
            titlesonge = title.substring(0, title.indexOf(" - "));
            artist = title.substring(title.lastIndexOf(" - ") - 1);
        }
        String finalArtist = artist;
        String finalTitlesonge = titlesonge;
        mPlayerNotificationManager = PlayerNotificationManager.createWithNotificationChannel(
                context,
                "PRIMARY_CHANNEL_ID",
                R.string.plaza,
                NOTIFICATION_ID,
                new PlayerNotificationManager.MediaDescriptionAdapter() {
                    @Override
                    public String getCurrentContentTitle(Player player) {
                        return finalArtist;
                    }
    
                    @Nullable
                    @Override
                    public PendingIntent createCurrentContentIntent(Player player) {
                        Intent intent = new Intent(service, MainActivity.class);
                        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                        return PendingIntent.getActivity(service, 0, intent,
                                PendingIntent.FLAG_UPDATE_CURRENT);
                    }
    
                    @Override
                    public String getCurrentContentText(Player player) {
                        return finalTitlesonge;
                    }
    
                    @Nullable
                    @Override
                    public Bitmap getCurrentLargeIcon(Player player, PlayerNotificationManager.BitmapCallback callback) {
                        return BitmapFactory.decodeResource(service.getResources(), R.drawable.largeicon);
                    }
    
                    @Nullable
                    @Override
                    public String getCurrentSubText(Player player) {
                        return null;
                    }
                }
        );
        mPlayerNotificationManager.setUseNavigationActions(false);
        mPlayerNotificationManager.setFastForwardIncrementMs(0);
        mPlayerNotificationManager.setRewindIncrementMs(0);
        mPlayerNotificationManager.setColorized(true);
        mPlayerNotificationManager.setColor(0xFFEEEEEE);
        mPlayerNotificationManager.setUseChronometer(true);
        mPlayerNotificationManager.setOngoing(true);
        mPlayerNotificationManager.setPriority(NotificationCompat.PRIORITY_MAX);
        mPlayerNotificationManager.setUsePlayPauseActions(true);
        mPlayerNotificationManager.setSmallIcon(R.drawable.smallwidth);
        mPlayerNotificationManager.setNotificationListener(new PlayerNotificationManager.NotificationListener() {
            @Override
            public void onNotificationStarted(int notificationId, Notification notification) {
                service.startForeground(notificationId, notification);
            }
    
            @Override
            public void onNotificationCancelled(int notificationId) {
                service.stopSelf();
                cancelNotify();
            }
        });
        mPlayerNotificationManager.setPlayer(exoPlayer);
    }
    

    【讨论】:

    【解决方案2】:

    由于某些华为设备不支持 MediaStyle,您需要构建不带样式的通知。我在华为 P8 Lite 和华为 Y3II 机型上遇到了这个问题。因此,请检查设备是否是上述提到的华为和 SDK 版本,并创建一个简单的通知,如下所示。这个问题帮助我找到了解决方案Strange allow/deny question on Huawei 5.1 phone when showing notification 。无论如何,我希望对某人有所帮助

        boolean isLollipopHuawei = (android.os.Build.VERSION.SDK_INT == Build.VERSION_CODES.LOLLIPOP_MR1 ||
                android.os.Build.VERSION.SDK_INT == Build.VERSION_CODES.LOLLIPOP) && Build.MANUFACTURER.equalsIgnoreCase("HUAWEI");
    
    
        if (isLollipopHuawei) {
    
            builder
                    .setContentTitle(description.getTitle())
                    .setContentText(contentText)
                    .setOngoing(true)
                    .setContentIntent(createContentIntent())
                    .setLargeIcon(BitmapFactory.decodeResource(context.getResources(),
                            R.drawable.mobi_plc))
    
                    .addAction(R.drawable.ic_previous_outline_notification,
                            this.service.getString(R.string.next_station),
                            MediaButtonReceiver.buildMediaButtonPendingIntent(
                                    this.service,
                                    PlaybackStateCompat.ACTION_SKIP_TO_PREVIOUS))
                    .addAction(R.drawable.ic_next_outline_notification,
                            this.service.getString(R.string.next_station),
                            MediaButtonReceiver.buildMediaButtonPendingIntent(
                                    this.service,
                                    PlaybackStateCompat.ACTION_SKIP_TO_NEXT))
    
                    .setSmallIcon(R.drawable.ic_stat)
    
                    .setAutoCancel(false);
        }
    

    【讨论】:

      【解决方案3】:

      我遇到了同样的问题,根本原因无法设置样式,它只是在华为 P8 Lite 中给出了这个异常,在其他设备上没有。

      所以,我要做的是检查当前设备是否为 android 版本 5.0,其制造商是否为华为,并删除 setStyle 属性。请检查以下代码

      boolean isLollipopHuawei = (android.os.Build.VERSION.SDK_INT == Build.VERSION_CODES.LOLLIPOP_MR1 ||
                  android.os.Build.VERSION.SDK_INT == Build.VERSION_CODES.LOLLIPOP) && Build.MANUFACTURER.equalsIgnoreCase("HUAWEI");
      
      
      if (Build.VERSION.SDK_INT == Build.VERSION_CODES.KITKAT || Build.VERSION.SDK_INT == Build.VERSION_CODES.LOLLIPOP_MR1 || Build.VERSION.SDK_INT == Build.VERSION_CODES.LOLLIPOP) {
      
                  if (isLollipopHuawei) {
      
                      return builder
                              .addAction(generateAction(android.R.drawable.ic_media_previous, "Previous", Constants.ACTION_PREVIOUS))
                              .addAction(action)
                              .addAction(generateAction(android.R.drawable.ic_media_next, "Next", Constants.ACTION_NEXT))
                              .setSmallIcon(R.mipmap.vpicon_grayscale)
                              .setContentTitle(getSongDataHelper().getTitle())
                              .setContentIntent(pendingIntent)
                              .setContentText(getSongDataHelper().getAlbum())
                              .setLargeIcon(getSongDataHelper().getAlbumArt())
                              //.setColor(color)
                            /*  .setStyle(new androidx.media.app.NotificationCompat.MediaStyle()
                                      .setShowActionsInCompactView(0, 1, 2)
                                      .setMediaSession(mMediaSession.getSessionToken()))*/
                              .build();
                  } else {
                      return builder
                              .addAction(generateAction(android.R.drawable.ic_media_previous, "Previous", Constants.ACTION_PREVIOUS))
                              .addAction(action)
                              .addAction(generateAction(android.R.drawable.ic_media_next, "Next", Constants.ACTION_NEXT))
                              .setSmallIcon(R.mipmap.vpicon_grayscale)
                              .setContentTitle(getSongDataHelper().getTitle())
                              .setContentIntent(pendingIntent)
                              .setContentText(getSongDataHelper().getAlbum())
                              .setLargeIcon(getSongDataHelper().getAlbumArt())
                              //.setColor(color)
                              .setStyle(new androidx.media.app.NotificationCompat.MediaStyle()
                                      .setShowActionsInCompactView(0, 1, 2)
                                      .setMediaSession(mMediaSession.getSessionToken()))
                              .build();
                  }
              }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-06-18
        • 1970-01-01
        • 2014-09-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多