我将尝试通过经典的Intent
分享一张图片。我已经添加了以下内容:
file_paths.xml:
<?xml version="1.0" encoding="utf-8"?>
<paths>
<files-path name="my_images" path="." />
</paths>
清单:
<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: Failed to find configured root that contains /data/data/shoedrobe.innovativeproposals.com.shoedrobe/app_flutter/userphotos/receipt20181101094430.jpg
为了保存图像,我使用 path_provider 包,并将项目保存在 getApplicationDocumentsDirectory() 下,在 Android 中为 AppData 目录。
我不确定为什么 FileProvider 突然决定从 /data/user/0/ 转到 /data/data/ 文件夹,因此任何有关此事的帮助或提示将不胜感激。
更新: 我已经按推荐更新了代码,并在 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 文件上吗?
dataDir
更改为Flutter源代码中的Context.getDir()
。 - Carol Ng