问题标签 [android-fileprovider]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
10 回答
164618 浏览

android - 如何使用支持 FileProvider 将内容共享给其他应用程序?

我正在寻找一种使用 Android 支持库的FileProvider与外部应用程序正确共享(而不是打开)内部文件的方法。

按照文档上的示例,

并使用 ShareCompat 将文件共享给其他应用程序,如下所示:

不起作用,因为 FLAG_GRANT_READ_URI_PERMISSION 仅授予对data意图指定的 Uri 的权限,而不是EXTRA_STREAM额外的值(由 设置setStream)。

我试图通过设置为提供程序来破坏安全性android:exportedtrue但在FileProvider内部检查自身是否被导出,如果是,它会引发异常。

0 投票
2 回答
8583 浏览

android - FileProvider 的 Hello-World

这个问题包含几个子问题。我从这个问题开始分叉这些。我最终会通过删除这个问题来清理。

以下程序理论上将共享一个 hello-world 文本文件。代码运行,但共享到 Dropbox 或 Gmail(仅通过两个具体示例)失败。

除了send_to在 r​​es/values/strings.xml 中添加值之外,我对 Eclipse 创建的泛型所做的唯一另一对更改是在 AndroidManifest.xmlHello, World中添加以下标记:<provider>

...并在 res/xml/my_paths.xml 中添加以下内容

我的主要问题是第一个,但是当你在这个话题上时,对问题 2-4 的讨论也会很有趣。

  1. 为什么上面的程序会失败?
  2. 确实是这样的情况,如果一个人需要一个 custom ContentProvider,那么一个人需要扩展那个类,但是如果一个人只需要一个FileProvider,那么一个人可以在没有派生的情况下使用那个类?
  3. 在这段代码中,我需要使用filename两次——一次 with openFileOutput,另一次 with new File()。有没有办法避免这种重复(这可以保证引用的是同一个文件)?
  4. 在调用后立即删除文件是否安全startActivity(..),或者是否有必要设计一个回调来等待得知文件已上传/共享。(实际文件可能需要一些时间才能共享/上传。)

编辑

该代码运行良好,并显示了要发送到的应用程序列表。

如果我选择 Dropbox,我可以很好地选择位置。Dropbox 发送通知“上传到 Dropbox”,然后是“上传失败:my_file.txt”。

如果我选择 Gmail,我可以填写收件人并且文件似乎已附加,但在“发送消息..”之后我得到“无法发送附件”。

0 投票
1 回答
3625 浏览

android - 使用 FileProvider 共享缓存的图像

我有一个应用程序,它使用Universal Image Loader从 Internet 下载照片,将它们缓存到 data/data/com.myapp/cache 并显示在 ImageViews 中。

我还想在我的应用程序中添加共享(WhatsApp、Facebook、Instagram、Dropbox 等),所以我尝试使用以下代码:

photoUri 是缓存文件夹中的 uri,其他应用程序无权读取。

所以我用谷歌搜索/stackoverflow发现我需要使用 FileProvider。

我在清单中将 FileProvider 配置如下(如此处所述):

和 file_paths.xml:

然后我在按钮 onClickListener 的活动中使用以下代码:

但是,根据应用程序,我会遇到奇怪的异常。像这样:

或者我只是看到这样的日志:

当然,应用程序本身会给我带来错误(他们无法打开或下载文件)。

我试过,用谷歌搜索,stackoverflowed A LOT,所以现在我在这里发帖。我想我做对了,也许只是一些小事情是错的......

任何帮助将不胜感激!

0 投票
1 回答
1712 浏览

android - 可以在 flex 本机扩展中使用共享内部文件(例如使用 FileProvider)到其他应用程序

