[Android] 外部ストレージに画像を保存・読出しをする

画像を外部ストレージ領域に保存して読出してみます。emulator Pixel XL のファイル構造から/storage/emulated/0/DCIM/Camera/以下に置くとギャラリーが写真としてリストアップしてくれます。
 

Android Studio 2.3.3
Android 7.1.1



EXTERNAL-STORAGE

 
文字列をテキストファイルとして外部ストレージに保存しましたが、外部ストレージを使うのはむしろ画像が多いのではないでしょうか。
テキストファイルはアプリ内のメモリに保存できますが、画像をたくさん入れるのは限界があるので。

 
外部ストレージへの読み書きには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

 
画像はassetsに置いてそこからInputStreamで取り込み、FileOutputStreamでバッファリングして保存していきます。
 
assetsにsample_image.jpg画像を置きます。assetsについてはこちらを参考にしてください。
 
MainActivity.java

 
読み取り・書き込みエラーはログで確認する程度ですので、もっと色々手当は必要です。
activity_main.xml

 
BUTTON SAVE でassets に置いた画像を外部ストレージに保存
BUTTON READ で保存したパスから画像を読み出して表示
 

 
assetから画像を取り込みましたが、ネットから落としたり、画像を何らかの形で動的に取得した場合は一旦内部メモリに落とし込んだ方が扱いやすいかもしれません。
 
アンドロイドのデータベースへ登録:
画像は通常はデフォルトで端末に入っているギャラリーやフォトなどのアプリで表示できます。ただこれはすぐには反映されないので画像を保存してすぐギャラリーを確認しても写真が無いこともあります。
registerDatabase(String file) のようにアンドロイドのデータベースへ登録することでこれは解消します。
 
 
関連記事: