Android Media Player 在更改资产按钮上的图像后停止为资产付费

Android MediaPlayer stops palyng form assetst after changing image on button from assets

我在播放资产文件夹中的 mp3 时遇到问题。当我尝试更改按钮上的图像时,mp3 停止播放(并不总是...) 我得到的错误

W/MediaPlayer-JNI: MediaPlayer finalized without being released

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


private void playMusic() {
    boolean noAudioFile = false;
    Context context = this; // or ActivityNotification.this
    MediaPlayer mpMusic = new MediaPlayer();
    AssetManager mg2 = getResources().getAssets();
    String musicPath = langFolder+audioFolder+"system/Bubble_Bath.mp3";
    try {
        mg2.open(musicPath);

    } catch (IOException ex) {
        noAudioFile = true;
    }

    if(!noAudioFile) {
        AssetFileDescriptor descriptor = null;
        try {
            descriptor = context.getAssets().openFd(musicPath);
        } catch (IOException e) {
            e.printStackTrace();
        }
        long start = descriptor.getStartOffset();
        long end = descriptor.getLength();
        try {
            mpMusic.setDataSource(descriptor.getFileDescriptor(), start, end);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    else{

    }
    mpMusic.setVolume(5,5);
    try {
        mpMusic.prepare();
    } catch (IOException e) {
        e.printStackTrace();
    }
    mpMusic.start();
    mpMusic.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
        @Override
        public void onCompletion(MediaPlayer mp) {
            mp.start();
        }
    });


}


public void nextCard(View view) throws IOException {
    i++;
    if (i==files.length) i=0;
    if(i>-1){
        Button btnNext = (Button)findViewById(R.id.btnNext);
        btnNext.setText("Next");
    }
    Drawable d = Drawable.createFromStream(getAssets().open(categoryPath+"/"+files[i]+".png"), null);
    findViewById(R.id.btnImage).setBackgroundDrawable(d);
    if(files[i].substring(0,1).contains("a") || files[i].substring(0,1).contains("i")){
        startFileSound = langFolder + audioFolder + "system/GAME_thisisan.mp3";
    }
    else if (files[i].substring(files[i].length()-1,files[i].length()).contains("s")){
        startFileSound = langFolder + audioFolder + "system/GAME_theseare.mp3";
    }
    else{
        startFileSound = noAudioFileSound;
    }
}

当我尝试在下方评论时,mp3 播放没有问题。

Drawable d = Drawable.createFromStream(getAssets().open(categoryPath+"/"+files[i]+".png"), null);

永远不要像这样创建 MediaPlayer MediaPlayer mpMusic = new MediaPlayer();

使用

        MediaPlayer.create(context,R.raw.music);

您正在从资产文件夹中加载可绘制对象,这是正确的。但是不要在主线程中做。尝试在不同的线程中执行此操作。

尝试关闭描述符

mpMusic.setDataSource(descriptor.getFileDescriptor(), start, end);
descriptor.close();