MediaPlayerで再生したファイルをintentで遷移させた先でstopさせる その1


再生させたMediaPlayerをintentした先で停止させる方法です。
生成したMediaPlayerインスタンスを、intentした先でも引き継がなくてはいけません。

イメージとしては、
[MainActivity]で再生を開始し、次の画面に遷移。
遷移した[StopActivity]で停止するという動作ですが、これには別で定義したクラスを継承しなくてはいけません。

まずはレイアウトファイルから。
[activity_main.xml]

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:gravity="center"
    android:orientation="vertical" >

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginRight="8dp"
        android:onClick="PLAY"
        android:text="再生" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginRight="8dp"
        android:onClick="NEXT"
        android:text="移動" />

</LinearLayout>

再生ボタンを押すと、ファイルをループで再生。
移動ボタンを押すと、別のアクティビティへ。

[activity_stop.xml]

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:gravity="center"
    android:orientation="vertical" >

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginRight="8dp"
        android:onClick="STOP"
        android:text="停止" />

</LinearLayout>

次に、Activityのソースコードです。
ここで注意。普段はActivityを継承していますが、今回はオリジナルのクラス[AlarmActivity]を継承します。
[MainActivity]

public class MainActivity extends AlarmActivity {
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
	}

	public void PLAY(View v) {
		mpStart();
	}

	public void NEXT(View v) {
		Intent intentMain = new Intent(this, StopActivity.class);
		startActivity(intentMain);
		finish();
	}
}

[StopActivity]

public class StopActivity extends AlarmActivity {
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_stop);
	}

	public void STOP(View v) {
		mpStop();
	}
}

このように、非常にスッキリとしたシンプルな構成になります。
このままだとエラーが出まくりだと思います。

継承元である、AlarmActivityを作らなくてはいけません。
[AlarmActivity]

public class AlarmActivity extends Activity {
	static protected MediaPlayer mp;
	static protected AudioManager am;

	@Override
	protected void onCreate(Bundle state) {
		super.onCreate(state);

		//MediaPlayerインスタンスの生成
		if (mp == null) {
			Uri uri = Uri.parse("android.resource://" + getPackageName() + "/" + R.raw.alarm);

			mp = MediaPlayer.create(this, uri);
			mp.setLooping(true);
		}

		if (am == null) {
			am = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
		}
	}

	protected void mpStart() {
		if (!mp.isPlaying()) {
			mp.start();
		}
	}

	protected void mpStop() {
		if (mp.isPlaying()) {
			mp.stop();
		}
	}

	protected int getMaxVolume() {
		int max = am.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
		return max;
	}

	protected int getNowVolume() {
		int Vol = am.getStreamVolume(AudioManager.STREAM_MUSIC);
		return Vol;
	}

	protected void setVolume(int vol) {
		am.setStreamVolume(AudioManager.STREAM_MUSIC, vol, 0);
	}

}

Activityを継承したAlarmActivityを継承したMainActivityとStopActivity、という感じです。ちょっとややこしいですが……。
こうすることで、共通のMediaPlayerインスタンスを使うことができ、別のActivityからでも再生・停止の操作が可能です。

MediaPlayerで再生したファイルをintentで遷移させた先でstopさせる その1” への1件のコメント
  1. It really seem that Google has went on a tear this year with updates. Did you really have that many sites get hit? In my industry, there has been some effect, but it has not been drastic. I am seeing EMD’s drop a few positions, but that is about it.

2 Ping/トラックバック のために "MediaPlayerで再生したファイルをintentで遷移させた先でstopさせる その1"
  1. […] 前回の記事で、異なるActivity間で共通のMediaPlayerインスタンスを使い、別の画面で再生開始した音声を、また別の画面で停止するという方法を書きました。 […]

  2. […] MediaPlayerで再生したファイルをintentで遷移させた先でstopさせる その1 […]

コメントを残す

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください