Android 5.1.1及更高版本Cordova的外部存储路径(SD卡)

Android 5.1.1及更高版本Cordova的外部存储路径(SD卡),android,cordova,cordova-plugins,sd-card,android-external-storage,Android,Cordova,Cordova Plugins,Sd Card,Android External Storage,我正在用cordova开发一个android应用程序,我想每天创建一个文件夹并在其中存储一个txt文件。我试过的所有东西都适用于每个android的内部内存,但不适用于外部SD卡,请看一看并帮我解决 上述条件一直持续到4.4.4版本,5.0之后路径不正确 我已经为/mnt和/storage尝试了以下所有路径 // sdcard0 works on all the androind for Internal Memory // 'file:///storage/sdcard1/'; suppose

我正在用cordova开发一个android应用程序,我想每天创建一个文件夹并在其中存储一个txt文件。我试过的所有东西都适用于每个android的内部内存,但不适用于外部SD卡,请看一看并帮我解决

上述条件一直持续到4.4.4版本,5.0之后路径不正确

我已经为/mnt/storage尝试了以下所有路径

// sdcard0 works on all the androind for Internal Memory
// 'file:///storage/sdcard1/'; suppose to work for external in higher version but 
// 'file:///mnt/sdcard/'; it works but in Internal memory ERROR
// externalSdCard             ----->   Not found with mnt and storage
// SECONDARY_STORAGE
// 'file:///storage/UsbDriveB/'  -----------> didn't worked
// external_sd is not worked with storage and mnt
我到处都读到,sdcard0是内部的,sdcard1是外部的,但它似乎不再工作了。有人能帮我修路吗

连我都试过了

以上内容仅适用于内部存储


所有对外部存储器的存储/读/写权限都已授予。

从Android 5.0开始,外部(可移动)SD的位置不再是固定路径。相反,在路径中使用SD卡的序列号。 例如,在运行Android 7.1.1的三星Galaxy S4上,物理外部可移动SD卡路径为
/storage/4975-1401/

此外,外部SD卡的根目录(例如
/storage/4975-1401/
)现在对Android应用程序是只读的。这意味着,如果你的应用程序需要写入SD卡,它必须在应用程序沙盒目录中写入(例如
/storage/4975-1401/Android/data/your.app.package.id/files

cordova插件文件
不允许您访问外部(可移动)SD卡:例如
cordova.file.externalRootDirectory
返回
file:///storage/emulated/0/

但是,您可以使用的检索指向外部(可移动)SD卡的文件路径,例如:

function getExternalSdLocation(done){
    cordova.plugins.diagnostic.getExternalSdCardDetails(function(details){
        details.forEach(function(detail){
            if(detail.type == "application"){
                cordova.file.externalSdCardApplicationDirectory = detail.filePath;
            }else if(detail.type == "root"){
                cordova.file.externalSdCardRootDirectory = detail.filePath;
            }
        });
        done();
    }, function(error){
        console.error(error);
        done();
    });
}

getExternalSdLocation(function(){
    // use cordova.file.externalSdCardApplicationDirectory to write to SD card
});
对于Android 6.0及以上版本,需要运行时权限才能访问外部SD卡。 您可以使用中来请求此权限

function requestExternalSdPermission(done){
    cordova.plugins.diagnostic.requestRuntimePermission(function(status){
        switch(status){
            case cordova.plugins.diagnostic.permissionStatus.GRANTED:
                console.log("Permission granted");
                getExternalSdLocation(done);
                break;
            case cordova.plugins.diagnostic.permissionStatus.DENIED:
                console.log("Permission denied");
                askAgain(done);
                break;
            case cordova.plugins.diagnostic.permissionStatus.DENIED_ALWAYS:
                console.log("Permission permanently denied");
                reportError(done);
                break;
        }
    }, function(error){
        console.error("The following error occurred: "+error);
        reportError(done);
    }, cordova.plugins.diagnostic.permission.WRITE_EXTERNAL_STORAGE);
}
  • 在Android 5及以下版本上运行此代码将导致“已授予权限”,而无需请求用户的权限
  • 您还需要将
    包含在
    AndroidManifest.xml
    中-请参阅
function getExternalSdLocation(done){
    cordova.plugins.diagnostic.getExternalSdCardDetails(function(details){
        details.forEach(function(detail){
            if(detail.type == "application"){
                cordova.file.externalSdCardApplicationDirectory = detail.filePath;
            }else if(detail.type == "root"){
                cordova.file.externalSdCardRootDirectory = detail.filePath;
            }
        });
        done();
    }, function(error){
        console.error(error);
        done();
    });
}

getExternalSdLocation(function(){
    // use cordova.file.externalSdCardApplicationDirectory to write to SD card
});
function requestExternalSdPermission(done){
    cordova.plugins.diagnostic.requestRuntimePermission(function(status){
        switch(status){
            case cordova.plugins.diagnostic.permissionStatus.GRANTED:
                console.log("Permission granted");
                getExternalSdLocation(done);
                break;
            case cordova.plugins.diagnostic.permissionStatus.DENIED:
                console.log("Permission denied");
                askAgain(done);
                break;
            case cordova.plugins.diagnostic.permissionStatus.DENIED_ALWAYS:
                console.log("Permission permanently denied");
                reportError(done);
                break;
        }
    }, function(error){
        console.error("The following error occurred: "+error);
        reportError(done);
    }, cordova.plugins.diagnostic.permission.WRITE_EXTERNAL_STORAGE);
}