9

同じメディア プレーヤーを使用しようとしていますが、データ ソースを変更しています。これが私がやろうとしていることです: 

    private MediaPlayer mMediaPlayer;

    public void pickFile1() {
       initMediaPlayer("myfile1.mp3");
    }

    public void pickFile2() {
       initMediaPlayer("myfile2.mp3");
    }

    private void initMediaPlayer(String mediafile) {
    // Setup media player, but don't start until user clicks button!
    try {
        if (mMediaPlayer == null) {
            mMediaPlayer = new MediaPlayer();
        } else {
            mMediaPlayer.reset();   // so can change data source etc.
        }
        mMediaPlayer.setOnErrorListener(this);
        AssetFileDescriptor afd = getAssets().openFd(mediafile); 
        mMediaPlayer.setDataSource(afd.getFileDescriptor());
    }
    catch (IllegalStateException e) {
        Log.d(TAG, "IllegalStateException: " + e.getMessage());
    }
    catch (IOException e) {
        Log.d(TAG, "IOException: " + e.getMessage());
    }
    catch (IllegalArgumentException e) {
        Log.d(TAG, "IllegalArgumentException: " + e.getMessage());
    }
    catch (SecurityException e) {
        Log.d(TAG, "SecurityException: " + e.getMessage());
    }

    mMediaPlayer.setOnPreparedListener(this);
    mMediaPlayer.prepareAsync(); // prepare async to not block main thread
    mMediaPlayer.setWakeMode(getApplicationContext(), PowerManager.PARTIAL_WAKE_LOCK);  // Keep playing when screen goes off!
}

新しいメディアファイルに変更したいときにこれを呼び出します。ただし、データ ソースが正常に変更されていないようです。最初の質問: このようにすることは可能ですか? それとも、メディア プレーヤーを解放して、新しいファイルごとに新しいプレーヤーを作成する必要がありますか? 可能であれば、なぜ私のコードが正しく動作しないのでしょうか?

編集:まあ、メディアプレーヤーをリリースして再作成しても、それはできません! 同じ曲を流し続けるだけ!?!? それはどのように可能ですか?新しいアイデア -- トラックごとに異なるメディア プレーヤーを作成します。それは本当に私がここでしなければならないことですか? これはおそらくAndroidのバグですか?

4

4 に答える 4

2

私は実際に今日の資産でこれと同じ問題を抱えていました、そして私は修正を知っています。

問題は、アセットが実際にはどこかの実際のファイルシステム上の個々のファイルの束としてではなく、1つの大きなデータのチャンクとして保存されることです。したがって、を取得するassetfiledescriptorと、ファイルを指すだけでなく、オフセットと長さもあります。自分自身を指すだけmediaplayerassetfiledescriptor、アセットフォルダ(または何か)の最初のメディアファイルが常に再生されます。

これを行う場合: mMediaPlayer.setDataSource(afd.getFileDescriptor(),afd.getStartOffset(),afd.getLength());

次に、適切なファイルを再生します。

于 2012-07-09T14:49:51.193 に答える
0

宣言しprivate String mediafile="my.mp3";てから使用しますAssetFileDescriptor afd = getAssets().openFd(mediafile);が、(投稿したコードから) の値を変更することはありませんmediafile。ユーザーがボタンをクリックする前に選択したSDカード上のファイルを参照する可能性が高い場所の前に行
を置くことをお勧めします。 SDカードからファイル名を取得する方法はわかりませんが、を使用するのが1つの方法だと思います。mediafile = theNextFile;afd = getAssets().openFd(mediafile);theNextFile
startActivityForResult

于 2011-08-30T22:49:27.490 に答える
0

まあ、私はこれについて本当に良い答えを得たことはありません. エミュレーターで何かおかしいことが起こるのではないかと思います。ファイルを外部 SD カードにダウンロードして、そこから再生することです。これにより、コードが次のようにわずかに変更されます。

String path = getExternalFilesDir(null).toString() + "/";
mMediaPlayer.setDataSource(path + mediafile);

残りは同じままです。

于 2011-09-04T22:00:50.523 に答える