通知图标的Android资源未找到异常

2ic8powd  于 2023-02-17  发布在  Android
关注(0)|答案(2)|浏览(170)
    • bounty将在4天后过期**。回答此问题可获得+50声望奖励。km11希望引起更多人对此问题的关注:建议的更改不会再发生任何崩溃

在我的最新版本中,我突然开始得到这个错误:Resources$NotFoundException: Resource ID #0x7f080120.资源ID是我的通知图标,它用在ViewPager的一个选项卡中,在启动时显示。我自己无法重现这个问题,但在Firebase Crashlytics中看到了很多新的崩溃。
通知图标以多种密度存储:

导致崩溃的代码:
ContextCompat.getDrawable(context, R.drawable.ic_notification_icon)
奇怪的是,我没有改变任何与这个可绘制对象相关的东西,也没有改变这个版本中ViewPager的代码。我在四处搜索中找到的最好的建议是清理并重建这个项目。我这样做了,并上传了一个新版本,但崩溃再次出现。
在以下Android版本上观察到崩溃:

  • 安卓13
  • 安卓11
  • 安卓8.1.0
  • 安卓7.1.2

和以下设备:

  • 银河A53 5G
  • Nexus 5X手机
  • 标准PC(i440FX + PIIX,1996年)
  • 体内S1
  • 一加8专业版
  • 米九
    • 编辑:**我可以看到44%的受影响设备是root的。这是否意味着我不应该担心这个问题?
col17t5w

col17t5w1#

我们在应用程序中也经常遇到这种错误。所以,通过做一点点搜索,我正在将ContextCompat更改为AppCompatResources以获取可绘制对象。我现在真的不知道这对我们的应用是否有益,但更改的原因很简单,因为ContextCompat返回结果的方式与AppCompatResources返回结果的方式有关。ContextCompat只是调用上下文'的getDrawable方法,该方法依次调用Resource's getDrawable方法,Resource's getDrawable方法依次调用ResourceImpl getValueForDensity方法,最后调用本机方法。而AppCompatResources调用AppCompatDrawableManager的getDrawable方法,该方法尝试不同的方法来获取可绘制对象,如果这些方法都不起作用,则最终回退到ContextCompat。这似乎是我获取可绘制对象的更好候选方法。
AppCompatDrawableManager的getDrawable方法

public Drawable getDrawable(@NonNull Context context, @DrawableRes int resId,
        boolean failIfNotKnown) {
    checkVectorDrawableSetup(context);
    Drawable drawable = loadDrawableFromDelegates(context, resId);
    if (drawable == null) {
        drawable = createDrawableIfNeeded(context, resId);
    }
    if (drawable == null) {
        drawable = ContextCompat.getDrawable(context, resId);
    }
    if (drawable != null) {
        // Tint it if needed
        drawable = tintDrawable(context, resId, failIfNotKnown, drawable);
    }
    if (drawable != null) {
        // See if we need to 'fix' the drawable
        DrawableUtils.fixDrawable(drawable);
    }
    return drawable;
}

这个answer也有有用的信息。

3htmauhk

3htmauhk2#

ContextCompat正在制造问题
直接使用
getDrawable(上下文,R.可绘制.ic_通知_图标)

相关问题