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

こちらでアプリ内にファイルを保存を試しましたが、共用メモリの外部ストレージに保存することもできます。例えばカメラの画像などのある程度大きいファイルをたくさん保存するような領域です。
 
externalstorage 03 - [Android] 外部ストレージにファイルを保存する WRITE_EXTERNAL_STORAGE

Android Studio 3.2.1
Android 9.0

 



EXTERNAL_STORAGE

 
外部ストレージとは、端末内の共用のストレージ領域あるいはSDカードを指しています。これは機種によって異なります。
 
昔はSDカードだけを指していたのですが、最近は端末内のパブリックなストレージも含みます。Googleの端末にはSDカードが無かったりします。
ストレージ オプション | Android Developers
 

storage 01 - [Android] 外部ストレージにファイルを保存する WRITE_EXTERNAL_STORAGEざっくりこんな感じ

 

 

パーミッション

 
外部ストレージへの読み書きには2つのパーミッションが必要です。
 
(1) AndroidManifest.xml にusers-permissionの記述を入れる

 
GoogleのDocumentでは読み書きの両方ではWRITE_EXTERNAL_STORAGEのみでいいようです。ストレージ オプション
 
(2) WRITE_EXTERNAL_STORAGE は dangerous permission なので、permission checkの実装が必要になります。これを実装するとユーザーに許可・不許可のダイアログを表示させ、ユーザーはいつでもアプリの許可設定を変更できます。
 
このpermission checkは実装がそこそこあります。テスト段階での確認をするだけならpermission checkをオミットすることができます。
 
permission checkの除外(テストのみ!)
最初は permission check 無しで実行して、External Storageを呼ぶところまで実行します。そこで止まってしまうかスルーするかもしれませんが終了。
 
該当アプリを「設定」から探し「権限」の項目にあるストレージをenableにします。
 
externalstorage 02 - [Android] 外部ストレージにファイルを保存する WRITE_EXTERNAL_STORAGE
 
これでユーザーがStorage permissionを許可した状態になります。
 
新規リリースでは邪道かもしれませんが、過去にリリースしたアプリの修正については、一時的にユーザーに説明して回避することもできるかもしれません。(そんな面倒なことを強いてでも使いたいというスグレモノアプリであればアリかもですネ)
 

permission check を含めた実装

 
Runtime PermissionがAndroid 6 から必要になったのでその実装をします。以下参照ください。

Android 6.0からの変更として、既存アプリに大きな影響がでると思われるのがこの Runtime Permission だと言われて...
 

ファイルの読み書き

 
外部ストレージでユーザーが保存できるpathは
Environment.getExternalStorageDirectory().getPath()
によって取得できます。
実際のpathは例えば AVD の Emulator であれば、Terminalから見えます。
 

 
但し、端末によってファイルシステムの実装は異なることもあるため、決め打ちのパスでは問題が起こります。
 
ファイルに書き込んで保存するためにFileOpenStream, OutputStreamWriterを使ってみます。
リソースの開放漏れが無いようにfinallyでclose()を入れるところですが、try-with-resourcesを使って簡単にしました。
 

 
読み出しです。

 

サンプルコード

 
まとめたコードです。
AndroidManifest.xml

 
MainActivity.java

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

activity_main.xml

 
リソース
strings.xml

 

 
実際に端末内のファイルとして保存されているか確認してみます。
Device File Explorerで覗くこともできますが、Terminalから見ることもできます。
 
Terminalでadb shellを使いsdcardの中に入ります。

 
確かに、testfile.txtがストレージに作成されていて入力文字列が記述されています。
 
 
関連記事:

 
References:
ファイルを保存する
ストレージ オプション | Android Developers

誤字脱字、意味不明で分からにゃイ、
などのご意見はこちらから mailフォーム

ブックマークしておくと便利です このエントリーをはてなブックマークに追加


 


ページのトップへ戻る




シェアする

  • このエントリーをはてなブックマークに追加

フォローする