[英]How to get the Song ID, Album ID and Artist ID from the currently playing song from the google play music
我正在開發自己的應用程序,希望在其中獲取在任何媒體應用程序上播放的歌曲的詳細信息。 我無法獲取當前正在播放歌曲詳細信息(例如歌曲ID,歌手ID,專輯ID)的Google Play音樂應用的數據。
我試過下面的代碼:
IntentFilter intentFilter=new IntentFilter();
intentFilter.addAction("com.android.music.metachanged");
intentFilter.addAction("com.android.music.playstatechanged");
intentFilter.addAction("com.android.music.playbackcomplete");
intentFilter.addAction("com.android.music.queuechanged");
intentFilter.addAction("com.samsung.sec.android.MusicPlayer.metachanged");
intentFilter.addAction("com.spotify.music.playbackstatechanged");
intentFilter.addAction("com.spotify.music.metadatachanged");
intentFilter.addAction("com.apple.android.music.metachanged");
intentFilter.addAction("com.apple.android.music.playstatechanged");
intentFilter.addAction("com.rdio.android.metachanged");
intentFilter.addAction("com.rdio.android.playstatechanged");
//register the intentfilters into the reciever
registerReceiver(mReceiver,intentFilter);
這是我的收件人:
BroadcastReceiver mReceiver=new BroadcastReceiver() {
@Override
public void onReceive(Context context, final Intent intent) {
String action = intent.getAction();
//Bundle bundle=intent.getExtras();
String cmd = intent.getStringExtra("command");
Log.v("tag ", action + " / " + cmd);
//not getting the song id in the google play music and album_id and artist id in both
final String song_id=String.valueOf(intent.getLongExtra("id", 0));
final String album_id= String.valueOf(intent.getLongExtra("album_id",0));
final String artist_id= String.valueOf(intent.getLongExtra(MediaStore.Audio.Artists._ID,0));
final String title=intent.getStringExtra("track");
final String playlist_id= String.valueOf(intent.getLongExtra(MediaStore.Audio.Playlists._ID,0));
final String playlist_name=intent.getStringExtra(MediaStore.Audio.Playlists.NAME);
final String artist=intent.getStringExtra(MediaStore.Audio.AudioColumns.ARTIST);
final String album=intent.getStringExtra(MediaStore.Audio.AudioColumns.ALBUM);
}
};
在默認播放器中獲取歌曲詳細信息,但不在Google Play音樂中獲取。
由於其他答案僅是正確的而並非完全正確,因此以下是該問題的實際答案:PlayMusic擁有自己的內容提供商,您可以查詢。
這是一個工作示例(trackId是意圖之外的SongId):
private void loadPlayMusicSongDetails(Context context, String trackId){
String artistName = null;
String albumName = null;
String trackName = null;
long year = 0;
String[] proj = { MediaStore.Audio.AudioColumns.TITLE,
MediaStore.Audio.AudioColumns.ARTIST,
MediaStore.Audio.AudioColumns.ALBUM,
MediaStore.Audio.AudioColumns.YEAR,
MediaStore.Audio.AudioColumns.ALBUM_ID,
PLAY_MUSIC_COLUMN_ARTWORK_LOCATION,
//"artworkUrl",
//"VThumbnailUrl",
MediaStore.Audio.AudioColumns._ID };
Uri gMusicUri = Uri.parse("content://com.google.android.music.MusicContent/audio");
try {
Uri uri = ContentUris.withAppendedId(gMusicUri, Long.parseLong(trackId));
Cursor cursor = context.getContentResolver().query(uri,
proj, null, null, null);
if(cursor.moveToFirst()){
int titleColumn = cursor.getColumnIndex(MediaStore.Audio.AudioColumns.TITLE);
int artistColumn = cursor.getColumnIndex(MediaStore.Audio.AudioColumns.ARTIST);
int albumColumn = cursor.getColumnIndex(MediaStore.Audio.AudioColumns.ALBUM);
int yearColumn = cursor.getColumnIndex(MediaStore.Audio.AudioColumns.YEAR);
int albumArtColumn = cursor.getColumnIndex(PLAY_MUSIC_COLUMN_ARTWORK_LOCATION);
trackName = cursor.getString(titleColumn);
artistName = cursor.getString(artistColumn);
albumName = cursor.getString(albumColumn);
year = cursor.getLong(yearColumn);
String albumArtLocation = cursor.getString(albumArtColumn);
if(albumArtLocation != null && albumArtLocation.length() > 0){
if(albumArtLocation.startsWith("mediastore:")){
long albumId = Long.parseLong(albumArtLocation.substring(albumArtLocation.indexOf(":")+1));
Uri sArtworkUri = Uri.parse("content://media/external/audio/albumart");
setAlbumArtUri(ContentUris.withAppendedId(sArtworkUri, albumId));
}
else {
//TODO: perform http calls if you wanna query for online images
}
}
}
要獲取歌曲ID,藝術家ID和專輯ID,您應該使用此方法。 從中您可以得到它。
ContentResolver contentResolver = getActivity().getContentResolver();
Uri uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
String selection = MediaStore.Audio.Media.IS_MUSIC + "!= 0";
String sortOrder = MediaStore.Audio.Media.TITLE + " ASC";
Cursor cursor = contentResolver.query(uri, null, selection, null, sortOrder);
if (cursor != null && cursor.getCount() > 0) {
audioList = new ArrayList<>();
while (cursor.moveToNext()) {
String data = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.DATA));
String title = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.TITLE));
String album = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ALBUM));
String artist = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ARTIST));
String album_id = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ALBUM_ID));
Long albumid = Long.parseLong(album_id);
Uri sArtworkUri = Uri.parse("content://media/external/audio/albumart");
Uri finaluri = ContentUris.withAppendedId(sArtworkUri, albumid);
String path = FileUtils.getPath(getContext(), finaluri);
//Bitmap artwork = BitmapFactory.decodeStream(in);
// Save to audioList
audioList.add(new Audio(data, title, album, artist,path));
}
}
cursor.close();
我以前看過博客,給我個思路,我還沒有嘗試過,但是感覺應該可以實現的。
1.播放下一首音樂時,該應用將被廣播,並且廣播中將包含下一首歌曲的信息;
2.例如:Android系統的音樂播放器將發送“ com.android.music.metachanged”廣播;
3.registerReceiver
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("com.android.music.metachanged");
registerReceiver(Your Receiver, intentFilter);
4.意圖分析,您可以從意圖中獲取此信息
intent.getStringExtra("album");
intent.getStringExtra("artist");
intent.getStringExtra("track");
intent.getStringExtra("notify_artistname");
intent.getStringExtra("notify_audioname");
5.我不知道Google Play音樂是否會發送廣播,我也不知道Google Play音樂的IntentFilter。
6.祝你成功!
您需要閱讀Id3Tag以獲得此信息,這是MediaMetadataRetriever的一些文檔。 您可以使用它與Android中的Id3Tag配合使用。
用法示例:
MediaMetadataRetriever mmr = new MediaMetadataRetriever();
mmr.setDataSource(filePath);
String albumName = mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_ALBUM);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.