mediaplayer从uri加载声音不工作

8fsztsew  于 2021-07-03  发布在  Java
关注(0)|答案(1)|浏览(514)

我有一个简单的录音应用程序。当用户录制某些内容时,它会保存在外部存储器中,然后从那里播放。
一切正常,除了在华为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智能手机重置为出厂设置。我检查了声音文件是否正确保存,以及当我在保存它的文件夹中导航时是否可以手动打开和播放它(它工作得很完美,所以它与保存声音的代码无关),我真的没有什么想法了。
希望有人能帮忙,谢谢!

wi3ka0sx

wi3ka0sx1#

你需要异步准备。 player. prepare() 替换为以下代码:

player.prepareAsync()

相关问题