[Android] 外部ストレージにファイルを保存する WRITE_EXTERNAL_STORAGE

こちらでアプリ内にファイルを保存の方法を試しましたが、共用メモリの外部ストレージに保存することもできます。ここは例えばカメラの画像など、あるいはSDカードなどのある程度大きいファイルをたくさん保存するような領域です。
 
文字列をファイルに入れて外部ストレージに保存して、読み出す例です。
 

Android Studio 2.3.3
Android 7.1.1

 



EXTERNAL_STORAGE

 
外部ストレージとは、端末内のストレージ領域あるいはSDカードを指しています。これは機種によって異なります。
 
外部ストレージへの読み書きには2種類のパーミッションチェックが必要です。
 
(1) AndroidManifest.xml にusers-permissionの記述を入れる

 
(2) WRITE_EXTERNAL_STORAGEREAD_EXTERNAL_STORAGdangerous permission なので、permission checkの実装が必要になります。これを実装するとユーザーに許可・不許可のダイアログを表示させ、ユーザーはいつでもアプリの許可設定を変更できます。
 
2つめのpermission checkは実装がそこそこあります。テスト段階での確認をするだけならpermission checkをオミットすることができます。
 

permission checkの除外

 
最初は permission check 無しで実行して、External Storageを呼ぶところまで実行します。そこで止まってしまうかスルーするかもしれませんが終了。
 
該当アプリを「設定」から探し「権限」の項目にあるストレージをenableにします。
 

 
これで、ユーザーが変えない限りpermission checkが許可された状態になります。
 
リリースを想定しているのであれば最初から入れていた方がいいと思いますが、過去にリリースしたアプリの修正については、一時的にユーザーに説明して回避することもできるかもしれません。
 

permission check を含めた実装

 
マニフェストの設定です。
AndroidManifest.xml

 
外部ストレージでユーザーが保存できる場所は
Environment.getExternalStorageDirectory().getPath()
によって取得できます。
端末によってファイルシステムは多少異なるため、決め打ちのパスでは問題が起こります。
 
MainActivity.java

 
isExternalStorageWritable()
これは、パーミッションとは別に、現在ストレージ領域を他の何かが処理をしていてアクセスすべきでない場合かどうかを確認しているものです。
isExternalStorageReadable()も同様です

activity_main.xml

 
実際に端末内のファイルとして保存されているか確認してみます
terminalでadb shellで入ってから、Logで保存先のpathを表示させているので、それを入れます

 
確かに、testfile.txtがストレージに作成されています。
上の動画では中の文字も確認できています。

Ref:
ファイルを保存する