[Android] MediaStore スマホの画像や音楽ファイルを検索する

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

Android Studio 2.3.3
Android 7.1.1

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.xml

 
EXTERNAL_CONTENT_URI

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

スマホメーカーの実装に依存しますがギャラリーの画像などは
EXTERNAL_CONTENT_URI
で見つかります
 
cotentresolver_1
 
音楽ファイルを探すときは、 MediaStore.Audio.Media.EXTERNAL_CONTENT_URI
に変更すると検索できます。
 

 
実際にemulatorがどうなっているかADM, Android Device Monitor(DDMS)で見てみると
(Android Studio 2.x ではこれが使えませんがその内新しいツールが出るようです)
 
contentresolver_2
 
pathが指しているところに画像があるのが分かります。
 
Reference:
コンテンツ プロバイダの基本