作为 Adob​​e Flex 应用程序的一部分,我正在编写一个 android 本机扩展程序,以允许我使用从 flex 代码生成的文件发送带有文件附件的电子邮件。但是我不希望该文件是世界可读的,因为它可能包含敏感数据。因此,我想从我的应用程序的内部存储区域/缓存中发送文件。我正在使用 Intents 与其他应用程序(例如 Gmail)进行通信以发送电子邮件。

经过一番研究,我发现FileProviders的功能应该完全符合我的要求。然而,静态方法FileProvider.getUriForFile()默默地失败/崩溃了本机扩展。本机扩展停止并返回 null,没有错误或 LogCat 输出。

如果我通过解析字符串手动创建 Uri,Gmail 会抱怨它无法将文件附加到电子邮件中,并且发送的电子邮件没有附件。

FREObject call() 中的代码:

在清单文件中:

在 my_paths.xml 中:

LogCat 输出:

如果我尝试使用 file:// Uri 从外部存储发送文件,则文件附件可以正常工作。但是,如前所述,文件附件可能包含敏感数据,因此我希望避免使用外部存储。

我相信我看到的是 FileProviders 在本机扩展中不起作用。我也尝试使用 ContentProvider,但是没有调用 Constructor 和 onCreate 方法。

内容提供者清单:

我的内容提供者:

我做错了什么还是 flex 原生扩展不支持 ContentProviders / FileProviders?或者,是否有任何其他解决方案可以将位于内部存储中的文件附加到电子邮件中。我在 SO 和 google 上的搜索没有遇到其他人有类似经历,尤其是关于 FileProvider.getUriForFile()。任何帮助/意见表示赞赏。

对不起,文字墙,我想记录到目前为止我尝试过的所有内容,以及哪些有效,哪些无效。

tldr; ContentProviders / File Providers 是否在 flex 原生扩展中工作?是否有任何其他方法可以将内部文件作为电子邮件附件发送?

0 投票
1 回答
435 浏览

mediastore - Share image with FileProvider or MediaStore

I have to following problem. I want to share an image using intent chooser to the as many apps as possible. To achieve that I have two options:

  1. Save the image to MediaStore. But that means that image will show up in the gallery without user's granting it.

  2. Or share the image using using FileProvider. But if I use FileProvider some apps don't work and throw the following exception:

java.lang.IllegalStateException: Couldn't read row 0, col 0 from CursorWindow. Make sure the Cursor is initialized correctly before accessing data from it. at android.database.CursorWindow.nativeGetLong(Native Method) at android.database.CursorWindow.getLong(CursorWindow.java:507) at android.database.AbstractWindowedCursor.getLong(AbstractWindowedCursor.java:75) at android.database.CursorWrapper.getLong(CursorWrapper.java:106) at ehz.a(PG:175) at duj.a(PG:540) at com.google.android.apps.photos.phone.SendContentActivity.onClick(PG:177) at com.android.internal.app.AlertController$ButtonHandler.handleMessage(AlertController.java:166) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:137) at android.app.ActivityThread.main(ActivityThread.java:4998) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:515) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:777) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:593) at dalvik.system.NativeStart.main(Native Method)

Working FileProvider would be perfect for me because with .nomedia option I can hide the image from Gallery and still share image to all the other apps.

Did anyone manage to solve this? Is there another option to share an image that can be accessed to all the other apps?

Thanks

0 投票
0 回答
259 浏览

android - Android:将文件从“文档”文件夹以只读方式传递给外部应用程序

我的应用程序会在外部应用程序中打开一些文件以进行编辑。在某些情况下,外部应用程序可以保存文件,在其他情况下,应用程序无法保存文件。该文件是“文档”文件夹中的普通文件,因此它不是私有的,也不是只读的。但是我的应用程序需要以编程方式决定是将其作为可写还是只读传递。当文件必须对外部应用程序可写时,我使用 Intent.ACTION_VIEW 的意图。我可以在只读情况下使用什么?也许是 FileProvider,但它似乎是用于私人文件的。

0 投票
2 回答
17003 浏览

