質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Cordova

Cordovaは様々なデバイスで使うことができるオープンソースなモバイル用開発プラットフォームです。開発者に各デバイスの元のプラットフォームで開発する必要をなくし、HTML・JavaScript・CSSなどの一般的なウェブのテクノロジーを使ってすべてのデバイスで展開することができるモバイルのアプリケーションを生成することを可能にします。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Monaca

「Monaca」はiOS、Android、Windows向けのアプリ開発に対応した、Cordovaベースのモバイルアプリ開発プラットフォームです。HTML5、JavaScriptといったWeb標準技術を用いてモバイルアプリ開発を行うことができます。

Q&A

解決済

3回答

4378閲覧

ファイルAPIでSDカードのパスを取得したい

agepan

総合スコア66

Cordova

Cordovaは様々なデバイスで使うことができるオープンソースなモバイル用開発プラットフォームです。開発者に各デバイスの元のプラットフォームで開発する必要をなくし、HTML・JavaScript・CSSなどの一般的なウェブのテクノロジーを使ってすべてのデバイスで展開することができるモバイルのアプリケーションを生成することを可能にします。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Monaca

「Monaca」はiOS、Android、Windows向けのアプリ開発に対応した、Cordovaベースのモバイルアプリ開発プラットフォームです。HTML5、JavaScriptといったWeb標準技術を用いてモバイルアプリ開発を行うことができます。

0グッド

2クリップ

投稿2018/06/21 00:42

編集2018/06/21 05:07

現在Monacaで開発したアプリで外部SDカードにファイルを保存したいと考えています。

こちらのページを参考にしまして、以下のコードを用いることでSDカードのディレクトリパスを取得することができたのですが、このパスはSDカード内の内蔵ストレージを指しているようでして、ユーザーが自由に読み書きできる外部ストレージのパスではないようです。

外部ストレージのパスは「/storage/emulated/1」や「/storage/[UUID]」、「/mnt/sdcard/」といった感じのパスのようですが、このパスを取得することは可能でしょうか?

よろしくお願いいたします。

JavaScript

1function test (){ 2 window.resolveLocalFileSystemURL(cordova.file.externalRootDirectory, 3 function success1(directoryEntry) { 4 alert(directoryEntry.nativeURL); 5 // alert(JSON.stringify(directoryEntry)); 6 },); 7 8 // 出力結果=file:///storage/emulated/0/ 9 10} 11

追記

Googleで調べますとこちらの英語ページで同様の試みがされているみたいです。

下記コードで試してみたのですが、許可に関するメッセージは表示されず(Android 6以上対象で、Android 5の場合でも許可済みのメッセージが出るようなのですが出ませんでした)、コード最後に書いた「ここにSDに描き込む処理を書く」アラートが出るだけでした。何か問題箇所などお分かりの方はよろしくお願いいたします。

JavaScript

1function test (){ 2 3 4 requestExternalSdPermission(); 5 6 7 // アクセス許可を取る(Android 6以上、5の場合は許可メッセージが出る) 8 9 function requestExternalSdPermission(done){ 10 cordova.plugins.diagnostic.requestRuntimePermission(function(status){ 11 switch(status){ 12 case cordova.plugins.diagnostic.permissionStatus.GRANTED: 13 // 許可された場合 14 getExternalSdLocation(done); // SDカードのパスを取得する関数実行 15 break; 16 case cordova.plugins.diagnostic.permissionStatus.DENIED: 17 // 拒否された場合 18 console.log("Permission denied"); 19 askAgain(done); 20 break; 21 case cordova.plugins.diagnostic.permissionStatus.DENIED_ALWAYS: 22 // 拒否された(恒久的)場合 23 console.log("Permission permanently denied"); 24 reportError(done); 25 break; 26 } 27 }, function(error){ 28 console.error("The following error occurred: "+error); 29 reportError(done); 30 }, cordova.plugins.diagnostic.permission.WRITE_EXTERNAL_STORAGE); 31 } 32 33 34 35 // SDカード 外部ストレージのパスを取得&書き込み 36 37 function getExternalSdLocation(done){ 38 cordova.plugins.diagnostic.getExternalSdCardDetails(function(details){ 39 details.forEach(function(detail){ 40 if(detail.type == "application"){ 41 cordova.file.externalSdCardApplicationDirectory = detail.filePath; 42 }else if(detail.type == "root"){ 43 cordova.file.externalSdCardRootDirectory = detail.filePath; 44 } 45 }); 46 done(); 47 }, function(error){ 48 console.error(error); 49 done(); 50 }); 51 } 52 53 getExternalSdLocation(function(){ 54 // cordova.file.externalSdCardApplicationDirectory を使用してSDカードに書き込む 55 alert('ここにSDに描き込む処理を書く'); 56 }); 57 58} 59

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2018/06/21 00:53

環境が無いので確認できないのですが、その「SDカードのディレクトリパス」から相対パスでは指定できないのでしょうか?できない場合、やはり端末に直接書き込むことになるため、許可されている範囲が制限されている可能性もあります。
agepan

2018/06/21 01:08

外部ストレージのパスは大体統一されているようではありますし、パス上にUUIDが入っていても、UUIDを取得可能なようなのでできなくはないのかもしれませんが、端末によって変わるところもあるので難しいかもしれません。
m.ts10806

2018/06/21 01:18

なるほど。それでしたら相対パスなどでそのフォルダの存在有無をチェックしてみて、あればそこに置き、なければデフォルトで取得可能なフォルダに置く ような形になるかもしれませんね。
agepan

2018/06/21 03:53

他に方法が無ければこの方法を取るしかないかもしれないですね。パス取得は意外と難しいですね…
guest

回答3

0

投稿2018/06/22 09:48

編集2018/06/22 17:09
oikashinoa

総合スコア2826

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

agepan

2018/06/24 01:46

プラグインがあったのですね、まだ試していませんが後ほど試してみたいと思います。
guest

0

スマホからの書き込みなので細かく書けませんが、Configuring the Plugin (Optional)の章を見て、config.xmlに権限が書いてあるか確認してみては?
デフォでは全部書いてあるよーって書いてあったけど念の為。

https://cordova.apache.org/docs/en/latest/reference/cordova-plugin-file/

投稿2018/06/22 03:36

oikashinoa

総合スコア2826

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

参考にされていたmonaca docの"Cdvfile プロトコル"にて

  • files-external
  • sdcard

どちらかを使えば良いのではないでしょうか?
実パスに変換も可能ですので動作確認もしやすいかと。

投稿2018/06/21 03:27

oikashinoa

総合スコア2826

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

agepan

2018/06/21 03:51

ご回答ありがとうございます。さっそく下記のようなコードで、files-externalとsdcardのパスを取得してみましたが、結果は同じで内部ストレージである「file:///storage/emulated/0/」となってしまいました…。 function test (){ window.resolveLocalFileSystemURL('cdvfile://localhost/files-external/', function success1(directoryEntry) { alert(JSON.stringify(directoryEntry)); },); }
oikashinoa

2018/06/21 03:58

動作確認に使った実機の機種名とOSのバージョンは何でしょうか? 今晩こちらでも試してみます。
agepan

2018/06/21 04:02

ありがとうございます、こちらの機種はZenFone 2 Laser (ZE500KL)で、Android 5.0.2でテストしております。
oikashinoa

2018/06/21 14:32

files-externalとsdcardで結果が異なりました。 - Honor9/Android7/sdcard有り ```json {"isFile":false,"isDirectory":true,"name":"","fullPath":"/","filesystem":"<FileSystem: files-external>","nativeURL":"file:///storage/emulated/0/Android/data/mobi.monaca.debugger/files/"} {"isFile":false,"isDirectory":true,"name":"","fullPath":"/","filesystem":"<FileSystem: sdcard>","nativeURL":"file:///storage/emulated/0/"} ``` files-externalだと下記記載を見るとSDカードと考えられます。ESファイルエクスプローラでSDカードを見ると確かに有りました。 [ファイル操作 プラグイン](https://docs.monaca.io/ja/reference/cordova_6.5/file/) - Android のファイルシステムの概要 `Android/data/<app-id>/ externalApplicationStorageDirectory` # 確認手順 0. cordova-plugin-fileを有効にする − 自動でandroid.permission.WRITE_EXTERNAL_STORAGE が付くそうで… 0. デバッグビルドし、実機に取り込む 0. アプリの権限を見て、権限:ストレージが有効になっている事を確認する 0. アプリを動かしてみる 今日はビルド権 使いきったので試せれないですが、cordova-plugin-fileを無効にして結果を見たいと思います。
oikashinoa

2018/06/21 15:33 編集

コメントはMarkdownで書けないんですね。失礼しました。 ディレクトリ構造を調べてみました。 /storage  /emulated    空っぽ…? Android Terminal Emulatorでlsするが、権限無い…でも0フォルダが有るんじゃないかな?  /53A3-1CEE ※sdcard   /Android   /DCIM    etc どうも/storage/emulated/0 が有って、そこにsdcardがlinkされているようです。 /Android配下には沢山(多分全部の)アプリのフォルダが有りました。 …調査続行しますね。
agepan

2018/06/22 00:51

いろいろありがとうございます。 /storage/emulated/0がエイリアスになってるというのは確かにそのようではあります。こちらで今調べていて分かったことは、こちらのZenfoneには今SDカードを装着していない状態で、/storage/emulated/0の中にあるディレクトリパスが取得できているんですね。 /storage/emulated/0がSDではなく本体メモリー内にある、DCIMなどユーザーがいじれる領域を指しているようです(現にそこにデータがあります)。 今手元にSDが無いので検証できないのですが、/storage/emulated/0や/10、/20がAndroidを利用するユーザー別ディレクトリで、その中でSDなどの外部ストレージ領域が/storage/emulated/1や/11、/21になる?(パスは端末によりけりのようです)のかなと推測しているところです。
agepan

2018/06/22 01:22 編集

microSDが1枚あったので端末に入れて確認してみました。 ◆本体メモリー(/storage/emulated/0) /storage  /emulated   /0 … これはありませんでした   /Android    /data … アプリケーションデータ多数   /DCIM ◆SDカード(/storage/MicroSD) /storage  /MicroSD   /Android    /data … カード挿入時に自動作成されたディレクトリとアプリデータ   /DCIM … こちらも自動作成されたディレクトリ …という具合になりまして、こちらの端末を見る限り、/storage/emulated/0がSDを指しているわけではないようです。しかしそれだとMonacaのマニュアルとは違う動きになるので、ちょっとよく分からないところです。
agepan

2018/06/22 07:47

なるほど、本体ストレージ(=SDではない外部ストレージ)にデータを保存して、SDカードへはユーザーが必要に応じてそこから手動でコピーしてもらうという方法しかないみたいですね。今回はアプリデータをユーザーが簡単にSDカードなどにバックアップできる仕組みを作りたかったので、本体ストレージ(/storage/emulated/0)保存でも大丈夫そうですが、SDカードに直接書き出しもできたら良いところですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問