Android 媒体播放器延迟启动

Android 媒体播放器延迟启动,android,android-mediaplayer,media,Android,Android Mediaplayer,Media,我的媒体播放器在闲置一段时间后延迟启动,也有一段时间不播放音频 前面我使用了setDataSource,但这次我使用的是create 这是我正在使用的代码,仅供参考: AssetFileDescriptor afd = _context.getResources().openRawResourceFd(this._soundResource.get(this._toBePlayed)); mp = new MediaPlayer(); mp.setDataSour

我的媒体播放器在闲置一段时间后延迟启动,也有一段时间不播放音频

前面我使用了setDataSource,但这次我使用的是create

这是我正在使用的代码,仅供参考:

AssetFileDescriptor afd = _context.getResources().openRawResourceFd(this._soundResource.get(this._toBePlayed));
        mp = new MediaPlayer();
        mp.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
        afd.close();
        mp.setOnPreparedListener(new OnPreparedListener(){

            @Override
            public void onPrepared(MediaPlayer mp) {

                mp.start();
            }
        });
        mp.setOnCompletionListener(new OnCompletionListener(){

            @Override
            public void onCompletion(MediaPlayer mp) {

                mp.reset();
                mp.release();
            }
        });
        mp.prepareAsync();

我使用FileInputStream。您没有设置AudioStreamType。下面是我如何设置MediaPlayer的

   public void setupMediaPlayer(){
    mp = new MediaPlayer();
    mp.setAudioStreamType(AudioManager.STREAM_MUSIC);

    try {
        fis = new FileInputStream(tempFilePath);
        mp.setDataSource(fis.getFD());
        mp.prepare();
        mp.setOnPreparedListener(this);
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IllegalArgumentException e) {
        e.printStackTrace();
    } catch (IllegalStateException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}
tempFilePath是文件的路径

我还在这个类中实现了setOnPreparedListener,这使您的代码在我看来更具可读性


还有一个很好的参考链接:

我使用FileInputStream。您没有设置AudioStreamType。下面是我如何设置MediaPlayer的

   public void setupMediaPlayer(){
    mp = new MediaPlayer();
    mp.setAudioStreamType(AudioManager.STREAM_MUSIC);

    try {
        fis = new FileInputStream(tempFilePath);
        mp.setDataSource(fis.getFD());
        mp.prepare();
        mp.setOnPreparedListener(this);
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IllegalArgumentException e) {
        e.printStackTrace();
    } catch (IllegalStateException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}
tempFilePath是文件的路径

我还在这个类中实现了setOnPreparedListener,这使您的代码在我看来更具可读性


还有一个很好的参考链接:

我想如果你愿意改变的话

mp.prepareAsync();

mp.start();

下院议员之后准备;你的代码会工作的。试试看。

我想如果你愿意改变的话

mp.prepareAsync();

mp.start();

下院议员之后准备;你的代码会工作的。试试看。

我也有启动延迟的问题。我用onPrepared中的mp.seekTo0修复了它,如下所示:

mp.setOnPreparedListener(new OnPreparedListener(){
    @Override
    public void onPrepared(MediaPlayer mp) {
        mp.seekTo(0);
        mp.start();
    }
});

我也有启动延迟的问题。我用onPrepared中的mp.seekTo0修复了它,如下所示:

mp.setOnPreparedListener(new OnPreparedListener(){
    @Override
    public void onPrepared(MediaPlayer mp) {
        mp.seekTo(0);
        mp.start();
    }
});

这并不能解决问题。相反,这会阻塞主线程。对UI/UX来说非常糟糕。这并不能解决问题。相反,这会阻塞主线程。对UI/UX来说非常糟糕。为什么这会解决问题?MediaPlayer默认值为0,因此您所做的只是添加一个额外的方法调用。您是对的,它默认值为0,但此修复仍然对我有效。为什么这样可以解决问题?MediaPlayer默认为0,因此您所做的只是添加一个额外的方法调用。您是对的,它默认为0,但此修复程序对我仍然有效。对于现在发现此问题的任何人,从API 26开始,setAudioStreamType现在都不推荐,而setAudioAttributes是首选。对于现在发现这一点的任何人来说,从API 26开始,setAudioStreamType现在是不推荐的,而setAudioAttributes则是首选。