app widget setImageViewUri不更新图像

时间:2011-10-26 09:56:47

标签: android widget uri android-appwidget android-imageview

我有一个app小部件,它只包含一个imageview。我重绘该图像并将其作为png存储在应用程序的私有内存中,然后我使用uri(widget.setImageViewUri(R.id.widget_icon,uri))设置RemoteViews的图像,而不是自己发送位图,因为非常罕见我得到的情况!失败的粘合剂交易!!!

问题是,随着图像随时间的变化,窗口小部件的图像不会改变。我用root explorer检查了保存的png并且它已正确更新。但不显示正确的图像。每个小部件显示从添加到主屏幕时的图像。如果我使用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 个答案:

答案 0 :(得分:9)

如果Uri保持不变,则Android似乎无法更新图片。我发现有点破解这个问题。只需在widget.setImageViewUri(R.id.widget_icon, Uri.parse(""));之前致电widget.setImageViewUri(R.id.widget_icon, uri);

它两次调用setImageViewUri(),但似乎工作正常。我很乐意听到一个更好的解决方法,因为我自己也遇到过这个问题。

答案 1 :(得分:2)

好像它看起来像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())); 

答案 2 :(得分:0)

我希望这可以帮助其他人。我试图在删除列表视图中使用该方法,但它从未起作用。但使用位图对我有用。我能够更新任何记录中的图片,他们正在更新,没有缓存。这是我使用的静态方法。

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 );