1

音楽放送を聴くAndroidアプリがあります。次の ApplicationManifest.xml (スニペット) を使用してトラック変更通知を受け取ります。

    <receiver android:name=".music.AndroidMusicBroadcastReceiver">
        <intent-filter>
            <action android:name="com.android.music.metachanged"/>
            <action android:name="com.android.music.playbackcomplete"/>
            <action android:name="com.android.music.playstatechanged"/>
            <action android:name="com.htc.music.metachanged"/>
            <action android:name="com.htc.music.playbackcomplete"/>
            <action android:name="com.htc.music.playstatechanged"/>
        </intent-filter>
    </receiver>

デフォルト(組み込み)のGoogle Play ミュージックアプリを実行している nexus 4 からこのブロードキャスト インテントを取得すると、バンドルには「アーティスト」や「タイトル」など、現在再生中のトラックに関する有用な情報が含まれています。私が望むファイルパスがありません。しかし、「id」フィールド (a long) があるので、その ID をキーとして追加情報を検索できるのではないかと思います。しかし、私は理解できません: この ID がキーになっているデータベース/コンテンツ プロバイダーは何ですか?


私がこれまでに試したこと:

1) これは、次のいずれかのコンテンツ リゾルバーの _ID フィールドに対応すると予想していました。

  • MediaStore.Audio.Media.INTERNAL_CONTENT_URI
  • MediaStore.Audio.Media.EXTERNAL_CONTENT_URI

しかし、私はそれらの両方を照会しようとしましたが、ID は同じ球場のどこにもありません。私の現在の例は、(ブロードキャストで)の「ID」を取得していることです3399。しかし、EXTERNAL_CONTENT_URI 内のすべてのトラックを照会すると、20865 ~ 23051 の範囲の ID と、いくつかの小さな ID (20 と 24、Google+ アプリによってインストールされた通知と着信音に対応) が得られます。

このソースの場合、現在再生中のトラックの ID は次のようになります21373(パスに基づいて ID を調べましたが、これは手動で調べることでわかります)。

INTERNAL_CONTENT_URI は、組み込みのもの (着信音など) を提供するだけです。すべての ID が 100 未満であるため、これも役に立ちません。

2) を使用して、すべてのメディア オブジェクトに対して同じクエリを実行しMediaStore.Files.getContentUri("external")ました。たくさんの結果が返ってきましたが、ID3399は newsrob (RSS リーダー) によってキャッシュされたランダムなファイルであるため、明らかに関連性がありません。

4

1 に答える 1

1

MediaPlaybackService.java のソース コードを見てみましょう。

private void notifyChange(String what) {

    Intent i = new Intent(what);
    i.putExtra("id", Long.valueOf(getAudioId()));
    i.putExtra("artist", getArtistName());
    i.putExtra("album",getAlbumName());
    i.putExtra("track", getTrackName());
    i.putExtra("playing", isPlaying());
    ...
}

/**
 * Returns the rowid of the currently playing file, or -1 if
 * no file is currently playing.
 */
public long getAudioId() {
    synchronized (this) {
        if (mPlayPos >= 0 && mPlayer.isInitialized()) {
            return mPlayList[mPlayPos];
        }
    }
    return -1;
}

ContentProvider に関するいくつかのコード:

Cursor crsr = MusicUtils.query(this,
                    MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
                    new String [] {"_id"}, "_id=" + mPlayList[mPlayPos] , null, null);

別に言う必要はないと思います。:) これがお役に立てば幸いです。

于 2013-02-27T12:41:32.737 に答える