首页 文章

颤动共享图像意图

提问于
浏览
2

我试图通过经典 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 回答

  • 0

    Under the hood,Flutter的 getApplicationDocumentsDirectory() 正在使用getDir()而不是 dataDir ,这可能会有所不同 .

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

    返回文件系统上目录的绝对路径,其中存储了属于此应用程序的所有私有文件 . 应用不应直接使用此路径;他们应该在此类上使用getFilesDir(),getCacheDir(),getDir(String,int)或其他存储API . 如果将调用应用程序移动到已采用的存储设备,则返回的路径可能会随时间发生变化,因此只应保留相对路径 .

    因此,为了确保用于通过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> 替换为存储应用程序上下文的变量(如果有) .

  • 0

    最后,提议的解决方案都没有起作用;既不使用 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));
    

相关问题