再生させた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からでも再生・停止の操作が可能です。
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.