用于ext sdcard的Android FileProvider

std*_*out 6 android sd-card android-fileprovider

我正在使用FileProvider将我的内部文件暴露给Gallery.为了使它更加统一,我还将我的外部文件放入提供程序(通过外部路径),但对于可移动SD卡中的文件,它不起作用.说这个文件夹之类的东西没有被授权.

任何帮助将不胜感激.

谢谢

Sid*_*kar 19

我在我的XML中添加了@Gubatron建议的这个根路径并且它有效.

<?xml version="1.0" encoding="utf-8"?>
<paths>
    <external-path name="external_files" path="."/>
    <root-path name="external_files" path="/storage/" />
</paths>
Run Code Online (Sandbox Code Playgroud)


dan*_*nik 7

我们来看看FileProvider代码:

    private static PathStrategy parsePathStrategy(Context context, String authority)
        ...
        int type;
        while ((type = in.next()) != END_DOCUMENT) {
            if (type == START_TAG) {
                final String tag = in.getName();
                final String name = in.getAttributeValue(null, ATTR_NAME);
                String path = in.getAttributeValue(null, ATTR_PATH);
                File target = null;
                if (TAG_ROOT_PATH.equals(tag)) {
                    target = buildPath(DEVICE_ROOT, path);
                } else if (TAG_FILES_PATH.equals(tag)) {
                    target = buildPath(context.getFilesDir(), path);
                } else if (TAG_CACHE_PATH.equals(tag)) {
                    target = buildPath(context.getCacheDir(), path);
                } else if (TAG_EXTERNAL.equals(tag)) {
                    target = buildPath(Environment.getExternalStorageDirectory(), path);
                }
                if (target != null) {
                    strat.addRoot(name, target);
                }
            }
        }
        return strat;
    }
Run Code Online (Sandbox Code Playgroud)

FileProvider通过标记root-path(DEVICE_ROOT常量)帮助接受目录的绝对路径.因此,只需在辅助外部光盘中添加文件夹的绝对路径,如下所示:

<root-path path="/storage/extSdCard/Android/data/com.edufii/files/image/" name="image-ext2" />
<root-path path="/storage/extSdCard/Android/data/com.edufii/files/video/" name="video-ext2" />
<root-path path="/storage/extSdCard/Android/data/com.edufii/files/datafile/" name="datafile-ext2" />
<root-path path="/storage/extSdCard/Android/data/com.edufii/files/audio/" name="audio-ext2" />
Run Code Online (Sandbox Code Playgroud)

注意官方文档没有说明任何内容<root-path>,因此将来可能会有所改变.


Der*_*ung 1

从android 4.4开始,普通应用程序不允许访问辅助外部存储设备,即sd卡,除非在其特定于包的目录中,即使您已请求WRITE_EXTERNAL_STORAGE权限。

WRITE_EXTERNAL_STORAGE 权限必须仅授予对设备上的主外部存储的写访问权限。不得允许应用程序写入辅助外部存储设备,除非合成权限允许在其特定于包的目录中。以这种方式限制写入可确保系统可以在卸载应用程序时清理文件。

https://source.android.com/devices/storage/