我正在寻找一种方法,使用Android支持库的FileProvider正确地与外部应用程序共享(而不是OPEN)内部文件.
按照文档上的示例,
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="com.example.android.supportv4.my_files"
android:grantUriPermissions="true"
android:exported="false">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/my_paths" />
</provider>
Run Code Online (Sandbox Code Playgroud)
并使用ShareCompat将文件共享给其他应用程序,如下所示:
ShareCompat.IntentBuilder.from(activity)
.setStream(uri) // uri from FileProvider
.setType("text/html")
.getIntent()
.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
Run Code Online (Sandbox Code Playgroud)
不起作用,因为FLAG_GRANT_READ_URI_PERMISSION仅授予data对intent 指定的Uri的权限,而不授予EXTRA_STREAMextra 的值(由set设置setStream).
我试图通过设置成安全android:exported到true的供应商,但FileProvider在内部检查,如果本身是出口,所以时,它抛出一个异常.
android android-contentprovider android-support-library android-fileprovider
由于某种原因,我真的很挣扎,希望有人能帮助我指明正确的方向。
我的目标是 Android 11 / API 30,这似乎是所有问题的根源。降低目标可能对我有用——但谷歌似乎最终会迫使我走上这条路,所以我不妨弄清楚这一点。
我的应用程序通常会按照标准写入文件
getExternalFilesDir(null)
Run Code Online (Sandbox Code Playgroud)
这给了我设备上的一条路径
/storage/emulated/0/Android/data/com.domain.testapp/files
Run Code Online (Sandbox Code Playgroud)
我还尝试了其他类型,例如:
getExternalFilesDir(Environment.DIRECTORY_PICTURES)
Run Code Online (Sandbox Code Playgroud)
结果是
/storage/emulated/0/Android/data/com.domain.testapp/files/Documents
Run Code Online (Sandbox Code Playgroud)
我的应用程序实际上将文件写入此位置没有任何问题。在 Android 11 中,我必须使用本地文件浏览器跳过一些麻烦才能查看这些文件 - 但它们确实存在于设备上。
我现在试图为用户提供一些查看文件和共享文件的能力,这就是我所困惑的地方!
下面的代码导致找不到文件
File filePath = this.getExternalFilesDir(null);
String filePathString = filePath.toString();
ArrayList<String> myData = new ArrayList<>();
File fileDir = new File(filePathString);
String[] files = fileDir.list();
if(files.length == 0){
Log.w(APPID, "NO FILES IN FOLDER");
}
Run Code Online (Sandbox Code Playgroud)
是的 - 我知道不需要 File 和 .toString() - 但我每一步都将它们注销,因为我认为我疯了。
我知道这个应用程序指向的文件夹中有十几个左右的文件。该应用程序创建了文件。不是应该能看到文件夹里的文件吗???
Manifest 具有以下权限 - 我认为它不需要全部:
<uses-permission android:name = "android.permission.MANAGE_EXTERNAL_STORAGE"/>
<uses-permission android:name = "android.permission.WRITE_EXTERNAL_STORAGE"/>
Run Code Online (Sandbox Code Playgroud)
没有权限显示为应用程序被拒绝
我想过使用外部存储 - 但似乎这在 Android …
Android 11 中引入了范围存储。根据文档,应使用保存非媒体文件(如 PDF)的存储访问框架。因此,使用存储访问框架的用户需要使用系统文件选择器选择位置来保存非媒体文件(PDF)。但是如果您在 Android 11 上使用 Whatsapp 应用程序并尝试保存 PDF 文件,它永远不会要求用户选择位置。默认情况下,它将保存 pdf 文件到外部文档目录。我想在我的应用程序中复制相同的行为。有人可以在这里指导我吗?