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

3

我正在使用cordova开发一款Android应用程序,希望每天创建一个文件夹并在其中存储一个txt文件。我尝试的所有方法都适用于每个Android设备的内部存储器,但不适用于外部SD卡,请看看并帮助我解决问题。

if(sDeviceVersion=='4.0' || sDeviceVersion=='4.0.4'){
    var sPath = 'file:///storage/extSdCard/';
}else if(sDeviceVersion=='4.1' || sDeviceVersion=='4.1.2' ||sDeviceVersion=='4.3.1'){
    var sPath = 'file:///storage/extSdCard/';
}else if(sDeviceVersion=='4.4' || sDeviceVersion=='4.4.4'){
    var sPath = 'file:///storage/extSdCard/';
}else if(sDeviceVersion=='5.0' || sDeviceVersion=='5.1.1'){
    var sPath = 'file:///mnt/sdcard/'; //
}else if(sDeviceVersion=='6.0' || sDeviceVersion=='6.0.1'){
    var sPath = 'file:///storage/sdcard1/';
}else if(sDeviceVersion=='7.0' || sDeviceVersion=='7.1.2'){
    var sPath = 'file:///storage/sdcard1/';
}

以上条件适用于4.4.4版本,5.0版本后PATH不正确。

我已经尝试了以下所有路径:/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是外部存储,但是现在好像不起作用了。有人能帮我找出路径吗?

我已经尝试过

alert(cordova.file.externalRootDirectory); // file:///storage/sdcard0/ Internal memory
alert(cordova.file.externalApplicationStorageDirectory); // path to file:///android/data...
alert(cordova.file.dataDirectory); // file:///data/androind/data/...
alert(cordova.file.externalDataDirectory); // file://storage/sdcard0/android/data/...

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

外部存储的存储/读取/写入权限已经授予。

1个回答

4
从Android 5.0开始,外部(可移动)SD的位置不再是固定路径。相反,SD卡的序列号用于路径。 例如,在运行Android 7.1.1的Samsung Galaxy S4上,物理外部可移动SD卡路径为/storage/4975-1401/
此外,外部SD卡的根目录(例如/storage/4975-1401/)现在对Android应用程序是只读的。这意味着如果您的应用程序需要写入SD卡,则必须在应用程序沙盒目录中进行(例如/storage/4975-1401/Android/data/your.app.package.id/files)。 cordova-plugin-file无法让您访问外部(可移动)SD卡:例如,cordova.file.externalRootDirectory返回file:///storage/emulated/0/

然而,你可以使用cordova-diagnostic-plugingetExternalSdCardDetails()来检索外部(可移动)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卡需要运行时权限。您可以使用cordova-diagnostic-plugin中的requestRuntimePermission()来请求此权限。

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 中包含 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> - 请参见 Android permissions

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接