用于ext sdcard的Android FileProvider

时间:2015-09-01 13:35:44

标签: android sd-card android-fileprovider

我使用FileProvider将我的内部文件公开给了Gallery。为了使它更加统一,我还将我的外部文件放入提供程序(通过外部路径),但对于可移动SD卡中的文件,它不起作用。说不喜欢那个文件夹。

非常感谢任何帮助。

THX

6 个答案:

答案 0 :(得分:13)

我按照@Gubatron的建议在我的XML中添加了这个根路径,它确实有效。

<?xml version="1.0" encoding="utf-8"?>
<paths>
    <external-path name="external_files" path="."/>
    <root-path name="external_files" path="/storage/" />
</paths>

答案 1 :(得分:7)

让我们看看FileProvider代码:

root-path

<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" /> 在标记<root-path>(DEVICE_ROOT常量)的帮助下接受了目录的绝对路径。因此,只需在辅助外部光盘中添加文件夹的绝对路径,如下所示:

class MyModel2(mongoengine.EmbeddedDocument):
     sn = mongoengine.StringField()
     # more fields

class MyModel(mongoengine.DynamicDocument):
    field1 = mongoengine.StringField(unique=True)
    field2 = mongoengine.DateTimeField()
    field3 = mongoengine.BooleanField()
    field4 = mongoengine.EmbeddedDocumentField(MyModel2)

注意official documentationfrom rest_framework_mongoengine.serializers import DynamicDocumentSerializer class MyModelSerializer(DynamicDocumentSerializer): class Meta: model = MyModel fields = ('field1', 'field4') 没有任何说法,因此将来可能会发生变化。

答案 2 :(得分:1)

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

  

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

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

答案 3 :(得分:0)

FileProvider不支持辅助外部存储(如可移动SD卡)。这在Android 7及更高版本中更是一个问题 - 因为您不能再使用file:// uris了。

我已经发布了错误报告here

答案 4 :(得分:0)

我不完全确定原因,但root-path对我不起作用。此外,它没有记录,所以在某些时候可能会突然消失。所以我最终使用了以下内容。

<external-files-path name="external_files_path" path="/"/>

File file = new File(getActivity().getExternalFilesDir(null), "hello.txt");

该文件存储在/storage/emulated/0/Android/data/MY_APP/files/hello.txt,这是我应用在SD卡中的存储位置。

答案 5 :(得分:0)

访问外部sdcard。 首先调用uri.getEncodedPath()以获取编码路径

  

”   /external_files/3161-3330/WhatsApp/Media/WhatsApp%20Documents/All%20Currency.pdf   “

然后使用以下逻辑获取外部存储的文件路径

public String getFilePath(){
    if (isKitKat && DocumentsContract.isDocumentUri(mContext, uri)) {
                // ExternalStorageProvider
                if (com.android.externalstorage.documents".equals(uri.getAuthority())) {
                    final String docId = DocumentsContract.getDocumentId(uri);
                    final String[] split = docId.split(":");
                    final String type = split[0];

                    if ("primary".equalsIgnoreCase(type)) {
                        return Environment.getExternalStorageDirectory() + "/" + split[1];
                    } else {
                        return "/storage" + "/" + split[0] + "/" + split[1];
                    }
               }
    }
}

getFilePath()将给出:

  

/ storage / emulated / 0 / 3161-3330 / WhatsApp / Media / WhatsApp文档/全部   货币.pdf

uri路径以

开头
  

/ external_files /

,文件路径以

开头
  

/存储/

因此,我们必须在第

行下方添加
 <root-path name="external_files" path="/storage/" />

  

@ xml / provider_paths.xml