应用程序小部件setImageViewUri不更新图像

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

问题是,随着图像随着时间而改变,小部件的图像不会改变。 我检查了与根资源pipe理器保存的PNG,它是正确更新。 但不显示正确的图像。 每个小部件显示从添加到主屏幕的图像。 如果我使用setImageViewBitmap(…)它能正常工作,除了罕见的失败的联编程序事务。

我使用下面的方法从服务更新小部件。 它不适用于android 2.3.7,也适用于运行2.2的模拟器。 可能是什么问题呢? 是不知何故被caching?

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不显示任何错误。

Solutions Collecting From Web of "应用程序小部件setImageViewUri不更新图像"

如果Uri保持不变,Android似乎不会更新图像。 我发现了一些破解,但解决这个问题。 只需调用widget.setImageViewUri(R.id.widget_icon, Uri.parse(""));widget.setImageViewUri(R.id.widget_icon, uri);

它调用setImageViewUri()两次,但似乎工作正常。 我很想听到更好的解决方法,因为我自己正在经历这个问题。

那么它看起来像setImageViewUricaching图像,并不刷新它们,如果有相同的名称。

不是最优雅的解决scheme,但它的工作,每隔一秒,它将使用不同的文件名。

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

我希望这可以帮助其他人。 我试图在删除列表视图中使用该方法,但它从来没有工作。 但使用位图为我工作。 我能够更新任何logging中的图片,他们正在更新,并没有caching。 这是我使用的静态方法。

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