rokkonet

PC・Androidソフトウェア・アプリの開発・使い方に関するメモ

android開発 ContentResolver#query 絞り込み条件指定

2022 Jul. 18.
2022 May 02.
2022 Jan. 30.

参考ページ
共有ストレージからメディア ファイルにアクセスする  |  Android デベロッパー  |  Android Developers
ContentResolverでソート・絞り込み検索の条件を追加する方法|Androidアプリ開発のあれこれ

ContentResolver#queryの第3引数に絞り込み条件を指定し、第4引数に絞り込み条件の引数を指定する


import java.util.concurrent.TimeUnit

fun GetAudioFile() {
        // queryの引数の設定
        val collection =
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
                MediaStore.Audio.Media.getContentUri(
                    MediaStore.VOLUME_EXTERNAL
                )
            } else {
                MediaStore.Audio.Media.EXTERNAL_CONTENT_URI
            }

        val columns = arrayOf(
            MediaStore.Audio.Media._ID,
            MediaStore.Audio.Media.DISPLAY_NAME,
            MediaStore.Audio.Media.SIZE,
            "_data"
        )

        // 1分間以上のAudioを指定する
        val selection = "${MediaStore.Audio.Media.DURATION} >= ?"
        val selectionArgs = arrayOf(
            TimeUnit.MILLISECONDS.convert(1, TimeUnit.MINUTES).toString()
        )

        val resolver = applicationContext.contentResolver
        val query = resolver.query(
            collection,  //データの種類
            columns, //取得する項目 nullは全部
            selection, //フィルター条件 nullはフィルタリング無し
            selectionArgs, //フィルター用のパラメータ
            null   //並べ替え
        )

        query?.use { cursor ->
            val idColumn = cursor.getColumnIndexOrThrow(MediaStore.Audio.Media._ID)
            val displayNameColumn =
                    cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DISPLAY_NAME)
            val sizeColumn = cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.SIZE)
            val column_index = cursor.getColumnIndexOrThrow("_data")

            cursor.moveToPosition(getRandomNum(numCount!!))
            val id = cursor.getLong(idColumn)
            val displayName = cursor.getString(displayNameColumn)
            val mediaSize = cursor.getInt(sizeColumn)
            val contentUri: Uri = ContentUris.withAppendedId(
                MediaStore.Video.Media.EXTERNAL_CONTENT_URI,id)
            val pathOfUri = cursor.getString(column_index)

            val audioIntent = Intent()
            audioIntent.action = Intent.ACTION_VIEW
            audioIntent.setDataAndType(Uri.parse(pathOfUri), "audio/*")
            // audioIntent.setDataAndType(contentUri, "audio/*")  <- NG
            startActivity(audioIntent)

            /*
            Log.d(
                "MyApp", "id: $id, name: $displayName, ${mediaSize}Byte, uri: $contentUri"
            )
            */

            // Log.d("MyApp", "Selected " + pathOfUri!!)

        }
        query?.close()
}