pdf - Android Fileprovider: IllegalArgumentException: 未能找到配置的根目录包含

我有一个关于 android FileProvider 的问题。我想保存一个 pdf 文档并使用默认程序打开它。我不想将其保存在外部存储中。

在我成功地将 pdf 保存到 FilesDirectory/export/temp.pdf 之后,
我尝试使用 FileProvider.getUriForFile() 生成一个 URI。

问题:我必须传递什么作为第二个参数“权限” - 我的文件的位置、可以授予 URI 权限的类或其他什么?无论我尝试过什么都会导致 IllegalArgumentException 或 NullPointerException。我的文件提供者(XML):

参考文件:

0 投票
4 回答
22559 浏览

android - IllegalArgumentException: Failed to find configuration root that contains xxx on FileProvider.getUriForFile

I have been trying to follow the Android tutorial on sharing files. I set up the FileProvider like this:

On the main manifest xml:

the res/xml/filpaths.xml file:

And in my code I am trying the following:

The requestFile is instantiated with a proper working path for a file. The path of that file begins exactly with what getExternalFilesDir(Environment.DIRECTORY_PICTURES) returns. I just cant understand what raises the error because everything seems to fit. Thanks in advance.

0 投票
2 回答
40203 浏览

android - 与 FileProvider 共享文件时出现 GrantUriPermission 的 SecurityException

我有两个应用程序。我正在尝试使用 FileProvider 将文件从应用程序 A 共享到应用程序 B。应用程序 A 在应用程序 B 中调用 ContentProvider 上的 insert 方法来插入记录。插入的数据包括我要从 App A 共享的文件的 Uri。然后,App B 中的 ContentProvider 将尝试从 App A 读取共享文件。由于我没有使用 Intent 来共享文件,所以我调用Context.grantUriPermissionApp A 以允许读取(有时写入):

但是,执行此行给了我(更改名称以保护无辜者):

应用 A 在 Manifest 文件中有以下内容:

filepaths.xml 有:

App A 和 App B 都有以下内容:

我已经尝试在两个应用程序中定义权限。它们都使用相同的调试签名进行签名:

文件最终的实际路径是:

在这一点上,我很难过。我不知道为什么我不能授予我刚刚在同一个应用程序中创建的文件的权限。所以我的问题是:为什么我会得到这个例外,我怎样才能成功地向 App B 授予权限?

0 投票
1 回答
959 浏览

android - 未找到处理数据 Uri 的活动

基本上,我想根据用户提供给我的应用程序的一些数据生成报告。我的第一个想法是生成一个 PDF 文件。事实证明这是不可行的,因为唯一的免费库不支持文本换行等功能,而付费库的许可证成本约为 1000 美元。

所以我生成了一个包含所有内容的 html 文件,如果我在桌面 Chrome 中打开这个文件,它会呈现正常。当用户单击共享按钮时,应用程序应启动一个意图,以获取默认浏览器或移动 Chrome 以打开 html 文件。

我知道如何通过意图用浏览器打开一个 url,问题是打开一个文件。正在通过 FileProvider 访问 HTML 文件(因此是 uri,例如:“content://[package].fileprovider/[filename].html”)。如果我运行myIntent.setData(htmlFileUri);并启动意图,对话框中不会显示任何浏览器,只有文本编辑器。如果我使用setDataAndType.

接下来我尝试了一个 Data Uri: data:text/html;base64,[html as base64]。同样,如果我将此字符串复制到桌面 Chrome 中,它可以正常工作。但是,如果我用这个 uri 开始一个意图,我会得到

android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.VIEW dat=data:text/html;base64,[base64]== typ=text/html }.

最后,如果我附加http://到数据 uri 的开头,我可以选择打开 chrome 或默认浏览器。如果我这样做,则不会呈现任何内容,甚至页面 url 也不会呈现。

还有什么我可以尝试的,或者有什么一般的建议吗?提前致谢