1

_ID と AUDIO_ID の違い ( _ID と AUDIO_ID 列の違いは何ですか? ) を知った後、代わりに AUDIO_ID を使用するようにクエリを変更していますが、ここで問題が発生しました。

これは、外部ストレージ内のすべてのオーディオ ファイルをクエリし、AUDIO_ID が埋め込まれた各ファイルの「Music」インスタンスを作成することを意図した私のコード スニペットです。

Uri uri = android.provider.MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
Cursor cur = mContentResolver.query(uri, null, 
    MediaStore.Audio.Media.IS_MUSIC + " = 1", null, null);

int artistColumn = cur.getColumnIndex(MediaStore.Audio.Media.ARTIST);
int titleColumn = cur.getColumnIndex(MediaStore.Audio.Media.TITLE);
int idColumn = cur.getColumnIndex(MediaStore.Audio.Playlists.Members.AUDIO_ID);

// All of the above columns return the right integers, 
// except idColumn which returns -1 thus making my further code below throws an exception

do{
    Music music = new Music(); // it's my music class
    music.setArtist( cur.getString(artistColumn) );
    music.setTitle( cur.getString(titleColumn) );
    music.setId( cur.getLong(idColumn) ); // error here, because idColumn = -1 (column not found)

    // ......
} while (cur.moveToNext())

AUDIO_IDクエリ時に列を取得できないのはなぜMediaStore.Audio.Media.EXTERNAL_CONTENT_URIですか? それを取り戻す方法はありますか?(任意の回避策を歓迎します)

ここの回答コメントで説明されているように、アプリにはオーディオファイルへの絶対参照が必要なので、必要です-> https://stackoverflow.com/a/17648131/670623

ありがとう :)

編集

私が探しているものに近い解決策の質問を見つけました(AUDIO_IDを取得できます)が、特定のプレイリストからすべてのオーディオファイルをリストすることを目的としています。私の懸念は、どのプレイリストからのものかに関係なく、メディアストア全体に AUDIO_ID を照会することです。

Android の音楽プレイリスト名が与えられた場合、プレイリスト内の曲を見つけるにはどうすればよいですか?

4

1 に答える 1

4

MediaStore.Audio.MediaMediaStore.Audio.Playlists.Membersデータベースでいくつかのテストを行いました。同じ曲が数回含まれている小さなプレイリストを作成しました。データベースは次のようになります。

プレイリスト データベース

+ ---------------------------+
|_ID | AUDIO_ID | 曲名 |
+ ---------------------------+
|273 | 2913 | 一人で |
|274 | 1487年 | 赤ちゃん |
|275 | 2913 | 一人で |
|276 | 2913 | 一人で |
|277 | 1487年 | 赤ちゃん |
|278 | 2648 | バッテリー |
+ ---------------------------+

予想どおり_ID、このプレイリスト内でローカルに一意の識別子です。もちろん、独自の_ID識別子を持つ他のいくつかのプレイリストが存在する可能性があります。AUDIO_ID同じ曲が 1 つのプレイリストに複数回表示される可能性があるため、このデータベースの特定の行を識別するために使用することはできません。

AUDIO_IDは、特定の曲に対して常に同じであるグローバルに一意の識別子です。

MediaStore.Audio.Mediaそれでは、データベースを見てみましょう。ここには、MediaStore システムで認識されているすべての曲が保存されます。(これはほんの一部です)

メディア データベース

+---------------------+
|_ID | 曲名 |
+---------------------+
| | .... |
|1487 | 赤ちゃん |
| | .... |
|2648 | バッテリー |
| | .... |
|2913 | 一人で |
| | .... |
+---------------------+

_IDの識別子は、データベースMediaStore.Audio.Mediaで呼び出されるグローバルに一意の識別子として使用されているようです。AUDIO_IDMediaStore.Audio.Playlists.Members

これは最初は奇妙に思えますが、すべての曲は に含まれている必要がMediaStore.Audio.Mediaあり、そこには 1 回しか表示されません。そして、そのようなデータベースは 1 つしかないため_ID、このデータベースでは曲ごとにグローバルに一意である必要があります。

于 2014-06-05T21:01:03.990 に答える