Виджет приложения setImageViewUri не обновляет изображение - PullRequest
10 голосов
/ 26 октября 2011

У меня есть виджет приложения, который содержит только одно изображение.я перерисовываю это изображение и сохраняю его как 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);
  }
}

РЕДАКТИРОВАТЬ: Я также попытался пользовательский ContentProvider и настройки "content: // ..." uri, но с тем же результатом.виджет показывает изображение с момента его добавления на домашний экран и не обновляется с течением времени.

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

Ответы [ 3 ]

9 голосов
/ 27 октября 2011

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

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

2 голосов
/ 28 апреля 2012

Что ж, похоже, 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())); 
0 голосов
/ 26 октября 2017

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

public static Bitmap getBitmap( String imageLocation ) {

    BitmapFactory.Options options = new BitmapFactory.Options();
    options.inPreferredConfig = Bitmap.Config.ARGB_8888;

    return BitmapFactory.decodeFile(imageLocation, options);
}

затем

bitmap = BitmapUtils.getBitmap( address.getPhotoLocation() );
row.setImageViewBitmap( R.id.row_image, bitmap );
...