0

У меня есть виджет приложения, который показывает изображение.AppWidgetProvider берет ресурсы из неправильного пакета (только Lollipop)

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

Изображения сохраняются в разных пакетах под drawable каталога, я получаю его идентификатор ресурса следующим образом:

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 (она работает правильно, если я использую этот ресурс внутри действия).

  2. Это не работаю с другими методами, такими как:

    rv.setImageViewBitmap(R.id.image, BitmapFactory.decodeResource(r, resId)); 
    
  3. Он получает правильный идентификатор ресурса в @drawable/pat1, но принимая вытяжку с тем же идентификатором Реза из пакета по умолчанию. (Я проверил это в R.java в обоих пакетах) Если ресурс с этим идентификатором отсутствует, он просто ничего не помещает внутри R.id.image, а виджеты выглядят пустыми.

  4. Я попытался жёстко имя пакета в image_1.xml так:

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

    не было полезно.

  5. Проблема возникает на реальных устройствах с разными ромами и пусковыми установками, а также на эмуляторе.

Надеюсь, что я был чист, и надеюсь, что кто-то столкнется с подобной проблемой и может поделиться решением или предложить дополнительные обходные пути.

ответ

2

Кажется, что ошибка в Lollipop, поэтому я решил это путем обхода. Я только что создал аналогичные макеты во всех своих пакетах, внутри каждого макета есть ImageView с требуемым вытягиванием. Наконец, я позволю своим RemoteViews создать себя из выбранного макета.

RemoteViews rv = new RemoteViews(otherPackage, layoutResId);