音楽を鳴らしたい
rawフォルダを作って素材を入れる
ファイル名は「_」と小文字しかダメらしい。
ボタンを押して音楽を鳴らす
public class BGM extends AppCompatActivity { Button btPlay; MediaPlayer player; int r = (int) (Math.random() * 10); String mediaFileUriStr; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_bgm); btPlay = findViewById(R.id.button); player = new MediaPlayer(); if (r <= 4) { mediaFileUriStr = "android.resource://" + getPackageName() + "/" + R.raw.wakuwaku_tanoshii_christmas; }else{ mediaFileUriStr = "android.resource://" + getPackageName() + "/" + R.raw.thats_a_xmas; } Uri mediaFileUri = Uri.parse(mediaFileUriStr); try { player.setDataSource(this, mediaFileUri); player.setOnPreparedListener(new PlayerPreparedListener()); player.setOnCompletionListener(new PlayerCompletionListener()); player.prepareAsync(); } catch (IOException e) { } } public void onPlayButtonClick(View v) { if(!player.isPlaying()) { player.start(); player.setLooping(true); btPlay.setText("Pause"); }else { player.pause(); btPlay.setText("Play"); } } protected void onDestroy() { super.onDestroy(); if(player.isPlaying()) { player.stop(); } player.release(); player = null; } private class PlayerPreparedListener implements MediaPlayer.OnPreparedListener { @Override public void onPrepared(MediaPlayer mp) { btPlay.setEnabled(true); } } private class PlayerCompletionListener implements MediaPlayer.OnCompletionListener { @Override public void onCompletion(MediaPlayer mp) { btPlay.setText("Pause"); } }
MediaPlayerってのを使うと簡単にできた。try-catchはサンプルに書いてあったんだけど、これは何をするんだろう。リスナが2つもあってめんどい。asynchというのが出てきた。また非同期処理の話かー。あとにしよう。
起動したら勝手に音を鳴らす
public class BGM extends AppCompatActivity { MediaPlayer player; int r = (int) (Math.random() * 10); String mediaFileUriStr; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_bgm); player = new MediaPlayer(); if (r <= 4) { mediaFileUriStr = "android.resource://" + getPackageName() + "/" + R.raw.wakuwaku_tanoshii_christmas; } else { mediaFileUriStr = "android.resource://" + getPackageName() + "/" + R.raw.thats_a_xmas; } Uri mediaFileUri = Uri.parse(mediaFileUriStr); try { player.setDataSource(this, mediaFileUri); player.setOnPreparedListener(new PlayerPreparedListener()); player.prepareAsync(); } catch (IOException e) { } } @Override protected void onResume() { super.onResume(); if (!player.isPlaying()) { player.start(); player.setLooping(true); } } protected void onPause() { super.onPause(); if (player.isPlaying()) { player.pause(); } } protected void onDestroy() { super.onDestroy(); if (player.isPlaying()) { player.stop(); } player.release(); player = null; } private class PlayerPreparedListener implements MediaPlayer.OnPreparedListener { @Override public void onPrepared(MediaPlayer mp) { player.start(); player.setLooping(true); } }
ボタンを取っ払って、onResumeとonPauseを追加。そんでPlayerPreparedListenerにstartを書く。ふむふむ。
画面遷移しても音を鳴らす
Serviceというものが必要だそうなので、まずそのクラスを作る。
簡単。
BGM.java
public class BGM extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_bgm); Intent intent = new Intent(this, BGMService.class); startService(intent); } public void onClickMove(View view) { Intent intent = new Intent(this, Nanimonai.class); startActivity(intent); } protected void onDestroy() { super.onDestroy(); Intent intent = new Intent(this, BGMService.class); stopService(intent); } }
BGMService.java
public class BGMService extends Service { MediaPlayer player; String mediaFileUriStr; int r = (int) (Math.random() * 10); @Override public void onCreate() { super.onCreate(); player = new MediaPlayer(); } public int onStartCommand(Intent intent, int flags, int startId) { if (r <= 4) { mediaFileUriStr = "android.resource://" + getPackageName() + "/" + R.raw.wakuwaku_tanoshii_christmas; } else { mediaFileUriStr = "android.resource://" + getPackageName() + "/" + R.raw.thats_a_xmas; } Uri mediaFileUri = Uri.parse(mediaFileUriStr); try { player.setDataSource(this, mediaFileUri); player.setOnPreparedListener(new PlayerPreparedListener()); player.prepareAsync(); } catch (IOException e) { e.printStackTrace(); } return super.onStartCommand(intent, flags, startId); } private class PlayerPreparedListener implements MediaPlayer.OnPreparedListener { @Override public void onPrepared(MediaPlayer mp) { mp.start(); mp.setLooping(true); } } public void onDestroy() { super.onDestroy(); if(player.isPlaying()) { player.stop(); } player.release(); player = null; } public BGMService() { } @Override public IBinder onBind(Intent intent) { // TODO: Return the communication channel to the service. throw new UnsupportedOperationException("Not yet implemented"); } }
えーと、画面を遷移するときはIntent使う。Serviceの場合もそれと似た感じ。Serviceクラスに処理を書いて、メインからstartService(Intent), stopService(Intent)で開始・終了。だよね。
コード減ったなぁ。Serviceも非同期処理の一種らしい。違いがよくわかんないな。下2つのブロックは何に使うんだろう。
とりあえず、やりたいことはできることが分かったぞ。今度は地図の使い方勉強しよう。
参考
フリーBGM(無料音源) KBM-035 ワクワク楽しいクリスマス < Dec 2016 > | 著作権フリーBGM制作サイト HURT RECORD
遊び心を大事にして楽しい感じにしてみました。
クリスマス用音楽素材|著作権フリーの無料音楽素材ダウンロードサイト「ミュージックノート」
個人・商用利用可能の音楽、効果音のフリー素材! iPhoneアプリ、androidアプリ、FLASH、ゲーム制作に!著作権フリーの無料音楽素材ダウンロードサイト「ミュージックノート」
https://codezine.jp/article/detail/9762
https://codezine.jp/article/detail/9529
Random (Java Platform SE 7)
https://codezine.jp/article/detail/9529
https://codezine.jp/article/detail/9817

Introduction to activities | Android Developers
An Activity is an application component that provides a screen with which users can interact in order to do something, such as dial the phone, take a photo, sen...

Android 非同期処理についてまとめる メモ - Qiita
Androidには、UIに影響を与えないよういくつか非同期処理が用意されている。今回は非同期処理の代表的な・Service・IntentService・HandlerThreadについて違いを踏まえながらまとめる。非同期...
コメント