我试图通过经典 Intent
分享图像 . 我添加了以下项目:
file_paths.xml:
<?xml version="1.0" encoding="utf-8"?>
<paths>
<files-path name="my_images" path="." />
</paths>
Manifest:
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="com.example.android.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
</provider>
最后 MainActivity.java:
private void shareFile(String fileName) {
Intent share = new Intent(Intent.ACTION_SEND);
Uri uri = FileProvider.getUriForFile(this, "com.example.android.fileprovider", new File(this.getApplicationInfo().dataDir + "/app_flutter/userphotos", fileName));
share.setData(uri);
share.setType("image/png");
share.putExtra(Intent.EXTRA_STREAM, uri);
share.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
startActivity(Intent.createChooser(share, "Share"));
}
我面临的问题是我想分享的图片有以下路径:
/data/user/0/shoedrobe.innovativeproposals.com.shoedrobe/app_flutter/userphotos/receipt20181101094430.jpg
但是 FileProvider
正试图从这里访问它:
java.lang.IllegalArgumentException:无法找到包含/data/data/shoedrobe.innovativeproposals.com.shoedrobe/app_flutter/userphotos/receipt20181101094430.jpg的已配置根目录
为了保存图像,我正在使用包 path_provider ,我在 getApplicationDocumentsDirectory()
下保存项目,在Android中是AppData目录 .
我不确定为什么 FileProvider
突然决定从 /data/user/0/
到 /data/data/
文件夹,因此任何有关此事的帮助或提示都将受到高度赞赏 .
Update:
我已根据建议更新了代码,并使用以下行替换 MainActivity.java
下的 Uri
:
Uri uri = FileProvider.getUriForFile(this, "com.example.android.fileprovider", new File(this.getDir("flutter", Context.MODE_PRIVATE).getPath() + "/app_flutter/userphotos", path));
尽管如此,问题仍然存在(同样的例外,文件应该在 /data/data/<package>
而不是 /data/user/0
. 我还尝试在我的AndroidManifest中添加额外的延迟:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
但它没有奏效 . 问题出在我的 file_paths.xml 文件中吗?
2 回答
Under the hood,Flutter的
getApplicationDocumentsDirectory()
正在使用getDir()而不是dataDir
,这可能会有所不同 .来自getDataDir()上的Android文档,相当于
this.getApplicationInfo().dataDir
:因此,为了确保用于通过Flutter保存图像的目录与用于通过
FileProvider
检索文件的目录之间的一致性,MainActivity.java
中的getUriForFile
行可以像这样修改:...将
<your application context>
替换为存储应用程序上下文的变量(如果有) .最后,提议的解决方案都没有起作用;既不使用
extenal-path
,也不使用其他解决方案 .我最终如何管理共享文件的方法是首先将它实际复制到临时(缓存)目录(在flutter
path_provider
中它是getTemporaryDirectory()
)并将file_paths.xml
更新为以下内容:最后在
MainActivity.java
下: