簡體   English   中英

如何從Google Play音樂中當前播放的歌曲中獲取歌曲ID,專輯ID和歌手ID

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM