0

私は Android アプリケーション開発にかなり慣れていないので、/res/raw フォルダーからランダムな .mp3 を再生しようとしています。

FIXEDこれまでのところこれがありますが、FileNotFoundException に遭遇しました。

修正済み最初のクリックでのみランダムなサウンドが再生され、その後はアプリを再度開かない限り同じサウンドになります。

新しい問題ランダムなサウンドが再生されるようになりましたが、ボタンを複数回クリックするとサウンドが同時に再生され、ログに「start() mUri is null」というメッセージが表示されます。

更新されたコード

MediaPlayer player;
int soundIndex;
AssetFileDescriptor descriptor;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

}


/**
 * gets a random index from an array of sounds
 * 
 * @return
 */
public int getRandomSoundIndex(){

    int soundIndex;
    int[] sound = SOUNDZ;

    Random random = new Random();
    soundIndex = random.nextInt(sound.length);

    return sound[soundIndex];
}

/**
 * Plays that random sound on button click
 * @param button
 */
public void playRandomSound(View button){

    //where button is physically located
    button = (Button) findViewById(R.id.button1);

    //get random sound index
    soundIndex = getRandomSoundIndex();

    //make media player
    player = MediaPlayer.create(this, soundIndex);

    //play sound
    player.start();

}

ログは次のとおりです。


09-21 17:42:32.528: D/MediaPlayer(4282): start() mUri が null です

4

1 に答える 1

0

ここでいくつかの問題があります。

まず、 を呼び出すtoString()Field、オブジェクト インスタンスの文字列表現 ( など) が得られますが"public static final int com.lena.button.R$raw.laptopkeyboard1"、これはあまり役に立ちません。おそらく、あなたはgetInt().

第二に、未加工のリソースは資産ではないため、使用しませんopenFd()。代わりに、静的create()メソッドを使用してインスタンスを作成し、取得しMediaPlayerた を に渡します。intgetInt()Field

第三に、反射が遅い。複数回行わないでください。R.raw.class.getFields() onceを使用して、結果をキャッシュします。または、リフレクションをまったく使用せず、代わりに独自のリテラル Java を使用することを検討してくださいint[]

static int[] SOUNDZ={R.raw.boom, R.raw.chaka, R.raw.laka};

(もちろん、独自のサウンド リソースに置き換えます)

于 2013-09-21T23:08:55.903 に答える