Java 不能';t展开RemoteView-错误通知

Java 不能';t展开RemoteView-错误通知,java,android,notifications,remoteview,Java,Android,Notifications,Remoteview,最近,我收到越来越多的用户收到RemoteServiceException错误的报告。每次给出的堆栈跟踪如下所示: android.app.RemoteServiceException: Bad notification posted from package com.smithyproductions.fasttracks: Couldn't expand RemoteViews for: StatusBarNotification(pkg=com.smithyproductions.fast

最近,我收到越来越多的用户收到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上重现这个问题,这让我相信它可能是特定于设备的。我已从以下设备收到此错误的报告:

  • 华为G610 U15
  • bq Aquaris 5高清
  • 恩斯珀特楼梯
  • JYT JY-G5
…而且他们都在运行Android 4.2.1-也许那个版本的Android有一个bug

我在internet和StackOverflow上搜索过有类似问题的人,虽然有很多人都有这个问题,但大多数时候,它不能正常工作的原因是因为不正确的资源ID或在RemoteView中使用了不受支持的视图。我不明白如果它在98%的设备上工作,我怎么会做错了,但我不想告诉这些有问题的人我也无能为力

就创建通知的方式而言,我使用了NotificationCompat.Builder类和一个定制的RemoteView——本质上它是一个音乐播放器通知,因此它也有一些图像按钮

以下是我设置通知的代码:

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();
然后我为RemoteView按钮设置了所有回调:

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中的一个公认错误,我们将不胜感激!谢谢,我的手机也有同样的问题

您可以使用以下代码创建通知:

nowPlayingNotification = new NotificationCompat.Builder(this)
                .setSmallIcon(R.drawable.notification_icon)
                .setContentTitle(
                        "Playing: "
                                + playbackManager.getCurrentTrack()
                                        .getName()).setContentIntent(pi)
如果您的pending intent->pi Specification intent to Launch设置为空,则应用程序崩溃,如下所示:

  PendingIntent pi= PendingIntent.getActivity(
                getApplicationContext(),
                0,
                ***null***,
                0
            );
用new Intent()替换null并测试是否解决了问题


在姜饼上。setcontentIntent(intent)是必需的,否则将抛出IllegalArgumentException。但是在Jellybean中,如果我们删除。setcontentIntent(intent)

我在我的构建中看到了类似的问题-只有Kitkat设备大量抛出这些问题-Android操作系统版本:4.4.4、4.4.2、4.2.2、4.0.4

通过更改通知所使用的可绘制文件进行修复

.addAction(R.drawable.ic_forward_black_24dp, VIEW_ACTION, pendingIntentView);
我们停止使用矢量资源,开始使用图像资源


R.drawable.ic_forward_black_24dp不再使用xml文件(矢量资源),而是使用png文件(图像资源)。

它在Android 4.2.1上崩溃了吗?我的应用程序的最低api级别是11,所以如果这只是发生在姜饼上,我不认为这是同一回事。事实上,我已经在我的pending Intent中设置了一个Intent,所以我不认为这是答案,但无论如何还是要感谢..如果pending Intent是用null Intent创建的,它会在运行4.3的galaxy手机上崩溃。。我猜4.2.1也应该如此。我刚刚用我使用的待定意图更新了我的问题-我确实使用了意图,而不是null。你解决了这个问题吗?我有同样的问题,我有同样的问题。你找到原因了吗?@Rorster也有同样的问题!你找到解决办法了吗?