当前位置: 首页 > 知识库问答 >
问题:

如何修复小米特定RemoteServiceException带有通知图标?

颜畅
2023-03-14

我们有很多专门针对小米手机在Android 6和7上的崩溃:

Fatal Exception: android.app.RemoteServiceException: Bad notification posted from package x.y.z: Couldn't create icon: StatusBarIcon(icon=Icon(typ=RESOURCE pkg=x.y.z id=0x7f0200ad) visible user=0 )
   at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1715)
   at android.os.Handler.dispatchMessage(Handler.java:102)
   at android.os.Looper.loop(Looper.java:163)
   at android.app.ActivityThread.main(ActivityThread.java:6358)
   at java.lang.reflect.Method.invoke(Method.java)
   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:880)
   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:770)

我在网上找到了很多类似的坠机报道和文章。这里有几个:

如何修复:Android.app.RemoteServiceException:从包发布的错误通知*:无法创建图标:StatusBarIcon

NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
        int importance = NotificationManager.IMPORTANCE_HIGH;
        NotificationChannel notificationChannel = new NotificationChannel(NOTIFICATION_CHANNEL_ID, NOTIFICATION_CHANNEL_NAME, importance);
        notificationChannel.enableLights(true);
        notificationManager.createNotificationChannel(notificationChannel);
    }
    NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(context, NOTIFICATION_CHANNEL_ID)
            .setSmallIcon(R.drawable.ic_notification)
            .setPriority(NotificationCompat.PRIORITY_MAX)
            .setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher))
            .setContentText(body == null ? "" : body)
            .setAutoCancel(true)
            .setContentIntent(PendingIntent.getActivity(
                    context,
                    0,
                    pendingIntent,
                    PendingIntent.FLAG_UPDATE_CURRENT
            ));

编辑:我找不到解决方法,但这里有几个新的想法:

>

  • 我们发布了新版本,但将小米用户排除在通知之外也于事无补!现在我认为问题是由ActivityThread.java中的自定义代码引起的。MIUI可能会在某个事件中从这里发出通知。这里的Android系统中有几十个事件,但没有一个会发出通知。但是我们的图标出了问题,所以它们崩溃了。

    但我们的图标出了什么问题?我们有一个ic_notification,它可能不用于此。另一方面,ic_launcher是一个mipmap。也许是这个?但是我找不到任何关于小米和MipMaps的问题。

      null
      null

    https://xiami.eu/community/threads/miui-9.47247/

    • 在波兰论坛上找到的临时解决方案:

    https://pl.forum.elvenar.com/index.php?threads/problem-z-uruchomieniem-23566.3348/

    就在1.1.13版本之后,他们删除了对小米的默认支持,你必须使用上面链接中的通知。

    有没有其他受影响的人用过这个?

  • 共有1个答案

    颜新
    2023-03-14

    我和一个用户有同样的问题。我相信它是由下面的代码引起的--从一个APK反编译我没有源代码,它是从shortcutbadger

    resolveInfo.geticonResource()返回了一个无效的资源ID(0x7F0200AD,所有应用程序都一样,看起来好像只有在MIUI10上)因此崩溃。

    iget-object v1, p0, Lme/leolin/shortcutbadger/impl/XiaomiHomeBadger;->a:Landroid/content/pm/ResolveInfo;
    
    invoke-virtual/range {v1 .. v1}, Landroid/content/pm/ResolveInfo;->getIconResource()I
    
    move-result v1
    
    invoke-virtual {p1, v1}, Landroid/app/Notification$Builder;->setSmallIcon(I)Landroid/app/Notification$Builder;
    

    作为用户,一个简单解决方法是完全禁用应用程序的通知--至少使其可用。

    builder.setSmallIcon(R.drawable.myicon);
    
    @TargetApi(Build.VERSION_CODES.JELLY_BEAN)
    private void tryNewMiuiBadge(Context context, int badgeCount) throws ShortcutBadgeException {
    if (resolveInfo == null) {
        Intent intent = new Intent(Intent.ACTION_MAIN);
        intent.addCategory(Intent.CATEGORY_HOME);
        resolveInfo = context.getPackageManager().resolveActivity(intent, PackageManager.MATCH_DEFAULT_ONLY);
    }
    
    if (resolveInfo != null) {
        NotificationManager mNotificationManager = (NotificationManager) context
                .getSystemService(Context.NOTIFICATION_SERVICE);
        Notification.Builder builder = new Notification.Builder(context)
                .setContentTitle("")
                .setContentText("")
                .setSmallIcon(resolveInfo.getIconResource());
        Notification notification = builder.build();
    
    <public type="drawable" name="icon_launcher" id="0x7f0200ad" />
    
     类似资料: