Flutter 分享图像意图

Flutter share image intent

我正在尝试通过经典 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 文件上吗?

Under the hood, Flutter's getApplicationDocumentsDirectory() is using getDir() 而不是 dataDir,这可能不同。

来自 getDataDir() 上的 Android 文档,相当于 this.getApplicationInfo().dataDir:

Returns the absolute path to the directory on the filesystem where all private files belonging to this app are stored. Apps should not use this path directly; they should instead use getFilesDir(), getCacheDir(), getDir(String, int), or other storage APIs on this class.

The returned path may change over time if the calling app is moved to an adopted storage device, so only relative paths should be persisted.

因此,为了保证Flutter保存图片的目录和FileProvider获取文件的目录一致,可以修改MainActivity.java中的getUriForFile行像这样:

FileProvider.getUriForFile(this, "com.example.android.fileprovider", new File(<your application context>.getDir("flutter", Context.MODE_PRIVATE).getPath() + "/app_flutter/userphotos", fileName));

...将 <your application context> 替换为存储应用程序上下文的变量(如果有)。

最后,none 个建议的解决方案没有奏效;既不使用 extenal-path,也不使用其他解决方案。

我最终共享文件的方式是首先将其实际复制到临时(缓存)目录(在 flutter path_provider 中是 getTemporaryDirectory())并更新 file_paths.xml 以下:

<cache-path name="image" path="."/>

最后在MainActivity.java下:

Uri uri = FileProvider.getUriForFile(this, "com.example.android.fileprovider", new File(this.getCacheDir(), path));