Android—录音开发MediaRecorder的文件错误和MediaRecorder.stop()报-19

在新的项目需求中要求做一个类似QQ按住说话语音功能,第一时间想到的是用service搭配MediaRecorder实现录音功能,听着歌快乐的搞定了(基本上OK了),小组开发的说帮忙处理下,于是回过头来看时里面的格式什么的都上升了几个档次,瞬间被羞愧了。然后就给我说录音还是有问题:

1. 当前录音的发送得到的录音地址是上一次的录音,原因是采用SharedPreferences存放当前录音文件路径和文件URL是在MediaRecorder的stop()方法之后,主线程中拿去这个SharedPreferences存放的值是在录音处理的services的topService(Activity)之后去处理的,这造成了主线程这边关闭这个service后拿录音文件地址是在真实的service的Destory()方法之前的,以至于真实的当前录音此时还未存放,当然就会bug了,所以在考虑使用SharedPreferences情况下就在Service的topService(Activity)和Destory()方法中MediaRecorder的stop()方法后存当前录音文件后调用一次EventBus,最后在拿去数据的时候调用一次该方法,保证拿到当前的文件;

2. 由于是长按触发录音,松开触发发送事件,所以一不注意就很容易造成MediaRecorder的stop()方法造成-19错误。这是因为控件点击时间过短对MediaRecorder的监听和对象为空造成的,已证明测试可行的方法是对MediaRecorder.stop()抛出异常,即为:

MediaRecorder mRecorder = new MediaRecorder();
//在启用录音时一定要声明MediaRecorder 的对象
  mRecorder.setOnErrorListener(null);
        mRecorder.setOnInfoListener(null);
        mRecorder.setPreviewDisplay(null);
        try {
            mRecorder.stop();
            //这是对录音文件的时长和文件保存处理,可忽视
            mElapsedMillis = (System.currentTimeMillis() - mStartingTimeMillis);
            mRecorder.release();

            getSharedPreferences("sp_name_audio", MODE_PRIVATE)
                    .edit()
                    .putString("audio_path", mFilePath)
                    .putLong("elpased", mElapsedMillis)
                    .apply();

            if (mIncrementTimerTask != null) {
                mIncrementTimerTask.cancel();
                mIncrementTimerTask = null;
            }
            mRecorder = null;
        } catch (IllegalStateException e) {
            ToastUtil.showShort(mActivity,"按键时间太短!");
            e.printStackTrace();
        }catch (RuntimeException e) {
            ToastUtil.showShort(mActivity,"按键时间太短!");
            e.printStackTrace();
        } catch (Exception e) {
            ToastUtil.showShort(mActivity,"按键时间太短!");
            e.printStackTrace();
        }
        mRecorder.release();
        mRecorder = null;
    }

暂时就这些,若还有可补充的会另写一个较详细的记录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值