Ionic外部根目录无法写入SD卡

3

我一直尝试使用IONIC中的“cordova-plugin-file”插件在Android设备上写入(可移动的)SD卡,但一直没有成功。

文档指定了

externalRootDirectory

作为"Android: 外部存储(SD 卡)根目录"。
然而,当我写入此目录时:
this.file.resolveDirectoryUrl( this.file.externalRootDirectory)
.then( (data)=>{
  result += "\n" + "resolveDirectoryUrl";
  newBasePath = data.nativeURL;
  this.file.createDir(newBasePath, newDirName, true)
  .then( ()=>{
    result += "\n" + "createDir";
    this.file.createFile(newBasePath, newFilePath, true)
    .then( ()=>{
      result += "\n" + "createFile";
      this.file.writeFile(newBasePath, newFilePath, this.thisRouteFile,  {append:true})
      .then( () => {
        result += "\n" + "writeFile OK";
      });
    });
  });
});

该文件始终被写入内部存储器或模拟器,而不是可移动的SD卡。

这个问题有很多讨论,一些人提到......

  <preference name="AndroidPersistentFileLocation" value="Compatibility" />

但我没有找到解决方法。

是否可以将数据写入可移动式SD卡中?


请告诉我现在使用的目录路径。还请告诉我SD卡的路径是什么。 - greenapps
2个回答

5
TL;DR:使用cordova-diagnostic-plugin中的getExternalSdCardDetails()函数。 "cordova-plugin-file"返回的“外部目录”对应于非可移动(内部)存储。这是因为这些模拟位置保证在所有Android设备上始终存在,而不支持所有硬件供应商的外部/可移动SD卡位置是制造商/Android版本特定的,并且如果未将外部SD卡插入读卡器,则可能不存在。例如,在运行Android 7.1.1的三星Galaxy S4上:
  • cordova.file.externalRootDirectory返回file:///storage/emulated/0/
  • cordova.file.externalApplicationStorageDirectory返回file:///storage/emulated/0/Android/data/cordova.plugins.diagnostic.example/
这些都是非可移动内部存储器上的文件路径。相比之下,来自cordova-diagnostic-plugingetExternalSdCardDetails()函数返回可移动外部SD卡的位置和详细信息。例如,在运行Android 7.1.1的三星Galaxy S4上,它返回:
[{
    "path": "/storage/4975-1401/Android/data/cordova.plugins.diagnostic.example/files",
    "filePath": "file:///storage/4975-1401/Android/data/cordova.plugins.diagnostic.example/files",
    "canWrite": true,
    "freeSpace": 16254009344,
    "type": "application"
}, {
    "path": "/storage/4975-1401",
    "filePath": "file:///storage/4975-1401",
    "canWrite": false,
    "freeSpace": 16254009344,
    "type": "root"
}]

这些是外部可移动存储上的文件路径。


完美。谢谢! - jcsubmit

1
我认为您可能缺少访问外部存储的权限。 cordova-plugin-file插件会向AndroidManifest.xml添加行以请求android.permission.WRITE_EXTERNAL_STORAGE权限,但是在新的Android权限检查机制下这已经不够了。从Android 6开始,您必须在运行时请求权限,而不仅仅是将其放入清单中。这意味着每次调用需要特殊权限的函数时,您都必须通过调用Android函数来确保您拥有该权限。您可以使用 Android-permissions plugin在运行时请求WRITE_EXTERNAL_STORAGE权限。

感谢您提醒权限问题! - jcsubmit

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