0

私はアンドロイド用の非常に単純なアプリをやっていますが、解決方法が本当にわからないという問題があります。私のアプリには 8 つのボタンがあるレイアウトがあり、クリックするとすべてのボタンが鳴ります。アクティビティは 1 つだけで、oncreate メソッド内で 8 つの MediaPlayer 変数を定義します。これは、未加工のフォルダーにある mp3 形式の 8 つの異なるサウンドです。次に、それらを各ボタンに関連付けます。エミュレーターでアプリをコンパイルすると、すべて正常に動作しますが、電話でコンパイルすると、サウンド 8 が機能しません。つまり、サウンド 8 を関連付けたボタンを押すと、アプリがクラッシュします。また、より多くのサウンドを含むボタンを追加すると、最初の 7 つのサウンドのみが機能し、それ以上は機能せず、他のボタンによってアプリがクラッシュすることにも気付きました。MediaPlayer 変数を 7 つ以上持つことはできないようです。しかし、それは意味がありませんね。

誰でもこれを解決するのを手伝ってもらえますか??

前もって感謝します。

ここに私のJavaコードがあります:

package com.f22rumaj.org;

import android.app.Activity;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class MyMain extends Activity {
/** Called when the activity is first created. */

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    //set up the button sound
    final MediaPlayer mpBoton1 = MediaPlayer.create(this, R.raw.button1); 
    final MediaPlayer mpBoton2 = MediaPlayer.create(this, R.raw.button2); 
    final MediaPlayer mpBoton3 = MediaPlayer.create(this, R.raw.button3); 
    final MediaPlayer mpBoton4 = MediaPlayer.create(this, R.raw.button4); 
    final MediaPlayer mpBoton5 = MediaPlayer.create(this, R.raw.button5); 
    final MediaPlayer mpBoton6 = MediaPlayer.create(this, R.raw.button6); 
    final MediaPlayer mpBoton7 = MediaPlayer.create(this, R.raw.button7); 
    final MediaPlayer mpBoton8 = MediaPlayer.create(this, R.raw.button8);


    Button boton1=  (Button) findViewById(R.id.button_1);
    Button boton2=  (Button) findViewById(R.id.button_2);
    Button boton3=  (Button) findViewById(R.id.button_3);
    Button boton4=  (Button) findViewById(R.id.button_4);
    Button boton5=  (Button) findViewById(R.id.button_5);
    Button boton6=  (Button) findViewById(R.id.button_6);
    Button boton7=  (Button) findViewById(R.id.button_7);
    Button boton8=  (Button) findViewById(R.id.button_8);

    boton1.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            mpBoton1.start();

        }
    });

    boton2.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            mpBoton2.start();

        }
    });

    boton3.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            mpBoton3.start();

        }
    });

    boton4.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            mpBoton4.start();

        }
    });

    boton5.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            mpBoton5.start();

        }
    });

    boton6.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            mpBoton6.start();

        }
    });

    boton7.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            mpBoton7.start();

        }
    });

    boton8.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            mpBoton8.start();

        }
    });

}
}
4

3 に答える 3

2

うわー!MediaPlayer の複数のインスタンスを作成しないでください。リソースの膨大な浪費と、おそらくクラッシュの原因です。あなたは言いませんでしたが、メモリの問題だと思います。今後は、logcat の出力またはクラッシュのスタック トレースを含めてください。

SoundPool クラスを見てください。

http://developer.android.com/reference/android/media/SoundPool.html

ウェブ上にたくさんの例があります。例えば

http://www.techrepublic.com/blog/app-builder/getting-your-feet-wet-in-androids-soundpool/877

于 2012-04-23T19:52:41.803 に答える
1
  1. SoundPool代わりに使用することを検討してください。
  2. 名前がインデックス化されている非常に多くのアイテムがある場合は、おそらくそれらをマップに配置する必要があります。このようにして、ボタンごとに個別のリスナーを作成することを避けることができます。例えば:

    Map<Button, MediaPlayer> buttonMap = new HashMap<Button, MediaPlayer>();
    map.put((Button)findViewById(R.id.button_1), MediaPlayer.create(this, R.raw.button1));
    // same for the rest
    
    View.OnClickListener listener = new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            MediaPlayer selected = buttonMap.get(v);
            selected.start();
        }
    };
    for (Button b : buttonMap.keySet()) {
        b.setOnClickListener(listener);
    }
    
于 2012-04-23T19:48:50.167 に答える
0

ええ、間違いなく の多くのインスタンスを使用するべきではありませんがMediaPlayer、開始するのは簡単な間違いです。代わりに、単一のMediaPlayerインスタンスを使用して、次のようなものを検討してください。

MediaPlayer mediaPlayer = new MediaPlayer();

int[] buttonIds = { R.id.button_1, R.id.button_2, R.id.button_3,
    R.id.button_4, R.id.button_5, R.id.button_6, R.id.button_7,
    R.id.button_8 };

int[] soundIds = { R.raw.button1, R.raw.button2, R.raw.button3,
    R.raw.button4, R.raw.button5, R.raw.button6, R.raw.button7, 
    R.raw.button8 };

int size = buttonIds.length;

for(int i = 0; i < size; i++) {
    (Button)findViewById(buttonIds[i]).setOnClickListener(
            new View.OnClickListener() {
        @Override public void onClick(View v) {
            if(mediaPlayer.isPlaying()) {
                mediaPlayer.stop();
            }
            mediaPlayer.reset();
            AssetFileDescriptor afd = 
                getResources().openRawResourceFd(soundIds[i]);
            mediaPlayer.setDataSource(afd.getFileDescriptor(), 
                afd.getStartOffset(), afd.getLength());
            mediaPlayer.prepare();
            mediaPlayer.start();
        }
    }
}

私はそれをテストしていないので(近いはずですが)、疑似コードと考えて、アイデアを取り入れてください。ボタン ID の配列とサウンド ID の配列を保持します (それらを一緒にインデックス化します。つまり、ボタン ID 1 はサウンド ID 1 と同じ位置にある必要があります)。ボタン ID ごとに、ビューを見つけてボタンにキャストし、onClickListener を追加します。これにより、プレーヤーがリセットされ (再生中の場合)、データ ソースが関連付けられたサウンド ID に設定され、プレーヤーが準備されて開始されます。

原則として、そのようなコードを繰り返している場合は、それを避けるために、より優れた設計を探す必要があります。

于 2012-04-23T19:59:42.373 に答える