我使用FileProvider将我的内部文件公开给了Gallery。为了使它更加统一,我还将我的外部文件放入提供程序(通过外部路径),但对于可移动SD卡中的文件,它不起作用。说不喜欢那个文件夹。
非常感谢任何帮助。
THX
答案 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 documentation对from 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权限只能授予对其的写访问权限 设备上的主要外部存储。不得允许应用 写入辅助外部存储设备,除了它们 特定于程序包的目录,由合成权限允许。 以这种方式限制写入可确保系统可以清理文件 何时卸载应用程序。
答案 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