最近在做Android手机获取第三方音乐播放器的音乐信息。一开始头疼的很,采集第三方的信息太难了,后面看了一遍博文是关于怎么监听系统的音乐播放信息,发现在播放下一首音乐的时候会发送广播,广播会包含下一首信息。
Android系统的音乐播放器会发送:
com.android.music.metachanged
那怎么获取第三方的音乐信息?
先反编译了QQ音乐的Apk, 找到它关于player的service,发现里面用的就是“com.android.music.metachaged”
接下来是Kugou,天天动听,千千静听
com.kugou.android.music.metachanged com.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后,再屏幕取词?需要继续研究下。
这个分析后,发现广播用多了也不是什么好事,很容易被别人获取到数据。