1

ユーザーがボタンを1つ押すたびに、同じ短いwavファイル(1秒)を再生する必要があります。次のコードは約30回のクリックで機能し、デバイスでアプリ「強制終了」します。何が起こっているのかというと、メディアプレーヤーの新しいインスタンスが作成され、インスタンスが構築され(約30クリック)、アプリがクラッシュするということだと思います。そこで、ボタンをクリックするとwavが再生され、メディアプレーヤーがリリースされることを期待して、「リリース」インスタンスを追加しました。ただし、そのようには機能しません。mp.release()を使用すると、medaiplayerのリリースが早すぎてユーザーが音を聞くことができないため、音が再生されない可能性がありますか?

誰かが私がこれを機能させるのを助けるための良いヒントを持っていますか?どうもありがとうございました。

ボタンbutton2=(ボタン)findViewById(R.id.button10); button2.setOnClickListener(new View.OnClickListener(){

      public void onClick(View v) {
            // Perform action on click
            MediaPlayer mp = MediaPlayer.create(getApplicationContext(), R.raw.clicker);
            mp.start();
            mp.release();
4

3 に答える 3

1

シンプルなのは、MediaPlayerを一度作成して、時間をかけて再生するだけです。

 private MediaPlayer mp;
 public void onClick(View v) {
            // Perform action on click
            if (mp == null){
                 mp = MediaPlayer.create(getApplicationContext(), R.raw.clicker);
            }
            mp.start();
 }
于 2012-05-20T06:29:44.410 に答える
1

小さなオーディオ ファイルには SoundPool の方が適しているのに、なぜ MediaPlayer を使用するのでしょうか? ベースとして、これを使用できます:

this.setVolumeControlStream(AudioManager.STREAM_MUSIC);


soundPool = new SoundPool(4, AudioManager.STREAM_MUSIC, 70);

final HashMap<Integer, Integer>  soundPoolMap = new HashMap<Integer, Integer>();

final int soundID = 4;
soundPoolMap.put(soundID, soundPool.load(this, R.raw.wav_sound, 4));

soundPool.setOnLoadCompleteListener(new OnLoadCompleteListener() 
{
    public void onLoadComplete(SoundPool soundPool, int sampleId, int status) 
    {
        if (sampleId == 4)
        {
            soundPool.play(4, 50, 50, 1, 0, 1f);                                
        }
    }
});
于 2012-05-20T12:55:15.063 に答える
0

これがうまくいく簡単な解決策です

MediaPlayer mp;
mp = MediaPlayer.create(getApplicationContext(), R.raw.clicker);

 public void onClick(View v) {
            // Perform action on click
            if(mp.isPlaying())
                {
                mp.stop();
                mp.reset();
                mp.release();
                }
                mp = MediaPlayer.create(getApplicationContext(), R.raw.clicker);
                mp.start();

これは、mediaplayer が既に再生されているかどうかを確認します。既に再生されている場合は、停止して解放し、その mediaplayer(mp) オブジェクトを初期化して、mediaplayer を開始します。

再生されていない場合は、if ステートメントの後にコードが実行され、mediaplayer オブジェクト (この場合は mp) の初期化後にメディア プレーヤーが開始されます。

MediaPlayer の詳細については、 http: //developer.android.com/reference/android/media/MediaPlayer.html をご覧ください。Mediaplayer のライフ サイクルを調べる

于 2012-05-20T09:28:10.157 に答える