AppWidgetProvider 从错误的包中获取资源(仅限 Lollipop)

AppWidgetProvider takes resources from wrong package (Lollipop only)

我有一个显示图像的应用程序小部件。

Uri uri = Uri.parse("android.resource://" + packageName + "/" + resId);
rv = new RemoteViews(defaultPackageName, widgetLayout);
rv.setImageViewUri(R.id.image, uri);

图像存储在 drawable 目录下的不同包中,我得到它的资源 ID 是这样的:

Resources r = getPackageManager().getResourcesForApplication(otherPackage);
int resId = r.getIdentifier("image_1", "drawable", otherPackage);

一切正常,直到 image_1 是一个 xml 位图,它有一个 android:src 标签:

<?xml version="1.0" encoding="utf-8"?>
<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
        android:src="@drawable/pat1"
        android:tileMode="repeat"/>

经过长时间的研究,我的发现和尝试:

  1. 问题只发生在 lollipop(5.0、5.1 等...)中,并且只发生在 AppWidgetProvider 中(如果我在 activity 中使用此资源,它会正常工作)。

  2. 它既不能与其他方法一起使用,如:

    rv.setImageViewBitmap(R.id.image, BitmapFactory.decodeResource(r, resId));
    
  3. 正在获取 @drawable/pat1 的正确资源 ID,但从默认包中获取具有相同资源 ID 的可绘制对象。 (我已经在两个包的 R.java 中检查过了)如果没有具有该 ID 的资源,它就不会在 R.id.image 中放置任何内容,并且小部件似乎是空白的。

  4. 我试过像这样在 image_1.xml 中硬编码包名称:

    android:src="@com.other.package.name:drawable/pat1"
    

    没有帮助。

  5. 问题出现在具有不同 rom 和启动器的真实设备以及模拟器上。

我希望我说的很清楚,并希望有人遇到过类似的问题并且可以分享解决方案或提出更多解决方法。

这似乎是 Lollipop 中的一个错误,所以我通过变通方法解决了这个问题。 我刚刚在我的所有包中创建了类似的布局,在每个布局中都有一个带有所需可绘制对象的 ImageView。 最后,我让我的 RemoteViews 从选定的布局创建自己。

RemoteViews rv = new RemoteViews(otherPackage, layoutResId);