我有一个简单的录音应用程序。当用户录制某些内容时,它会保存在外部存储器中,然后从那里播放。
一切正常,除了在华为P8Lite智能手机与安卓6。
以下是我播放声音的方式:
Thread th=new Thread(new Runnable() {
@Override
public void run() {
try {
MediaPlayer mp = new MediaPlayer();
mp.setDataSource(view.getContext(), uri);
mp.prepare();
mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
mp.release();
}
});
mp.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
mp.start();
}
});
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//send message to handler
}
});
th.start();
uri此时确实存在,并且文件也确实存在于目标中。为什么我的mediaplayer什么都不播放?权限是在尝试创建mediaplayer时授予的,因此不应该是权限问题。
日志里只有:
W/MediaPlayer-JNI: MediaPlayer finalized without being released
I/MediaPlayer: setDataSource(34, 0, 576460752303423487)
I/MediaPlayer: [HSM] stayAwake true uid: 10255, pid: 22592
E/MediaPlayer: error (-19, 0)
E/MediaPlayer: Error (-19,0)
就像我说的,它在我测试过的所有其他设备(android10和android9)上都能正常工作
编辑
以下是我尝试的:我创建了具有从API18到30的每个api级别的仿真器,它在每个仿真器上都可以正常工作。我将我的华为p8 lite智能手机重置为出厂设置。我检查了声音文件是否正确保存,以及当我在保存它的文件夹中导航时是否可以手动打开和播放它(它工作得很完美,所以它与保存声音的代码无关),我真的没有什么想法了。
希望有人能帮忙,谢谢!
1条答案
按热度按时间wi3ka0sx1#
你需要异步准备。
player. prepare()
替换为以下代码: