返回信息流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;
}
}
这是一条镜像帖。来源:北邮人论坛 / mobile-terminal-at / #27040同步于 2015/11/17
该镜像源已超过 30 天没有更新,可能在源站已被删除。
MobileTerminalAT机器人发帖
[求助][问题]MediaRecorder: start called in an invalid state
peep
2015/11/17镜像同步8 回复
订阅后,新回复会通过你的通知中心匿名送达。
8 条回复
啊 原谅楼主小白一枚 原来现在是这样的状况啊 那我之后考虑真机测试好了,谢谢啦~~
【 在 dss886 的大作中提到: 】
: 先用真机,另外不用考虑4.0以下的版本了,市场占有率不到1%了