Android:将位图从本地存储加载到应用程序小部件(RemoteViews)

2024-03-07

到目前为止,我一直在将位图加载到我的RemoteViews直接使用remoteViews.setImageViewBitmap()。总体来说运行良好。

但有几个用户遇到了问题,我认为是在加载非常大的位图时出现的。无论如何,我已经将位图缓存到本地存储,所以我的想法是使用setImageViewUri()相反,如其他地方所建议的那样。

但我无法让它工作......我只是得到一个空白的小部件。以下片段说明了我正在做的事情(省略了一些上下文,但希望留下足够的内容)...

// Bitmap bmp is fetched from elsewhere... and then...

FileOutputStream fos = context.openFileOutput("img.png", Context.MODE_PRIVATE);
bmp.compress(Bitmap.CompressFormat.PNG, 100, fos);
fos.flush();
fos.close();

// ... later ...

// this works...
remoteViews.setImageViewBitmap(R.id.imageView, bmp);

// but this doesn't...
remoteViews.setImageViewUri(R.id.imageView, Uri.fromFile(new File(context.getFilesDir().getPath(), "img.png")));

EDIT

尝试使用FileProvider正如下面 CommonsWare 所建议的...

显现:

<provider
    android:name="android.support.v4.content.FileProvider"
    android:authorities="com.xyz.fileprovider"
    android:exported="false"
    android:grantUriPermissions="true">
    <meta-data
        android:name="android.support.FILE_PROVIDER_PATHS"
        android:resource="@xml/file_paths" />
</provider>

xml/文件路径.xml:

<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <files-path name="cache" path="."/>
</paths>

code:

File imagePath = new File(context.getFilesDir(), ".");
File newFile = new File(imagePath, "img.png"); // img.png created as above, in top level folder
remoteViews.setImageViewUri(R.id.imageView, FileProvider.getUriForFile(context, "com.xyz.fileprovider", newFile));

但我仍然像以前一样留下一个空白的小部件,并且 logcat 中没有错误。


您的应用程序小部件正在由主屏幕呈现。主屏幕无法访问应用程序的内部存储。

相反,尝试using FileProvider http://developer.android.com/reference/android/support/v4/content/FileProvider.html从内部存储提供文件,带有Uri受供于FileProvider在你的setImageViewUri() call.

UPDATE: 我忘记了FileProvider的权限限制。我不知道有什么可靠的方法来授予权限Uri到主屏幕过程通过RemoteViews。理想情况下,您只允许导出提供程序,但是FileProvider不支持这一点。

那么,您的选择是:

  1. 编写您自己的流媒体ContentProvider,类似于this one https://github.com/commonsguy/cw-omnibus/tree/master/ContentProvider/Files,提供者被导出,因此任何人都可以使用Uri values.

  2. 将文件放在外部存储上,而不是内部存储上,然后希望主屏幕有READ_EXTERNAL_STORAGE or WRITE_EXTERNAL_STORAGE权限。

  3. 确保您的图像始终相当小,以便您的 IPC 交易保持在 1MB 限制以下,并使用您的原始图像setImageViewBitmap()方法。

我很抱歉忘记了FileProvider不允许导出提供者。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android:将位图从本地存储加载到应用程序小部件(RemoteViews) 的相关文章

