8

mediaPlayer でいくつかのサウンドを再生するアプリを作成しています。これは私が使用するコードです:

String[] name = {"sonar_slow","sonar_medium","sonar_fast"};
    String link = "/res/raw/" + name[state-1] + ".mp3";

    try {
        player.setDataSource(link);
        player.prepare();
        player.start();
    } catch(Exception e) {
        e.printStackTrace();
    }

私もこれを試しました:

        if(state==1){
            player.create(this, R.raw.sonar_slow);
        }else if(state==2){
            player.create(this, R.raw.sonar_medium);
        }else if(state==3){
            player.create(this, R.raw.sonar_fast);
        }
        player.start();

しかし、上記のどれも機能していません。アプリはクラッシュしていませんが、サウンドが再生されません。何か案は ?

4

4 に答える 4

29

2 つの問題があります。

問題1

この方法では、プロジェクトの /res/raw ディレクトリ内のリソースを参照できません。プロジェクト ディレクトリのファイル「/res/raw/sonar_slow.mp3」は、apk の「/res/raw/sonar_slow.mp3」に保存されません。以下の代わりに:

MediaPlayer mp = MediaPlayer.create(this);  
mp.setSource("sonar_slow");

使用する必要があります

MediaPlayer mp = MediaPlayer.create(this, R.raw.sonar_slow); 

問題 2

以下は間違っています: を変更しない静的メソッドを呼び出しますplayer

player.create(this, R.raw.sonar_slow); 

代わりに電話する必要があります

player = MediaPlayer.create(this, R.raw.sonar_slow);

完全なソリューション

以下は、MediaPlayer をカプセル化する再利用可能な AudioPlayer クラスです。これは、「Android Programming: The Big Nerd Ranch Guide」を少し変更したものです。リソースのクリーンアップを忘れないようにします

package com.example.hellomoon;

import android.content.Context;
import android.media.MediaPlayer;

public class AudioPlayer {

    private MediaPlayer mMediaPlayer;

    public void stop() {
        if (mMediaPlayer != null) {
            mMediaPlayer.release();
            mMediaPlayer = null;
        }
    }

    public void play(Context c, int rid) {
        stop();

        mMediaPlayer = MediaPlayer.create(c, rid);
        mMediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
            @Override
            public void onCompletion(MediaPlayer mediaPlayer) {
                stop();
            }
        });

        mMediaPlayer.start();
    }

}
于 2013-08-15T14:41:35.270 に答える
0

次のようにする必要があります。

 try{
      mp.prepare();
    } catch (IllegalStateException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
    } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
    }           
    mp.start();
于 2013-08-15T14:40:00.877 に答える