メディアクエリを使って共有ストレージのプレイリスト一覧を取得する

ExoPlayerを触ることに始まって、今は、UAMPを改造して様子を見ているところである。ハードコードによって、m3u8プレイリストの読み込みには対応できたのであるが、これを一括読み込みにしたいので、メディアクエリを使ってみた。

メディアクエリの構築

val projection = arrayOf(MediaStore.Audio.Playlists.NAME, MediaStore.Audio.Playlists._ID, MediaStore.Audio.Playlists.DATA)
val selection = ""
var selectionArgs = emptyArray<String>()
val sortOrder = ""

val use = applicationContext.contentResolver.query(
    MediaStore.Audio.Playlists.EXTERNAL_CONTENT_URI,
    projection,
    selection,
    selectionArgs,
    sortOrder
)?.use { cursor ->
    while (cursor.moveToNext()) {
        // Use an ID column from the projection to get
        // a URI representing the media item itself.
        Log.d("", cursor.getString(0))
        val contentUri: Uri = ContentUris.withAppendedId(
            MediaStore.Audio.Playlists.EXTERNAL_CONTENT_URI,
            cursor.getString(1).toLong()
        )
        Log.d("", contentUri.toString())
    Log.d("", cursor.getString(2))
    }
}

対象をオーディオプレイリスト、取得項目リストは名前とID、取得条件やソート条件は無しにしている。これで、名前を取得し、IDからuriが取得できることになる。

実行結果

D/: fripSide-singles
content://media/external/audio/playlists/277
/storage/1612-2708/Music/Playlists/fripSide-singles.m3u8
fripSide
content://media/external/audio/playlists/278
/storage/1612-2708/Music/Playlists/fripSide.m3u8
D/: アニメタル
content://media/external/audio/playlists/544
/storage/1612-2708/Music/Playlists/アニメタル.m3u8

今回の例では、デバッグコンソールに上記のように表示された。このURIを使うように修正をかけて、様子を見るところである。

2020/9/4追記

最初はuriを取得してみたのであるが、私のプログラムの関係で、java.io.Fileを使うので、しらべたところ、上記のコードのように、MediaStore.Audio.Playlists.DATAを取得してみたところ、ファイルパスが取得できたので、こちらを使用するようにした。

まとめ

エラーが出ていたときの例外スタックフレームなどを読んでいると内部でSQLを実行しているようなので、パラメータは SQL文に近いようである。対象がプレイリストだと一覧だけが必要なので、指定するならソート順程度になるであろうか?

次の課題は、SDカードのパスの取得である。(m3u8ファイルの各行の頭につける)

コメント