BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / mobile-terminal-at / #27040同步于 2015/11/17
该镜像源已超过 30 天没有更新,可能在源站已被删除。
MobileTerminalAT机器人发帖

[求助][问题]MediaRecorder: start called in an invalid state

peep
2015/11/17镜像同步8 回复
RT 楼主刚学习安卓开发没多久,现在是想通过使用MediaRecorder对通话语音进行录音。我是按照Android API文档中的示例代码写的,但是总是出现start called in an invalid state: 4这样的错误,同时在sdcard中也没有我预先定义的文件。还有就是我的模拟器是2.3.3版本的,跟这个也不造有没有关系。。。 下面附上实现该功能的服务源码,希望版内的大神们都可以指点一下,或者我们互相讨论下,我找了好多资料,但是都没能解决这个问题。。。 跪谢[ema23] package com.example.PhoneListener; import java.io.File; import java.io.IOException; import android.app.Service; import android.content.Intent; import android.media.MediaRecorder; import android.os.Environment; import android.os.IBinder; import android.telephony.PhoneStateListener; import android.telephony.TelephonyManager; import android.util.Log; public class SystemService extends Service { private TelephonyManager tm; private MyListener listener; private MediaRecorder mediaRecorder; private String OUTPUT_FILE = Environment.getExternalStorageDirectory() + "/audiorecordtest.3gp"; @Override public IBinder onBind(Intent intent) { return null; } // 服务创建的时候调用的方法 @Override public void onCreate() { // 后台监听电话的呼叫状态。 // 得到电话管理器 tm = (TelephonyManager) this.getSystemService(TELEPHONY_SERVICE); listener = new MyListener(); tm.listen(listener, PhoneStateListener.LISTEN_CALL_STATE); super.onCreate(); } private class MyListener extends PhoneStateListener { // 当电话的呼叫状态发生变化的时候调用的方法 @Override public void onCallStateChanged(int state, String incomingNumber) { super.onCallStateChanged(state, incomingNumber); try { switch (state) { case TelephonyManager.CALL_STATE_IDLE://空闲状态。 if(mediaRecorder!=null){ //8.停止捕获 mediaRecorder.stop(); //9.释放资源 mediaRecorder.release(); mediaRecorder = null; System.out.println("录制完毕,上传文件到服务器。"); } break; case TelephonyManager.CALL_STATE_RINGING://响铃状态。 break; case TelephonyManager.CALL_STATE_OFFHOOK://通话状态开始录音 mediaRecorder = new MediaRecorder(); mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); File outFile = new File(OUTPUT_FILE); if(outFile.exists()){ outFile.delete(); } mediaRecorder.setOutputFile(outFile.getAbsolutePath()); mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); try { mediaRecorder.prepare(); } catch (IOException e) { Log.e("Saaaad!!", "prepare() failed"); } mediaRecorder.start(); break; } } catch (Exception e) { e.printStackTrace(); } } } // 服务销毁的时候调用的方法 @Override public void onDestroy() { super.onDestroy(); // 取消电话的监听 System.out.println("ondestory"); tm.listen(listener, PhoneStateListener.LISTEN_NONE); listener = null; } }
订阅后,新回复会通过你的通知中心匿名送达。
8 条回复
jerryzcx机器人#1 · 2015/11/17
只说一句:请用真机
zishi机器人#2 · 2015/11/17
~~先试试ls上的解决方案~~
dss886机器人#3 · 2015/11/17
先用真机,另外不用考虑4.0以下的版本了,市场占有率不到1%了
fuxuemingzhu机器人#4 · 2015/11/17
这个版本也太低咯?4以下的我都不考虑
peep机器人#5 · 2015/11/17
啊 好的 这个可以试一发!! 【 在 jerryzcx 的大作中提到: 】 : 只说一句:请用真机
peep机器人#6 · 2015/11/17
!!好!!谢谢 【 在 zishi 的大作中提到: 】 : ~~先试试ls上的解决方案~~
peep机器人#7 · 2015/11/17
啊 原谅楼主小白一枚 原来现在是这样的状况啊 那我之后考虑真机测试好了,谢谢啦~~ 【 在 dss886 的大作中提到: 】 : 先用真机,另外不用考虑4.0以下的版本了,市场占有率不到1%了
peep机器人#8 · 2015/11/17
soga! 【 在 fuxuemingzhu 的大作中提到: 】 : 这个版本也太低咯?4以下的我都不考虑