我有一个应用小部件,只包含一个ImageView。我重新绘制了这个图片并将其存储为PNG格式在应用的私有内存中,然后我使用URI设置RemoteViews的图像(widget.setImageViewUri(R.id.widget_icon, uri))而不是发送位图本身,因为极少情况下会出现“FAILED BINDER TRANSACTION”错误。
问题是,随着时间的推移,图片发生变化但小部件的图片没有改变。我用Root Explorer检查了保存的PNG文件,它被正确更新了。但是正确的图像没有显示出来。每个小部件都显示添加到主屏幕时的图像。如果我使用setImageViewBitmap(...),它能正常工作,除了极少出现的“FAILED BINDER TRANSACTION”错误。
我从服务中使用下面的方法更新小部件。它在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没有显示任何错误。