前提・実現したいこと
Monacaで画像を編集して端末に保存するアプリを作成しています。
ファイル操作プラグイン cordova-plugin-file を使用し、
cordova.file.externalRootDirectory(file:///storage/emulated/0/)配下にフォルダを作成して
その中にファイルの書き込みをしたいです。
発生している問題・エラーメッセージ
Android端末のカスタムデバッガーでもデバッグビルドアプリでも試しているのですが
getDirectoryで下記のエラーが返ってきます。
{"code":12}
フォルダを作成せず直にファイルを作成しようとしても、getFileで下記のエラーが返ってきます。
{"code":9}
該当のソースコード
JavaScript
1var permissions = cordova.plugins.permissions 2 3permissions.checkPermission(permissions.READ_EXTERNAL_STORAGE, function (readStatus) { 4 5 if (readStatus.hasPermission) { 6 console.log('READ_EXTERNAL_STORAGE YES') 7 8 permissions.checkPermission(permissions.WRITE_EXTERNAL_STORAGE, function (writeStatus) { 9 10 if (writeStatus.hasPermission) { 11 console.log('WRITE_EXTERNAL_STORAGE YES') 12 13 this.downloadFile(blob) 14 15 } else { 16 console.log('WRITE_EXTERNAL_STORAGE NO') 17 18 permissions.requestPermission(permissions.WRITE_EXTERNAL_STORAGE, function (status) { 19 20 if (status.hasPermission) { 21 console.log('request WRITE_EXTERNAL_STORAGE OK') 22 23 this.downloadFile(blob) 24 25 } else { 26 console.log('request WRITE_EXTERNAL_STORAGE NG') 27 } 28 29 }, function () { 30 console.log('permission WRITE_EXTERNAL_STORAGE is not turned on') 31 }) 32 } 33 }) 34 35 } else { 36 console.log('READ_EXTERNAL_STORAGE NO') 37 38 permissions.requestPermissions([permissions.READ_EXTERNAL_STORAGE, permissions.WRITE_EXTERNAL_STORAGE], function (status) { 39 40 if (status.hasPermission) { 41 console.log('request READ_EXTERNAL_STORAGE, WRITE_EXTERNAL_STORAGE OK') 42 43 this.downloadFile(blob) 44 45 } else { 46 console.log('request READ_EXTERNAL_STORAGE, WRITE_EXTERNAL_STORAGE NG') 47 } 48 49 }, function() { 50 console.log('permission READ_EXTERNAL_STORAGE, WRITE_EXTERNAL_STORAGE is not turned on') 51 }) 52 } 53 54}, function () { 55 console.log('checkPermission error') 56}) 57 58 59downloadFile(blob) { 60 61 var saveDirectory = '' 62 if (monaca.isAndroid) { 63 saveDirectory = cordova.file.externalRootDirectory 64 } else if (monaca.isIOS) { 65 saveDirectory = cordova.file.documentsDirectory 66 } 67 68 var fileName = 'mypicture.jpg' 69 70 window.resolveLocalFileSystemURL(saveDirectory, function (dirEntry) { 71 72 dirEntry.getDirectory('MyAppFolder', { create: true, exclusive: false }, function (subDirEntry) { 73 74 subDirEntry.getFile(fileName, { create: true, exclusive: false }, function (fileEntry) { 75 76 fileEntry.createWriter(function (fileWriter) { 77 78 fileWriter.onwriteend = function () { 79 console.log('ファイル保存完了') 80 console.log(fileEntry.toURL()) 81 } 82 83 fileWriter.onerror = function (err) { 84 console.log('Failed file write: ' + JSON.stringify(err)) 85 } 86 87 fileWriter.write(blob) 88 89 }, function (err) { 90 console.log('createWriter error: ' + JSON.stringify(err)) 91 }) 92 93 }, function (err) { 94 console.log('getFile error: ' + JSON.stringify(err)) 95 }) 96 97 }, function (err) { 98 console.log('getDirectory error: ' + JSON.stringify(error)) 99 }) 100 }) 101}
試したこと
config.xml に以下は追加済みです。
<widget (略) xmlns:android="http://schemas.android.com/apk/res/android" (略) > <preference name="iosExtraFilesystems" value="library,library-nosync,documents,documents-nosync,cache,bundle,root"/> <preference name="AndroidExtraFilesystems" value="files,files-external,documents,sdcard,cache,cache-external,assets,root"/> <platform name="android"> <custom-config-file target="AndroidManifest.xml" parent="/*"> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> </custom-config-file>
externalApplicationStorageDirectory や
externalDataDirectory だと書き込みが成功します。
補足情報(FW/ツールのバージョンなど)
Cordova CLI Version 10.0.0
Androidプラットフォーム 9.0.0
cordova-plugin-file@6.0.2
cordova-plugin-android-permissions@1.1.2
cordova-custom-config@5.1.0
あなたの回答
tips
プレビュー