Android - Scoped目录访问 - 访问不存在的文件夹

时间:2017-09-14 10:19:04

标签: android

我已经提到了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);
            }
        }
    }
}

1 个答案:

答案 0 :(得分:0)

Here它显示了您可以访问的目录:

  • DIRECTORY_ALARMS
  • DIRECTORY_DCIM
  • DIRECTORY_DOCUMENTS
  • DIRECTORY_DOWNLOADS
  • DIRECTORY_MOVIES
  • DIRECTORY_MUSIC
  • DIRECTORY_NOTIFICATIONS
  • DIRECTORY_PICTURES
  • DIRECTORY_PODCASTS
  • DIRECTORY_RINGTONES

我想做你想做的事情(在根目录下读/写一个文件夹,如果它不存在则创建),不幸的是它是其中之一或根本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;异常。