[Android & Kotlin] MediaStore に画像を保存

パブリックな共有ストレージのMediaStoreに画像を保存する方法について見てみましょう。

Android Studio
2024.1.1

 




MediaStore

 

ストレージには内部ストレージ(Internal Storage)と外部ストレージ(External Storage)があります。アプリには固有のストレージ領域がありますが、共有のストレージ領域を使うことも可能です。

1x1.trans - [Android & Kotlin] MediaStore に画像を保存

メディアコレクションは共有可能なストレージで写真、動画やミュージックなどのメディアを保存できる領域です。

  • MediaStore APIを使ってアクセスし、他のアプリが作成したメディアには読み出しでアクセスできる
  • 読み出しにはREAD_EXTERNAL_STORAGE のPermissionが必要,
  • 保存に WRITE_EXTERNAL_STORAGE は不要(Android 10 以降)
    1x1.trans - [Android & Kotlin] MediaStore に画像を保存
  • アプリが削除されてもファイルは残っている

 画像:(写真とスクリーンショットを含む)
DICM/、Picture/ ディレクトリに格納されている
● 動画:
DCIM/、Movies/、Pictures/ ディレクトリに格納
● オーディオ:
オーディオファイルは Alarms/、Audiobooks/、Music/、Notifications/、Podcasts/、Ringtones/ ディレクトリに格納
オーディオ プレイリストは Music/ ディレクトリまたは Movies/ ディレクトリに格納

 

 

プロバイダにデータを挿入

 

Mediaファイルを保存するには、ContentResolver.insert() を使ってプロバイダにデータを挿入します。プロバイダに新しい行を挿入し、その行のコンテンツ URI を返します。

 
ContentValues:ContentResolverにデータを保存するためのクラスで、
ファイル情報を入力し、insert() の引数に使います

insert()からUriオブジェクトが返されるので、そこに保存します。

IS_PENDING を 1 に設定して処理が完了していないので他からのアクセスを無視するようにします。

処理が終わったら IS_PENDING を 0 にして解除してから
update() にて更新をします。

 

サンプルコード

 

drawableに入れた画像をMediaStoreに保存してみましょう。

MainActivity.kt

 
適当な画像をsample_image.jpgとして用意しdrawableに入れます。

acitivty_main.xml

 
strings.xml

これで実行すると、
1x1.trans - [Android & Kotlin] MediaStore に画像を保存

ボタンタップで画像が保存される

1x1.trans - [Android & Kotlin] MediaStore に画像を保存


 
スマホの「フォト」アプリから共有ストレージを見ると「Pictures」に保存されているのがわかります。

1x1.trans - [Android & Kotlin] MediaStore に画像を保存


 
画像を選択タップする
1x1.trans - [Android & Kotlin] MediaStore に画像を保存

画像の情報を見ると

1x1.trans - [Android & Kotlin] MediaStore に画像を保存


 
以下に保存されていることが分かります。

尚、このパスはあくまで例で実装は端末に依存します。

 
 
関連ページ:
 

asynctask 00b 100x100 - [Android & Kotlin] MediaStore に画像を保存
データを保存するストレージ領域が目的・用途によって区分されてセキュリティー的に厳しくなりました。 対象範囲別外部ストレージ   S...

 
References:
外部ストレージ内のメディア ファイルを操作する
共有ストレージからメディア ファイルにアクセスする
コンテンツ プロバイダの基本

シェアする

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

フォローする