音楽を鳴らしたい
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つのブロックは何に使うんだろう。
とりあえず、やりたいことはできることが分かったぞ。今度は地図の使い方勉強しよう。
参考
http://www.hurtrecord.com/bgm/35/wakuwaku-tanoshii-christmas.html
http://www.music-note.jp/bgm/xmas.html
https://codezine.jp/article/detail/9762
https://codezine.jp/article/detail/9529
https://docs.oracle.com/javase/jp/7/api/java/util/Random.html
https://codezine.jp/article/detail/9529
https://codezine.jp/article/detail/9817
https://developer.android.com/guide/components/activities
https://qiita.com/tk_daze/items/bc83c69750e5f2e4015c
[amazon asin=”4798152021″ kw=”Android”]



