アプリから他のアプリで再生されている楽曲情報を取得する方法を紹介します。
前提として
iOSの場合は、デフォルトのMusicアプリ。Androidの場合はGoogle Play Musicアプリから取得ができます。
iOSはサードパーティ製のアプリから情報を取得することが出来ません。Androidは対象の音楽プレイヤーアプリが対応していればできますが、現状私が把握しているのはGoogle Play Musicのみです。
また両アプリとも、ストリーミングでの定額聴き放題サービスをしていますが、その曲であっても取得可能です。
iOS
初めにMediaPlayer.frameworkをプロジェクトに入れてください。そしたら下記コードを書くことで、Musicアプリで再生中の楽曲情報を取得ができます。
Swift
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
import UIKit import MediaPlayer // ここの追加を忘れずに。 class ViewController: UIViewController { override func viewDidAppear(animated: Bool) { super.viewDidAppear(animated) let item : MPMediaItem? = MPMusicPlayerController.systemMusicPlayer().nowPlayingItem if let uwItem = item { NSLog("Title : %@", uwItem.title!) NSLog("Artist : %@", uwItem.artist!) NSLog("AlbumTitle : %@", uwItem.albumTitle!) NSLog("Duration : %g", uwItem.playbackDuration) } } } |
Objective-C
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
#import "ViewController.h" #import <MediaPlayer/MediaPlayer.h> @implementation ViewController - (void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; MPMediaItem *item = [[MPMusicPlayerController systemMusicPlayer] nowPlayingItem];■Android if (item) { NSLog(@"Title : %@", item.title); NSLog(@"Artist : %@", item.artist); NSLog(@"AlbumTitle : %@", item.albumTitle); NSLog(@"Duration : %g", item.playbackDuration); } } @end |
Android
こちらの場合は、Google Play MusicのアプリがIntentを投げてくれるので、それをアプリ側のBroadCastReceiverで取得します。
iOSと違うのはiOSは再生中、もしくは停止中のものが取得できますが、Androidは、再生されたり、再生位置が変わったり、再生状態が切り替わった瞬間にIntentが飛んで来るので、扱いには注意して下さい。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
// IntentFilterのセット public void setIntentFilter() { IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction("com.android.music.metachanged"); intentFilter.addAction("com.android.music.playstatechanged"); intentFilter.addAction("com.android.music.playbackcomplete"); registerReceiver(musicStartedReceiver, intentFilter); } private BroadcastReceiver musicStartedReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { // 受信した際に下記に情報が来る try { String action = intent.getAction(); String cmd = intent.getStringExtra("command"); Log.d(TAG, action + " / " + cmd); String artist = intent.getStringExtra("artist"); String album = intent.getStringExtra("album"); String track = intent.getStringExtra("track"); // title Long duration = intent.getLongExtra("duration",0); Log.d(TAG, artist+":"+album+":"+track+":"+duration); Set<String> keys = intent.getExtras().keySet(); for (String key : keys) { Log.d(TAG, "ACTION_BATTERY_CHANGED's key=" + key); } } catch (BadParcelableException e) { Log.e(TAG, e.getMessage()); } } }; |
最後に
これをやりたいという要件はあまり無いかもしませんが、お役に立てば幸いです。