package com.example.android.recipe094; import java.util.Set; import android.app.Activity; import android.content.BroadcastReceiver; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.content.ServiceConnection; import android.os.Bundle; import android.os.IBinder; import android.os.RemoteException; import android.util.Log; import android.view.View; import android.widget.TextView; import com.android.music.IMediaPlaybackService; public class Recipe094 extends Activity { private static final String TAG = "Recipe094"; private ServiceConnection mConn; private IMediaPlaybackService mService; private MusicBroadcastReceiver mReceiver; private TextView mTrackTextView; private TextView mArtistTextView; private TextView mAlbumTextView; private TextView mPlayingTextView; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); mTrackTextView = (TextView)findViewById(R.id.track); mArtistTextView = (TextView)findViewById(R.id.artist); mAlbumTextView = (TextView)findViewById(R.id.album); mPlayingTextView = (TextView)findViewById(R.id.playing); } @Override public void onResume() { super.onResume(); // インテントを作って Intent intent = new Intent(); intent.setClassName("com.android.music", "com.android.music.MediaPlaybackService"); // サービスコネクションを作って mConn = new MediaPlayerServiceConnection(); // バインドします。 bindService(intent, mConn, 0); // インテントフィルターを作って IntentFilter filter = new IntentFilter(); // 以下のアクションに反応します。 filter.addAction("com.android.music.metachanged"); filter.addAction("com.android.music.playbackcomplete"); filter.addAction("com.android.music.playstatechanged"); // ブロードキャストレシーバを作って mReceiver = new MusicBroadcastReceiver(); // 登録します。 registerReceiver(mReceiver, filter); } @Override public void onPause() { super.onPause(); // ブロードキャストレシーバを解除します。 unregisterReceiver(mReceiver); // サービスへのバインドを解除します。 unbindService(mConn); } // サービスコネクションです。 private class MediaPlayerServiceConnection implements ServiceConnection { // サービスに接続できた時に呼び出されます。 public void onServiceConnected(ComponentName name, IBinder service) { // IMediaPlaybackServiceのインスタンスを取得 mService = IMediaPlaybackService.Stub.asInterface(service); // 表示内容を更新する。 updateMusicInfo(); } // サービスとの接続が切れた時に呼び出されます。 public void onServiceDisconnected(ComponentName name) { } } // ブロードキャストレシーバです。 private class MusicBroadcastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { // アクション名をログ出力 Log.d(TAG, "recieved action: " + intent.getAction()); // インテントにセットされた値を確認してみます。 // 以下はデバッグ用です。 Bundle bundle = intent.getExtras(); if (bundle != null) { // キーの一覧をログ出力 Set<String> keys = bundle.keySet(); for (String key : keys) { Log.d(TAG, "key: " + key); } // どうやら以下が取得できそうなのでログ出力 // 曲名 String track = bundle.getString("track"); Log.d(TAG, "track: " + track); // アーティスト名 String artist = bundle.getString("artist"); Log.d(TAG, "artist: " + artist); // アルバム名 String album = bundle.getString("album"); Log.d(TAG, "album: " + album); } // 表示内容を更新する。 updateMusicInfo(); } } // 画面の表示内容を更新します。 private void updateMusicInfo() { if (mService == null) return; try { // 曲名を取得してセット mTrackTextView.setText( "Track: " + mService.getTrackName()); // アーティスト名を取得してセット mArtistTextView.setText( "Artist: " + mService.getArtistName()); // アルバム名を取得してセット mAlbumTextView.setText( "Album: " + mService.getAlbumName()); // 再生中かどうかを判定してセット if (mService.isPlaying()) { mPlayingTextView.setText("Playing"); } else { mPlayingTextView.setText("Not playing"); } } catch (Exception e) { e.printStackTrace(); throw new RuntimeException(e); } } public void onPrevButton(View view) { if (mService != null) { try { // 前の曲へ mService.prev(); } catch (RemoteException e) { e.printStackTrace(); } } } public void onStopButton(View view) { if (mService != null) { try { // 停止 mService.stop(); } catch (RemoteException e) { e.printStackTrace(); } } } public void onPauseButton(View view) { if (mService != null) { try { // 一時停止 mService.pause(); } catch (RemoteException e) { e.printStackTrace(); } } } public void onPlayButton(View view) { if (mService != null) { try { // 再生 mService.play(); } catch (RemoteException e) { e.printStackTrace(); } } } public void onNextButton(View view) { if (mService != null) { try { // 次の曲へ mService.next(); } catch (RemoteException e) { e.printStackTrace(); } } } }