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



我正在努力开发一个带有cordova的android APP,我想每天创建一个文件夹并在其中存储一个txt文件。 我尝试的所有内容都适用于每个安卓系统的内部存储器,但不适用于外部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/...

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

授予存储/读/写到外部存储的所有权限。

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

此外,外部SD卡的根部(例如/storage/4975-1401/( 现在对安卓应用是只读的。这意味着,如果您的应用需要写入 SD 卡,则必须在应用程序沙箱目录中执行此操作(例如/storage/4975-1401/Android/data/your.app.package.id/files(。

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

但是,您可以使用cordova-diagnostic-plugin的getExternalSdCardDetails((来检索外部(可移动(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 权限。

最新更新