Intereting Posts
Подключить 2 или более Android-клиентов напрямую Широковещательный приемник не получит событие камеры Не получать смс, даже если установить самый высокий приоритет и установить первый «BadParcelableException: ClassNotFoundException при unmarshalling <myclass>» при использовании метода Parcel.read, который имеет ClassLoader в качестве аргумента Надежная связь с несколькими устройствами BLE одновременно на Android Приложение не отображается в последних списках приложений Динамическое изменение количества столбцов GridLayoutManager Преобразование YUV-> RGB (Обработка изображений) -> YUV во время onPreviewFrame в android? Android: удалите ВСЕ фрагменты из предыдущего стека Может подчеркивать слова в тексте TextView Внедрить список с разделителем раздела в android Пользовательский прозрачный Android ActionBar Элементы GridView динамически меняются местами при прокрутке экрана Ошибка «Package R не существует» при создании с помощью Gradle из командной строки Вкладка EditText

Виджет приложения setImageViewUri не обновляет изображение

У меня есть виджет приложения, который содержит только одно изображение. Я перерисовываю это изображение и сохраняю его как png в частной памяти приложений, а затем устанавливаю образ RemoteViews с помощью uri (widget.setImageViewUri (R.id.widget_icon, uri)) вместо отправки его растрового изображения, потому что очень редко Ситуации, которые я получаю !!! НЕИСПРАВНОСТЬ СДЕЛКА СДЕЛКИ !!!

Проблема заключается в том, что по мере изменения изображения со временем изображение виджета не изменяется. Я проверил сохраненный png с помощью root explorer и обновил его правильно. Но правильное изображение не отображается. Каждый виджет показывает изображение с момента его добавления на главный экран. Если я использую setImageViewBitmap (…), он работает правильно, за исключением редкой неудачной транзакции связующего.

Я обновляю виджет из службы с помощью метода ниже. Он не работает на Android 2.3.7, а также с эмулятором, работающим под управлением 2.2. В чем может быть проблема? Это как-то кэшировано?

public void updateWidget(Context context) { // redraws the widget's image updateIcon(); OutputStream stream; try { stream = context.openFileOutput("icon.png", Context.MODE_WORLD_READABLE); } catch (FileNotFoundException ex) { ex.printStackTrace(); return; } m_Icon.compress(CompressFormat.PNG, 100, stream); try { stream.close(); } catch (IOException ex) { ex.printStackTrace(); } AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context); int[] appWidgetIds = appWidgetManager.getAppWidgetIds(new ComponentName(context, WidgetProvider.class)); Intent intent = new Intent(context, MyDialog.class); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); PendingIntent clickIntent = PendingIntent.getActivity(context, 0, intent, 0); File file = new File(context.getFilesDir().getAbsolutePath() + File.separator + "icon.png"); // Uri uri = Uri.fromFile(file); // update all widgets on home screen for (int wid : appWidgetIds) { RemoteViews widget = new RemoteViews(context.getPackageName(), R.layout.widget); widget.setOnClickPendingIntent(R.id.widget_layout, clickIntent); // === EDIT === // Uri.fromFile(file); does not work correctly on android 2.1, only 2.2 and up // widget's image will disappear // widget.setImageViewUri(R.id.widget_icon, uri); widget.setImageViewUri(R.id.widget_icon, Uri.parse(file.getPath())); intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, wid); appWidgetManager.updateAppWidget(wid, widget); } } 

EDIT: я также попробовал пользовательский ContentProvider и установил urid «content: // …», но с тем же результатом. Виджет показывает изображение с момента его добавления на главный экран и не обновляется со временем.

Logcat не показывает никаких ошибок.

Solutions Collecting From Web of "Виджет приложения setImageViewUri не обновляет изображение"

Если Uri останется неизменным, похоже, Android не будет обновлять изображение. Я нашел немного взлома, чтобы обойти это, хотя. Просто вызовите widget.setImageViewUri(R.id.widget_icon, Uri.parse("")); Перед widget.setImageViewUri(R.id.widget_icon, uri); ,

Он вызывает setImageViewUri() дважды, но, похоже, работает нормально. Мне бы хотелось услышать лучший способ исправить это, поскольку я сам испытываю эту проблему.

Ну, похоже, что setImageViewUri кэширует изображения и не обновляет их, если они имеют одинаковое имя.

Не самое элегантное решение, но оно работает, каждый второй раз он будет использовать другое имя файла.

 String filename = new String("bitmap-1.png"); // rotate files, due to not being refreshed if same name if ( context.deleteFile(filename) ) { filename = new String("bitmap-0.png"); } FileOutputStream out = context.openFileOutput(filename, Context.MODE_WORLD_READABLE); bitmap.compress(Bitmap.CompressFormat.PNG, 80, out); file = context.getFileStreamPath(filename); out.close(); updateViews.setImageViewUri(R.id.image1,Uri.parse(file.toString()));