2

私は台湾出身です。あなたの許しに感謝します。私の英語はかなり基本的です。

iPadアプリを作って、コミュニケーションボードの一種であるApp Store(話すのが苦手な人のためのAAC)に公開しました。メインビューにはいくつかのボタンがあり、ユーザーが1つをタッチすると、アプリはそのボタンに対応するmp3サウンドを再生します。すべてのmp3ファイルをフォルダーに配置し、実行時に動的に再生するファイルを決定しました。

最近、このアプリのAndroidバージョンのビルドに取り組んでいますが、ビューの1つのボタンをタッチすると、MediaPlayerが対応するボタンだけでなく、フォルダー内の残りのすべてのmp3ファイルを再生し続けるという問題が発生します。継続的に。iPad版の開発では発生しません。誰かがこの問題を解決し、MediaPlayerが適切に機能するように設定するのを手伝ってくれますか?

PS。私はすべてのMP3ファイルをいくつかのサブフォルダーに置き、それらを「アセット」フォルダーに置きました。なんらかの理由で、すべてのmp3ファイルが数値のファイル名(例:0123223.mp3)を使用しており、再生するMP3は、ユーザーがどのボタンを押したかによって異なるため、R.raw.0123223を使用できないのはRクラスに数値で名前を付けたメンバーを含めることはできませんが、ターゲットmp3ファイルはコンパイル時ではなく実行時にしか判別できないため、res/rawフォルダーを使用できません。

私のコードは次のとおりです。

private void PlayMP3(String mp3File) throws IOException {
    AssetFileDescriptor afd = this.getAssets().openFd(mp3File);
    MediaPlayer player = new MediaPlayer();
    player.setOnCompletionListener(new OnCompletionListener(){
        public void onCompletion(MediaPlayer mp) {
        System.out.println(mp.getAudioSessionId() + " finished.");
        }           
    });
    player.setDataSource(afd.getFileDescriptor());
    player.setLooping(false);
    player.prepare();
    player.start();
}

PlayMP3のパラメータ「mp3file」は、ユーザーがタッチアップしたボタンによると、mp3ファイルパスの連結文字列です。

どうもありがとう!

4

2 に答える 2

4

アセットディレクトリにそのファイルが1つしかない場合は、バージョンが機能します。アセットディレクトリの内容は次々にまとめられます。したがって、開始する場所と読み取るバイト数を指定しない場合、プレーヤーは1つのファイルであるかのように最後まで読み取ります。

より多くの引数を指定してsetDataSourceを使用することにより、目的を達成できます。

player.setDataSource(afd.getFileDescriptor(),afd.getStartOffset(),afd.getLength());

これにより、プレーヤーの制限を定義し、文字列mp3Fileで指定した曲のみを再生できます。

于 2012-07-03T04:41:40.577 に答える
0

あなたはいくつかのコードを投稿しませんでした。

最初のステップは、サウンドファイルをrawフォルダーに挿入することです

次に、必要なコードは数行だけです。

MediaPlayer mediaPlayer = null;
mediaPlayer = MediaPlayer.create(getBaseContext(), R.raw.mysoundfile);
mediaPlayer.start();     

アプリケーションが閉じているときは、メディアプレーヤーを「リリース」することを忘れないでください。

mediaPlayer.release();
mediaPlayer = null;
于 2012-07-03T01:43:25.520 に答える