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

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

ただいまの
回答率

90.83%

  • JavaScript

    14847questions

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

  • jQuery

    6169questions

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

  • Monaca

    918questions

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

  • Cordova

    397questions

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

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

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 224

agepan

score 53

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

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

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

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

function test (){
  window.resolveLocalFileSystemURL(cordova.file.externalRootDirectory,
    function success1(directoryEntry) {
      alert(directoryEntry.nativeURL);
      // alert(JSON.stringify(directoryEntry));
  },);  

  // 出力結果=file:///storage/emulated/0/

}

 追記

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

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

function test (){


  requestExternalSdPermission();


  // アクセス許可を取る(Android 6以上、5の場合は許可メッセージが出る)

  function requestExternalSdPermission(done){
      cordova.plugins.diagnostic.requestRuntimePermission(function(status){
          switch(status){
              case cordova.plugins.diagnostic.permissionStatus.GRANTED:
                  // 許可された場合
                  getExternalSdLocation(done); // SDカードのパスを取得する関数実行
                  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);
  }



  // 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(){
      // cordova.file.externalSdCardApplicationDirectory を使用してSDカードに書き込む
    alert('ここにSDに描き込む処理を書く');
  });  

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • mts10806

    2018/06/21 09:53

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

    キャンセル

  • agepan

    2018/06/21 10:08

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

    キャンセル

  • mts10806

    2018/06/21 10:18

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

    キャンセル

  • agepan

    2018/06/21 12:53

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

    キャンセル

回答 3

checkベストアンサー

0

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/06/21 12:51

    ご回答ありがとうございます。さっそく下記のようなコードで、files-externalとsdcardのパスを取得してみましたが、結果は同じで内部ストレージである「file:///storage/emulated/0/」となってしまいました…。

    function test (){
    window.resolveLocalFileSystemURL('cdvfile://localhost/files-external/',
    function success1(directoryEntry) {
    alert(JSON.stringify(directoryEntry));
    },);
    }

    キャンセル

  • 2018/06/21 12:58

    動作確認に使った実機の機種名とOSのバージョンは何でしょうか?

    今晩こちらでも試してみます。

    キャンセル

  • 2018/06/21 13:02

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

    キャンセル

  • 2018/06/21 23: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を無効にして結果を見たいと思います。

    キャンセル

  • 2018/06/22 00:30 編集

    コメントはMarkdownで書けないんですね。失礼しました。

    ディレクトリ構造を調べてみました。
    /storage
     /emulated
       空っぽ…? Android Terminal Emulatorでlsするが、権限無い…でも0フォルダが有るんじゃないかな?
     /53A3-1CEE ※sdcard
      /Android
      /DCIM
       etc

    どうも/storage/emulated/0 が有って、そこにsdcardがlinkされているようです。
    /Android配下には沢山(多分全部の)アプリのフォルダが有りました。

    …調査続行しますね。

    キャンセル

  • 2018/06/22 09: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になる?(パスは端末によりけりのようです)のかなと推測しているところです。

    キャンセル

  • 2018/06/22 10:21 編集

    microSDが1枚あったので端末に入れて確認してみました。

    ◆本体メモリー(/storage/emulated/0)
    /storage
     /emulated
      /0 … これはありませんでした
      /Android
       /data … アプリケーションデータ多数
      /DCIM

    ◆SDカード(/storage/MicroSD)
    /storage
     /MicroSD
      /Android
       /data … カード挿入時に自動作成されたディレクトリとアプリデータ
      /DCIM … こちらも自動作成されたディレクトリ

    …という具合になりまして、こちらの端末を見る限り、/storage/emulated/0がSDを指しているわけではないようです。しかしそれだとMonacaのマニュアルとは違う動きになるので、ちょっとよく分からないところです。

    キャンセル

  • 2018/06/22 12:22

    cdvfileプロトコルは外部メモリサポート外だそうです。なんだってー。cdvfileは忘れましょう。



    https://cordova.apache.org/docs/en/latest/reference/cordova-plugin-file/
    Plugin supports cdvfile://localhost (local resources) only. I.e. external resources are not supported via cdvfile

    キャンセル

  • 2018/06/22 16:47

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

    キャンセル

0

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/06/24 10:46

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

    キャンセル

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

  • ただいまの回答率 90.83%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • JavaScript

    14847questions

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

  • jQuery

    6169questions

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

  • Monaca

    918questions

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

  • Cordova

    397questions

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