[Android] MediaStore スマホの画像を検索

スマホ内の画像はギャラリー等にあり、前の記事では Intent.ACTION_OPEN_DOCUMENT を使ってピッカーからユーザーが画像を選んで取り込む事ができました。一方、アプリとしてダイレクトに画像を取り込むために検索して画像のpathを取得してみます。

cotentresolver_1

Android Studio 2.1.1
Android 6.0

 

ContentResolver

 
Android アプリケーションの一部でデータの中央リポジトリへのアクセスを管理しているのがコンテンツ プロバイダです。コンテンツ プロバイダの基本

コンテンツ プロバイダのデータにアクセスするためにContentResolver.query() を呼び出してデータ情報を取得します。

また、ContentResolverを使ってスマホ内のMediaStre内を検索しますのでPermissionが必要になります。

AndroidManifest.xmlに追加

READ_EXTERNAL_STORAGE は、Android 6.0 Runtime Permissionに該当するため、アプリ起動中に許可を得るように設定します。
許可しない場合でも例外で落ちないように実装しないといけません。
 
permission_1

  • APIが23以上か否か
    • False: そのまま処理実行
  • 既に許可しているか否か、checkSelfPermission(…)
    • 既に許可していない場合や、初回起動のケースは次に行く
    • 許可しているケースは処理に移る
  • Permissionが何に使われるか説明して許可を訪ねる
    • 拒否された場合はこの機能については動作しないが他の処理をする
    • 許可されて処理の実行

 
ManActivity.java はこの許可の処理で、実際のpathの検索は ReadContent.java で行っています。

MainActivity.java

 
ここからが本番

ReadContent.java

 

actiity_main.xml

 
package nameは適宜変更してください。
AndroidManifest.java

 
EXTERNAL_CONTENT_URI

INTERNAL_CONTENT_URI
がありますが
ExternalがSDカードだけを指しているわけではありません
アプリの外、ユーザー領域を指しています
SDカードはその一部、SDカードがないスマホもありますし

スマホメーカーの実装に依存しますがギャラリーの画像などは
EXTERNAL_CONTENT_URI
で見つかります

cotentresolver_1

実際にemulatorがどうなっているかADM, Android Device Monitor(DDMS)で見てみると

contentresolver_2

pathが指しているところに画像があるのが分かります。

Reference:
コンテンツ プロバイダの基本