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/」の代わりに何を正確に配置するかはわかりません。