16

I have been trying to follow the Android tutorial on sharing files. I set up the FileProvider like this:

On the main manifest xml:

<provider
            android:name="android.support.v4.content.FileProvider"
            android:authorities="com.example.mysecondapp.fileprovider"
            android:exported="false"
            android:grantUriPermissions="true" >
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/filepaths" />
        </provider>

the res/xml/filpaths.xml file:

<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <external-path name="myexternalimages" path="SpCars_album/" />
</paths>

And in my code I am trying the following:

File requestFile = new File(mImageFilenames[position]);
                try {
                    fileUri = FileProvider.getUriForFile(
                            SeventhActivity.this,
                            "com.example.mysecondapp.fileprovider",
                            requestFile);
                } catch (IllegalArgumentException e) {
                    Log.e("File Selector",
                            "The selected file can't be shared: " +
                                    mImageFilenames[position]);
                }

The requestFile is instantiated with a proper working path for a file. The path of that file begins exactly with what getExternalFilesDir(Environment.DIRECTORY_PICTURES) returns. I just cant understand what raises the error because everything seems to fit. Thanks in advance.

4

4 回答 4

24

该文件的路径完全以 getExternalFilesDir(Environment.DIRECTORY_PICTURES) 返回的内容开始。

AFAIK,这不会给你一个名为SpCars_album/.

我只是不明白是什么引发了错误,因为一切似乎都合适。

FileProvider您提供的文件不是您定义的根可以提供的文件。


更新

我忘记了FileProvider这与. FileProvider并且<external-path>提供来自 的文件getExternalFilesDir(),而是来自Environment.getExternalStorageDirectory(). 我创建了一个StreamProvider支持getExternalFilesDir().

如果您使用 my StreamProvider,将 your 替换<external-path><external-files-path name="myexternalimages" path="Pictures/SpCars_album/" />,您应该会有更好的运气。

于 2013-12-08T15:30:33.293 回答
9

这是一个古老的问题,但我刚刚遇到了类似的问题。

我发现一个懒惰的解决方案是只使用:

<external-path name="myexternalimages" path="Android/" />

因为 getExternalStorageDirectory 返回“/storage/emulated/0/”,共享 /Android(下一级)将允许访问您应用程序中的任何文件。

或者,如果你想更精确,你可以这样做:

<external-path name="myexternalimages" path="Android/data/YOUR_BUNDLE_ID/files/SpCars_album" />

这感觉不太对劲,但似乎确实有效!

于 2015-12-10T16:46:29.073 回答
0

在我的情况下,添加implementation 'com.android.support:support-v4:28.0.0'到应用程序 gradlle 依赖项中有效。请相应地更改 SDK 平台版本(在我的情况下为 28.0.0)。

于 2018-12-10T17:05:47.237 回答
-8

如果您不尝试将异常捕获为 FileProvider.getUriFoFile() 的 IllegalArgumentException,那么当您运行代码时,您也会遇到此异常。

try {
     Uri uriForFile = FileProvider.getUriForFile(this,"com.fengfutong.bluetoothc2s.fileprovider", f);
} catch (IllegalArgumentException e) {
     e.printStackTrace();
}
于 2017-03-21T01:10:18.200 回答