最近在做Android手機擷取第三方音樂播放器的音樂資訊。一開始頭疼的很,採集第三方的資訊太難了,後面看了一遍博文是關於怎麼監聽系統的音樂播放資訊,發現在播放下一首音樂的時候會發送廣播,廣播會包含下一首資訊。
Android系統的音樂播放器會發送:
com.android.music.metachanged
那怎麼擷取第三方的音樂資訊?
先反編譯了QQ音樂的Apk, 找到它關於player的service,發現裡面用的就是“com.android.music.metachaged”
接下來是Kugou,天天動聽,千千靜聽
com.kugou.android.music.metachangedcom.ting.mp3.playinfo_changed
糾結的事出現是分析蝦米,多米,Kuwo時候
蝦米最新版本在反編譯時間報錯,人家做了防反編譯,雖然網上搜了怎麼破解,但有點麻煩,留著後面學習。高版本做了防反編譯,但你低版本的時候技術還沒這麼牛吧。我下了一個低版本,果然反編譯成功,找到了“com.xiami.meta_changed‘。可雖然能擷取到這個廣播,但人家並沒在廣播裡放資料,它在擷取到廣播的時候再去調用擷取音樂的方法,這個代碼就寫的糾結了,到了這一步就沒辦法搞了。
多米和kuwo兩者都沒有發送廣播,它們處理的方法都是回調,所以這兩個也沒辦法擷取。
下面代碼是採集第三方音樂資訊的代碼
IntentFilter iF = new IntentFilter(); iF.addAction("com.android.music.metachanged"); iF.addAction("com.android.music.playstatechanged"); iF.addAction("com.android.music.playbackcomplete"); iF.addAction("com.android.music.queuechanged"); iF.addAction("com.htc.music.metachanged"); iF.addAction("fm.last.android.metachanged"); iF.addAction("com.sec.android.app.music.metachanged"); iF.addAction("com.nullsoft.winamp.metachanged"); iF.addAction("com.amazon.mp3.metachanged"); iF.addAction("com.miui.player.metachanged"); iF.addAction("com.real.IMP.metachanged"); iF.addAction("com.sonyericsson.music.metachanged"); iF.addAction("com.rdio.android.metachanged"); iF.addAction("com.samsung.sec.android.MusicPlayer.metachanged"); iF.addAction("com.andrew.apollo.metachanged"); iF.addAction("com.kugou.android.music.metachanged"); iF.addAction("com.ting.mp3.playinfo_changed"); registerReceiver(new PlayerReceiver(), iF);
你需要在playerReceiver裡面在加上處理廣播裡的資訊
String albumName = intent.getStringExtra("album"); String artist = intent.getStringExtra("artist"); String trackName = intent.getStringExtra("track"); String xiaMiName=intent.getStringExtra("widget_song_name"); System.out.println("The playing album name: " + albumName + " artist: " + artist + " Track:" + trackName+" xiaMiName:"+xiaMiName); String artistName = intent.getStringExtra("notify_artistname"); String audioName = intent.getStringExtra("notify_audioname");
最終上述擷取方法走不通,有些第三方的音樂資訊擷取不到。
還有一種實現方式,在播放音樂的時候,音樂播放器會發送一個notification,裡麵包含當前音樂的相關資訊。這種方式需要在systemUI裡面添加捕獲代碼,抓到特定的notification後,再螢幕取詞?需要繼續研究下。
這個分析後,發現廣播用多了也不是什麼好事,很容易被別人擷取到資料。