我有一个应用程序小部件,它只包含一个图像视图.我重新绘制该图像,并将其存储在应用程序的私有内存中,然后使用uri(widget.set
ImageViewUri(R.id.widget_icon,uri))设置RemoteViews的图像,而不是发送自己的位图,因为非常罕见我得到的情况!失败的BINDER交易!
问题是,随着图像随时间的变化,窗口小部件的图像不会改变.我使用root资源管理器检查保存的png,并正确更新.但不显示正确的图像.每个小部件显示从添加到主屏幕的时间的图像.如果我使用setImageViewBitmap(…)它可以正常工作,除了罕见的失败的binder事务.
我使用下面的方法从服务更新窗口小部件.它不适用于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,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,但结果相同.该小部件显示从添加到主屏幕时的图像,并且不会随时间更新.