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

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

ただいまの
回答率

87.80%

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

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 2
  • VIEW 3,002

score 64

現在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ページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • m.ts10806

    2018/06/21 09:53

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

    キャンセル

  • agepan

    2018/06/21 10:08

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

    キャンセル

  • m.ts10806

    2018/06/21 10:18

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

    キャンセル

  • agepan

    2018/06/21 12:53

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

    キャンセル

回答 3

checkベストアンサー

0

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

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

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 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

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/06/24 10:46

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

    キャンセル

-1

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

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

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

関連した質問

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