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

标签 android widget uri android-appwidget android-imageview

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

问题是,当图像随时间变化时,小部件的图像不会改变。我用根资源管理器检查了保存的 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, 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 没有显示任何错误。

最佳答案

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

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

关于android - 应用程序小部件 setImageViewUri 不更新图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7901138/

相关文章:

android - 如何禁用 scrollView 的 throw

widget - 获取 iTunes 中当前播放的歌曲

c++ - 在 Qt 5.4 中使用命名空间

c# - 是否有一个概述来查看哪些 UriComponents 返回 Uri 的内容?

javascript - Node.js 相同的 uri 但不同的参数

java - 存储访问框架 - 保存 Uri

android - 在android中为对话框窗口添加边框

java - 我想在 Android Activity 中制作一个可滚动的带有图像的文本列表。我应该用什么?

java - 在 Android Instrumentation 测试中使用 PowerMock 和 Mockito - 错误 - 重复文件 - org.mockito.plugins.MockMaker

android - 从字符串中获取布局 ID,将不起作用