rokkonet

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

android開発 外部ストレージ共有領域の特定ディレクトリ内のメディアファイル取得

2022 May 08.
2022 Apr. 30.

端末

android 11 ( APIレベル 30 )

参考

android開発 ContentResolver 音声メディア・動画メディアへのクエリによるメディア情報取得 - rokkonet

概要

ContentResolverのprojectionに"_data"をセットしてメディアファイルをクエリーし、"_data"から取得したディレクトリで取捨選択する。
("_data"にファイルパスが入っている)

外部ストレージ共有領域内のディレクトリの取得
android開発 deprecatedなメソッドを使わずに外部ストレージ共有領域のパスを取得するにはファイルピッカーを使うしかないと思われる - rokkonet

サンプルkotlinコード
        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 projection = arrayOf(
            MediaStore.Audio.Media._ID,
            "_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,  //データの種類
            projection, //取得する項目 nullは全部
            selection, //フィルター条件 nullはフィルタリング無し
            selectionArgs, //フィルター用のパラメータ
            null   //並べ替え。nullは並べ替えしない
        )

        query?.use { cursor ->
            val pathColumn = cursor.getColumnIndexOrThrow("_data")

            while (cursor.moveToNext()) {
                val pathOfUri = cursor.getString(pathColumn)
                // ここで、pathOfUriの文字列を調べてメディアファイルを取捨選択する
            }
        }
        query?.close()