Ответ 1
Похоже, что setImageViewUri
больше не безопасно использовать с файлом://uris.
Почему?
Jellybean представила разрешение READ_EXTERNAL_STORAGE
. Приложения, которые хотят читать из внешнего хранилища, должны иметь это разрешение. Это не было применено по умолчанию до KitKat.
Пусковая установка не поддерживает это разрешение. На самом деле вам не гарантируется, что любой RemoteView, который вы прикрепляете, содержит это разрешение. Это делает небезопасным использование setImageViewUri, так как вы не знаете, сможет ли удаленный просмотр изображения даже прочитать данный uri.
Что теперь?
Вариант 1: используйте setImageViewBitmap.
Возможно, вы отказались от этой опции из-за неудачных транзакций связующего. Трюк для них - это просто убедиться, что ваше изображение меньше 1 МБ. Это не так сложно, как кажется. Вы можете точно рассчитать, насколько велика ваша картинка. Например, если вы используете изображение ARGB_8888, это означает, что вам нужно 4 байта на пиксель. Мы можем вычислить максимальный размер:
1 Mb = 1048576 bytes = 262144 pixels = 512 x 512 image
Конечно, вы можете выжать больше из него, используя RGB_565, чтобы получить 2x пикселей.
Также обратите внимание, что вам может не понадобиться огромное изображение, если ваш виджет невелик. Ваш appwidget может задать свои конкретные параметры следующим образом:
Bundle options = appWidgetManager.getAppWidgetOptions(appWidgetIds[i]);
int minWidth = options.getInt(AppWidgetManager.OPTION_APPWIDGET_MIN_WIDTH);
int minHeight = options.getInt(AppWidgetManager.OPTION_APPWIDGET_MIN_HEIGHT);
int maxWidth = options.getInt(AppWidgetManager.OPTION_APPWIDGET_MAX_WIDTH);
int maxHeight = options.getInt(AppWidgetManager.OPTION_APPWIDGET_MAX_HEIGHT);
Просто имейте в виду, что возвращаемые значения находятся в dip-пикселях, поэтому вам нужно будет их преобразовать, чтобы масштабировать растровое изображение.
Вариант 2. Использование поставщика контента
Если по какой-то причине вам все еще не нравится ограничение IPC, вы всегда можете создать пользовательский контент-провайдер. Передайте этот uri в setImageViewUri, и вам должно быть хорошо идти.
Как насчет переключателя пути?
Переключатель пути не является реальной проблемой. Похоже, что это проблема, но эмуляция работает нормально. Попробуйте создать файл внутри //storage/emulated/0/sdcard/mydir/bgs
, и файл будет создан просто отлично.
Вы заметите, что в то время как исключением является исключение FileNotFoundException, это сообщение разрешено.