我已经提到了this指南。
我想创建一个文件夹,说" XYZ"在SD卡的根目录。 请考虑以下代码:(内部或外部SD卡上不存在XYZ文件夹)
private void aaskForAppyStoreFolderPermission(){
if(FWCompat.isNougat_24_OrNewer()){
StorageManager sm = (StorageManager)getSystemService(Context.STORAGE_SERVICE);
File f = new File("/XYZ");
StorageVolume extStorage = sm.getStorageVolume(f);
if(extStorage != null) {
Intent intent = extStorage.createAccessIntent(null);
startActivityForResult(intent, 100);
}
}
}
但这并没有显示任何用于访问XYZ文件夹的弹出窗口。 现在即使我手动创建一个文件夹并再次使用" / XYZ"或" / storage / emulated / 0"或" / storage / 459-C045 / XYZ"路径。它仍然无效。
但是,如果我尝试访问整个外部存储卡:如下所示它显示弹出窗口,但消息说你是否希望授予访问完整的SD卡(这是正确的但不是我需要的。当我只想访问一个特定的文件夹(可能存在也可能不存在)) 访问整个存储卡的代码:
private void askForAppyStoreFolderPermission(){
if(FWCompat.isNougat_24_OrNewer()){
StorageManager sm = (StorageManager)getSystemService(Context.STORAGE_SERVICE);
List<StorageVolume> volumeList = sm.getStorageVolumes();
if(volumeList != null && volumeList.size() > 0){
StorageVolume extStorage = volumeList.get(volumeList.size() - 1);
if(extStorage != null) {
Intent intent = extStorage.createAccessIntent(null);
startActivityForResult(intent, 100);
}
}
}
}
答案 0 :(得分:0)
Here它显示了您可以访问的目录:
我想做你想做的事情(在根目录下读/写一个文件夹,如果它不存在则创建),不幸的是它是其中之一或根本SD卡(带createAccessIntent(null)
)。
然后,您可以在那里搜索树以查看您的文件夹是否存在,如果它不存在,则可以通过执行以下操作直接在根目录中创建它:
Uri u = myintent.getData(); //pass this in onActivityResult(...)!
DocumentFile wholeSD = DocumentFile.fromTreeUri(myContext,u);
DocumentFile myFolder = wholeSD.findFile("myfolder");
if(myFolder.exists()) {
if(myFolder.isDirectory()) {
doStuff();
}
} else {
wholeSD.createDirectory("myFolder");
}
您也可以尝试获取SD卡的实际路径(请参阅this问题中的答案),但不保证它可以在每部手机上工作,而且您只能获得读取访问权限 - 只要您尝试编写类似于普通外部存储(不可移动/内置)的内容,它就可能会为您提供“无法访问”#34;异常。