java - 媒体播放器无法添加新线程
问题描述
您好,我正在创建一个媒体播放器应用程序,在该应用程序中,我以单独的片段从 Firebase 数据库中检索了音频。但是当我切换到那个片段时,它会在开始前冻结 5-10 秒。这太烦人了。所以我将媒体播放器放在一个新线程中,但我在线程外使用了媒体播放器,这会导致错误。谢谢...
这是代码示例=>
new Thread(new Runnable() {
@Override
public void run() {
mediaPlayer.setAudioAttributes(
new AudioAttributes
.Builder()
.setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
.build());
try {
mediaPlayer.setDataSource(audioUrl);
} catch (IOException e) {
e.printStackTrace();
}
try {
mediaPlayer.prepare();
} catch (IOException e) {
e.printStackTrace();
}
runnable = new Runnable() {
@Override
public void run() {
//set progress on seekbar
seekBar.setProgress(mediaPlayer.getCurrentPosition());
//Handle post delay for 0.5 seconds
handler.postDelayed(this, 50);
}
};
}
}).start();
//Get duration of media player
int duration = mediaPlayer.getDuration();
//Convert milliseconds to minutes and seconds
String sDuration = convertFormat(duration);
//Set duration on text view
tv_seekbar_end.setText(sDuration);
play_audio.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
play_audio.setVisibility(View.INVISIBLE);
pause_audio.setVisibility(View.VISIBLE);
if (!mediaPlayer.isPlaying()) {
mediaPlayer.start();
}
//Set max. on seek bar
seekBar.setMax(mediaPlayer.getDuration());
//Start handler
handler.postDelayed(runnable, 0);
}
});
解决方案
请尝试以下方式,以下代码在 kotlin 中,但您可以在 java 中使用这种方式
mPlayer = MediaPlayer.create(mContext, myUri(uriAudio))
if (Build.VERSION.SDK_INT >= 21) {
val audioAttributes: AudioAttributes =
AudioAttributes.Builder()
.setUsage(AudioAttributes.USAGE_MEDIA)
.setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
.build()
mPlayer!!.setAudioAttributes(audioAttributes)
} else {
mPlayer!!.setAudioStreamType(AudioManager.STREAM_MUSIC)
}
if (mPlayer != null && !mPlayer!!.isPlaying) {
mPlayer!!.start()
}
请检查此链接可能对您有更多帮助 https://stackoverflow.com/a/68096841/4042384
推荐阅读
- javascript - 如何解决这个问题?使用基于单击按钮目标的函数
- python - 如何将numpy数组的某些索引的值更改为0?
- sql - 使用主键获取 Oracle 元数据
- java - Java:如何用分隔符值替换字符串中的空格和\r?
- c# - 在 .csproj 类库中自动嵌套文件 (DependentUpon)
- agora.io - Agora Unity 插件无法将视频流式传输给其他用户。在日志中,出现“无法初始化编码器”错误
- javascript - 在 TypeScript 中解构 React 钩子数组时,此表达式不可调用
- c++ - Clangd - 如何在没有`compile_commands.json`时设置要使用的默认标志?
- javascript - Javascript 全局变量与 HTML 数据属性
- c - 函数泄漏内存尚未释放