0
  • 最佳答案

    根据日志表现有2个错误,但本质上其实是1个错误,都是状态管理问题不对,导致你调用的流程乱了,正常的MediaPlayer的播放过程应该是:

    reset() > setDataSource(path) > prepare() > start() > stop() > reset()


    根据日志来看,你是第一步就出现了问题,首先你初始化了播放器,设置了对应的资源,然后你这个时候想播放,但播放前你又有一个停止动作,你资源都还没播放,播放器怎么去停止?这就是为什么堆栈报错stop called in state 2了,你可以加一个判断是否正在播放,然后你再想做对应的暂停或者停止你再做,然后如果你想相当于重置整个过程,最后你可以调用一下reset然后再重新准备资源。

    第二步还是我看你是设置了监听器的,那起码准备后播放应该是没问题,但你读写权限是否已经动态申请好了呢?还有,你的文件路径不要硬编码!IDE也给了你提示了,要从Android的API去获取

    1516984548452208642  评论     打赏       码码划云
    • philohao  回复 @码码划云
      谢谢老哥的耐心解答,上面的第一张图片,是跟着拉大锯老师的步骤一步一步进行操作的,权限应该也没有问题(我的模拟器用的是Android5.1,对应的sdk版本是22),程序运行到startTimer,打印输出的log就开始有问题,并且报错error(1,19),通过百度了解到这个报错码可能是由于prepare方法还没有完成就调用start方法;今天尝试这个问题依然存在
      philohao 2022-09-22 14:45   回复 1572585254856691714
    • philohao  回复 @码码划云
      后续设置监听,并根据老哥说的进行修改,注释掉播放前的stop方法(即老哥上文说的停止动作)。运行到startTimer方法的时候,持续重复打印:D/PlayerPresenter: currentPosition----->0 报错为error(-38,0)E/MediaPlayer: Attempt to call getDuration without a valid mediaplayer
      philohao 2022-09-22 14:53   回复 1572585254856691714
    • philohao  回复 @码码划云
      刚刚补打了start方法之后的log,发现在调用start方法之后,isPlaying的值打印出来为false,应该是没有start成功导致后续的一些列报错,请问老哥知道为啥调用start方法之后没有成功的原因吗?
      philohao 2022-09-22 15:08   回复 1572585254856691714
    • 阿肥  回复 @philohao
      还没走完你就等他走完再去start呗 直接start延时几秒 这个和机型性能有关系的 你可以用真机测 会快点
      阿肥 2022-09-22 15:18   回复 1382711465131241472
    • 码码划云  回复 @philohao
      流程上应该要准备资源阶段结束了只会你才能start,具体start没成功八成是因为资源没准备好,你监听器里监听准备结束了之后再启动就行了
      码码划云 2022-09-23 11:11   回复 1516984548452208642
    • philohao  回复 @阿肥
      老哥,现在同样的代码在真机上能跑,但在虚拟机上还是有问题。在startTimer方法先报错 error (1, -19) 然后Attempt to call getDuration without a valid mediaplay,代码ererror (-38, 0) 然后currentPosition----->打印一直为0 虚拟机:安卓5.1 API22 小米真机:安卓11 API30
      philohao 2022-09-23 11:23   回复 1572585254856691714
    • philohao  回复 @阿肥
      另外一台虚拟机上跑起来了 安卓11 API30 不知道为啥 人都蒙了
      philohao 2022-09-23 11:28   回复 1572585254856691714
    • 阿肥  回复 @philohao
      一切以真机为准 模拟器性能本来就比不上真机的 你那边准备时间太长 就start了指定不行 你如果真机能跑就可以了 代码如果要做模拟器适配的话 你就要把性能考虑一下 一般对标android5.1 - 6这样的机器 自己的东西就先不考虑 公司的可以换个思路 不去做这个东西
      阿肥 2022-09-23 11:34   回复 1382711465131241472
    • 阿肥  回复 @philohao
      mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { @Override public void onPrepared(final MediaPlayer mp) { // 点击过快可能导致mp未解析完成 故延时 handler.postDelayed(new Runnable() { // 太快可能黑屏 @Override public void run() { if (mp == null) { JXLog.e("mediaListener onPrepared mp is null "); return; } // TODO } },100); } }); 这是我最近使用的代码 做了一些延时
      阿肥 2022-09-23 11:38   回复 1382711465131241472
    • philohao  回复 @码码划云
      老哥,已经跑起来了,用的是拉大锯老师教的方法,但是把设置数据源和准备工作放在initPlayer中了,异步准备监听的方法好像还是有点问题,后续再调试看看。小米真机和另外一部虚拟机都是安卓11,API30,都能跑起来。因为拉大锯老师的视频比较老,我开了一个安卓5.1 API22的虚拟机跑步了,先是error(1,,19)然后(-38,0)Attempt to call getDuration wit
      philohao 2022-09-23 11:41   回复 1572585254856691714
    • philohao  回复 @阿肥
      好的好的,感谢老哥的指导,我再试试看
      philohao 2022-09-23 11:43   回复 1572585254856691714
相关问题
实打实 · 问答
2020-05-28 15:49 418 4
青铜守卫 · 问答
2020-06-20 19:32 814 2
辰 · 问答
2021-04-05 23:34 674 10
幻影~ · 提问
2024-04-13 20:13 8 2
幻影~ · 找工作
2024-04-07 10:44 14 2
幻影~ · 问题
2024-03-31 17:20 7 2
TONYGFX · AOSP
2024-03-28 17:11 4 2