颤抖分享图像意图

时间:2018-11-01 10:50:09

标签: android android-intent flutter android-fileprovider

我正在尝试通过经典的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:无法找到已配置的根   包含   /data/data/shoedrobe.innovativeproposals.com.shoedrobe/app_flutter/userphotos/receipt20181101094430.jpg

要保存图像,我使用的是软件包 path_provider ,并且我将项目保存在 getApplicationDocumentsDirectory(),在Android中为AppData目录。

我不确定为什么FileProvider突然决定从/data/user/0/转到/data/data/文件夹,因此,对此问题的任何帮助或提示将不胜感激。

更新
我已经按照建议更新了代码,并用以下行替换了Uri下的MainActivity.java

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 个答案:

答案 0 :(得分:0)

Under the hood,Flutter的getApplicationDocumentsDirectory()使用的是getDir()而不是dataDir

摘自getDataDir()上的Android文档,该文档等效于this.getApplicationInfo().dataDir

  

返回文件系统上目录的绝对路径,该目录存储了属于该应用程序的所有私有文件。 应用程序不应直接使用此路径;他们应该在此类上使用getFilesDir(),getCacheDir(),getDir(String,int)或其他存储API。

     

如果将调用的应用程序移至采用的存储设备,返回的路径可能会随时间改变,因此应仅保留相对路径。

因此,为了确保Flutter用于保存图像的目录与用于通过FileProvider检索文件的目录之间的一致性,可以像这样修改getUriForFile中的MainActivity.java行:

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>

答案 1 :(得分:0)

最后,所有提议的解决方案均无效。既不使用extenal-path,也不使用其他解决方案。

我最终管理文件共享的方式是首先将其实际复制到一个临时(缓存)目录(在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));