Android
Kotlin

AndroidのContentResolverで取得したFileの種類を調べる

More than 1 year has passed since last update.


はじめに 

Androidの標準ギャラリーのようなアプリを作りたいと思って調べていたのですが、画像と動画を同時に表示する方法を載せている記事が少なかったため、まとめておきます。

下にサンプルコードを載せておくので、面倒な方は飛ばして使ってください。


概要

見るべき場所は

val proj = arrayOf(MediaStore.MediaColumns._ID,MediaStore.Files.FileColumns.MEDIA_TYPE)

この部分で、ここで欲しい情報を付与できます。今回であればIDと、FileのMediaType(画像or動画or...etc)の2つを指定しています。

これを使って

val crsCursor = contentResolver.query(

MediaStore.Files.getContentUri("external"),
proj, //欲しいデータカラムの指定
...

でCursorを取得したら、あとは

//1:image 3:video

val mediaType=crsCursor.getInt(crsCursor.getColumnIndex(MediaStore.Files.FileColumns.MEDIA_TYPE))

でFileの種類を判別できます。


サンプルコード


val contentResolver = context.contentResolver

val proj = arrayOf(MediaStore.MediaColumns._ID,MediaStore.Files.FileColumns.MEDIA_TYPE)

val selection = (MediaStore.Files.FileColumns.MEDIA_TYPE + "="
+ MediaStore.Files.FileColumns.MEDIA_TYPE_IMAGE
+ " OR "
+ MediaStore.Files.FileColumns.MEDIA_TYPE + "="
+ MediaStore.Files.FileColumns.MEDIA_TYPE_VIDEO
)

val crsCursor = contentResolver.query(
MediaStore.Files.getContentUri("external"),
proj, //欲しいデータカラムの指定
selection, //filter
null,
MediaStore.Files.FileColumns.DATE_ADDED + " DESC" //sort
)
crsCursor!!.moveToFirst()
for (i in 0 until crsCursor.count) {
val id = crsCursor.getLong(crsCursor.getColumnIndex(MediaStore.MediaColumns._ID))

//1:image 3:video
val mediaType=crsCursor.getInt(crsCursor.getColumnIndex(MediaStore.Files.FileColumns.MEDIA_TYPE))

// URIを取得
var fileUri:Uri?=null
if(mediaType==1) {
                                         //画像のときの処理
fileUri = Uri.withAppendedPath(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, id.toString())
}
else if(mediaType==3){
//動画のときの処理
fileUri = Uri.withAppendedPath(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, id.toString())
}
crsCursor.moveToNext()
}
crsCursor.close()