4

ListViewアイテムをボタンとして使用して、シンプルなサウンドボードAndroidアプリを作成しようとしています。(ところで、私は初心者プログラマーです)

ボタンを押すと、特定のサウンドファイルが再生されます。サウンドの再生中にいずれかのボタンを押すと、最初にそのサウンドを停止してから、新しいサウンドの再生を開始する必要があります。

現在、サウンドは現在再生中のサウンドを停止せずに再生されるため、ボタンをスパムすると、同時に複数のサウンドが再生されます(一度に押しすぎると、アプリの強制が終了します)。

私はいくつかのバリエーションを使ってみました:

if (mp.isPlaying()) {
  mp.stop();
}

しかし、他のいくつかのソースで読んだことによると、MediaPlayerクラスの複数のインスタンスを作成しており、それらが同じ名前であっても、stop()メソッドはmpの最新のインスタンスで停止しようとします(場合によってはそうではありません)まだ作成されていません)。

MediaPlayerクラスの一般的な実装は間違っていると思いますが、それが私が理解できる最善の方法です。

とにかく、ここに関連するコードのブロックがあります:

public class soundTest extends Activity {
  private ListView lv1;
  private String lv_arr[]={"test 1","test 2","test 3","test 4","test 5"};

  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    lv1=(ListView)findViewById(R.id.ListView01);
    lv1.setAdapter(new ArrayAdapter<String>(this,R.layout.list_item, lv_arr));

    lv1.setOnItemClickListener(new OnItemClickListener() {
      public void onItemClick(AdapterView<?> parent, View view,int position, long id) {

        if (lv1.getItemAtPosition(position)=="test 1") {
          MediaPlayer mp = MediaPlayer.create(getApplicationContext(),R.raw.sound1);
          mp.start();
          mp.setOnCompletionListener(new OnCompletionListener() {
            public void onCompletion(MediaPlayer mp) {
              mp.release();
            }
          });
        }

        if (lv1.getItemAtPosition(position)=="test 2") {
          MediaPlayer mp = MediaPlayer.create(getApplicationContext(),R.raw.sound2);
          mp.start();
          mp.setOnCompletionListener(new OnCompletionListener() {
            public void onCompletion(MediaPlayer mp) {
              mp.release();
            }
          });
        }

        //And the rest of the sounds 3,4,5.

      }
    });
  }
}

助けていただければ幸いです、ありがとう。

編集(3月22日):

動作するはずの次のコードを見つけました。

mp.setDataSource(context, Uri.parse("android.resource://" + Config.PACKAGE + "/" + resId));

しかし、「Config.PACKAGE」の部分がどのように機能するのか理解できません。「PACKAGEを解決できないか、フィールドではありません」というエラーが表示されます。

「PACKAGE」をパッケージ名に置き換えてみましたが、同じエラーです。私も試しました:

try {
  mp.setDataSource(getApplicationContext(),Uri.parse("android.resource://com.mptest/" + R.raw.test2));
} catch (IOException e) {
  e.printStackTrace();
}

しかし、「//com.mptest/」の代わりに何を正確に配置するかはわかりません。

4

4 に答える 4

3

グローバル変数MediaPlayerを設定する必要がありますprivate static。これは私を何度か捕まえました。

于 2012-12-05T21:19:48.060 に答える
2

グローバルを使用しないでください。シングルトン パターンを使用します。それが目的であり、グローバル変数を使用せずにインスタンスを 1 つだけ持つことができます。

このパターンの Java コードの良い例がたくさんあります。まずhttp://www.javaworld.com/javaworld/jw-04-2003/jw-0425-designpatterns.htmlを見てください。間違いはありません。

于 2011-06-28T17:47:23.170 に答える
1

MediaPlayer のインスタンスを複数持つのではなく、グローバル変数として保持することを検討してください。

于 2011-03-20T10:57:49.503 に答える
0

VideoView Sourceは 1 つのMediaPlayerオブジェクトを処理し、再生中にコンテンツを変更する可能性があるため、適切なリファレンスを見つけることができます。

于 2011-03-21T13:36:33.250 に答える