MediaPlayerで音楽を連続して再生。

1,495 views
Skip to first unread message

zhangho

unread,
Jul 17, 2009, 3:37:09 AM7/17/09
to Android-SDK-Japan
お疲れ様です。
崔と申します。

音楽再生アプリを作っていて、サービスとして再生できました。
ただ、一つの一つ再生できたものの、音楽リストを渡して連続再生の仕方がよく分からないです。

一曲目の終わりタイミングを判断して、
アクションを呼び出すような方式とかメソッドが無いでしょうか?

以上、よろしくお願いします。

pccra...@gmail.com

unread,
Jul 17, 2009, 3:57:33 AM7/17/09
to Android-SDK-Japan
崔様こんにちは
ピーシークラフトです。

再生処理をAsyncTaskのスレッドとして実装すると、
処理が終わったときに onPostExecute がコールバックされます。
以下のようなコードで実現できます。

new Task().execute(引数);

private class Task extends
AsyncTask<String, ThreadResult, ThreadResult> {
@Override
protected ThreadResult doInBackground(String... s) {
try {
return クラス関数呼び出し;
} catch (Exception e) {
onPostExecute(null);
}
return null;
}

@Override
protected void onPostExecute(ThreadResult result) {
postTask(result);
}
}

private void postTask(ThreadResult result) {
スレッド終了後の処理

zhangho

unread,
Jul 17, 2009, 5:09:46 AM7/17/09
to Android-SDK-Japan
>AsyncTask
おお!
やってみます。

zhangho

unread,
Jul 22, 2009, 3:08:18 AM7/22/09
to Android-SDK-Japan
static MediaPlayer mp = new MediaPlayer();
mp.start();

ミュージックプレーヤの関数start()が非同期なので
その開始タイミングですぐAsyncTaskのdoInBackgroundが終わってonPostExecute()に入ります。
それで.isPlaying()関数とsetOnCompletionListener()組み合わせて終了タイミングを判断して
何とか音楽を連続してプレイできるようになりました。

ただ、最終曲目が終わってサービスが終わるとフォーグラウンドのメイン画面に終了を通知する方式がよく分からないですね。
showNotification()関数の中で intent.putExtra()はパラメタを渡しませんでした。

サービスからその呼び出し側にメッセージを通知するのに 何かいい方法がありますでしょうか?

private void showNotification() {
CharSequence text = getText(R.string.local_service_started);

Notification notification = new Notification
(R.drawable.indicator_ic_mp_playing_list, text,
System.currentTimeMillis());

nowPlayING = mp.isPlaying();
Intent intent = new Intent(this, MusicList.class);
intent.putExtra("startMusic",startMusic);
intent.putExtra("nowPlayING",nowPlayING);

PendingIntent contentIntent = PendingIntent.getActivity(this, 0,
intent, 0);
notification.setLatestEventInfo(this, getText
(R.string.local_service_label),
text, contentIntent);
mNM.notify(R.string.local_service_started, notification);
}

pccra...@gmail.com

unread,
Jul 22, 2009, 3:22:06 AM7/22/09
to Android-SDK-Japan
こんにちは ピーシークラフトです。
デバッグ中のHT-03A にピコッとメールが入って、目の前にそんなコードがあるので
レスさせていただきます。

サービスをコールする側にレシーバーを設置します。

IntentFilter filter = new IntentFilter(
hoge.ACTION); // 呼び出すクラスに書かれたStringメッセージ
registerReceiver(receiver, filter);


private BroadcastReceiver receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
unregisterReceiver(receiver);
// 一回しか呼ばれないのであれば、ここで登録解除

}
};

何回も呼ばれるのであればデストラクタで登録解除して下さい。

pccra...@gmail.com

unread,
Jul 22, 2009, 3:24:40 AM7/22/09
to Android-SDK-Japan
追記です。サービスからActivity等にメッセージを投げるのは

sendBroadcast(new Intent(ACTION));

です。

zhangho

unread,
Jul 23, 2009, 1:47:15 AM7/23/09
to Android-SDK-Japan
> sendBroadcast(new Intent(ACTION));

うまく出来ました。
onReceive()自動的にunregisterReceiver()を実行されるみたいですね。

連続のsendBroadcast()に反応するためにはonReceive()の中で処理を終えてregisterReceiver()を再度呼び出
す必要がありますね。
Reply all
Reply to author
Forward
0 new messages