随机推荐

  • 团队中审批应用程序的 API - 是否有任何其他 API 可用于团队中新的审批应用程序?

    是否有任何 REST API 可用于团队中的新审批应用程序 在 Microsoft Teams 中发送 接收 管理和共享批准 您创建 管理和共享的所有系统的审批中心 能够在 Microsoft Teams 中直接查看并采取行动 快速完成工作
  • Python Matplotlib 动画帧重叠

    I am working on my orbit program and I have currently only animated the moon with a downward y velocity of 1023 The anim
  • 实体框架 - 对象上下文的关闭

    在使用 EFProfiler 顺便说一句 绝对是很棒的工具 对我们的一些实体框架应用程序进行分析后 似乎在大多数情况下 所有对象上下文都没有关闭 例如 在本地运行后 EF Profiler 告诉我有326对象上下文已打开 但只有 1 个被关
  • Keras 自定义损失函数不打印张量值

    我正在编写一个简单的损失函数 其中我必须将张量转换为 numpy 数组 这是必需的 我只是想打印张量的值 但收到此错误 张量 loss activation 4 loss Print 0 shape 224 224 2 数据类型 float
  • 如何通过 Mercurial 命令行获取所有关闭的分支?

    在命令行中 我可以通过以下方式获取没有闭合分支的所有头 hg heads 我还可以通过以下方式获取所有具有闭合分支的头 hg heads closed 但是 我如何通过命令行知道所有关闭的分支 RTM hg help revsets hg
  • Node.js:客户端模板与服务器端模板

    我已经尝试学习 Node js 几天了 但有一件事情我很困惑 JQuery 模板等客户端模板解决方案与 Jade for Node js 等服务器端解决方案之间有什么区别 各有什么用途 它们用在哪里 它们可以一起使用吗 如果有的话 有没有两
  • 使用“IN”命令将数组作为参数传递给 SQL 查询

    大家下午好 我有一个关于 SQL 查询的问题 是否可以使用数组作为使用 IN 命令的查询的参数 例如 int x 2 3 4 5 UPDATE table name set field 数据 WHERE field ID IN x 我问这个
  • Auth.net 捕获问题

    我在 auth net 上捕获交易的函数是 public function capture Varien Object payment amount if this gt isEnabled return parent capture pa
  • 带地址的 R 地理编码

    我有 32K 行地址 我必须为其查找长 纬度值 我正在使用找到的代码here http www storybench org geocode csv addresses r 我非常感谢这个人创造了它 但我有一个问题 我想对其进行编辑 以便如
  • pthread_create 的钩子

    是否有 在 glibc 2 5 及更新版本中 为 pthread create 定义钩子的方法 有很多二进制应用程序 我想编写一个动态库通过 LD PRELOAD 加载 我可以在 main 属性构造函数 的入口处添加钩子 但是如何强制我的代
  • 如何在Stream上短路reduce?

    假设我有一个布尔值流 并且我正在编写的归约操作是 或者 我能否以一种方式编写它 以便在以下情况下放弃至少某些元素的评估 true遇到的值是 我正在寻找一定程度的优化 也许如果它是并行流 不一定是完全优化 尽管后者会很棒 我怀疑你想要这种类型
  • 如何使新的 html 5 datalist 输入立即打开?

    问题很难理解 英语不是我的母语 我会尽力而为 所以新的html标签
  • 在 SDL Tridion 2011 发布期间提出“警告”状态

    我们希望实现一些功能 以便当由于某种原因在发布或解决过程中发生错误时 我们可以使用 try catch 块跳过它 但仍然希望通知用户某些内容被跳过 SDL Tridion 2011 发布队列可以按状态进行过滤 这些状态之一是 警告 是否可以
  • npmauditfix --force 改变了什么以及如何修复它?

    我试图npm install apn save并使用npm audit fix force 希望你知道自己在做什么 的信息让我意识到我不知道自己在做什么 之后我原本得到 node home ec2 user myapp bin www sy
  • P4 - 为客户更改工作空间

    我想使用 p4 命令行更改工作区客户端 但我不知道是否可能 您可以使用 p4workspace 命令创建 删除或编辑工作区 但我想使用 bat 方法更改当前工作区 示例 p4 c MyClient 更改工作空间 myNewWorkspace
  • Ubuntu 14.04:升级到 php7 并卸载 php5?

    我正在将基于 Ubuntu 14 04 的 docker 映像中的 php 版本升级到 7 0 我读了一些文章 给出了在安装 php7 0 时卸载 php5 的命令 这真的有必要吗 优缺点都有什么 添加 PHP 7 的新存储库 apt ge
  • 在 Django 中,如何在组添加或删除用户时获取信号?

    在 Django 管理中 我有时会向 现有 组添加或删除用户 当发生这种情况时 我希望能够运行一个函数 我只是使用标准的用户和组模型 我已经考虑过通过 m2m changed 使用信号来完成此操作 但似乎需要一个 Through 类 我认为
  • gdfs 到图表,反之亦然

    当我使用python的时候会发生以下情况osmnx如下 graph osmnx graph from polygon Data bbox gdf nodes gdf edges osmnx save load graph to gdfs g
  • lua:关于本地范围的模块导入

    有两个脚本文件 脚本如下 parent lua function scope local var abc require child end child lua print var 这样 child lua 将打印 nil 值 因为 Par
  • Android:将位图从本地存储加载到应用程序小部件(RemoteViews)

    到目前为止 我一直在将位图加载到我的RemoteViews直接使用remoteViews setImageViewBitmap 总体来说运行良好 但有几个用户遇到了问题 我认为是在加载非常大的位图时出现的 无论如何 我已经将位图缓存到本地存