音楽を鳴らす

スポンサーリンク
スポンサーリンク

スポンサーリンク

音楽を鳴らしたい

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について違いを踏まえながらまとめる。非同期...

コメント

タイトルとURLをコピーしました