- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在开发一个通话记录器应用程序,当我收到来电时我遇到了这个问题我的应用程序运行正常,没有异常(exception)。但是当我调用某人时我遇到了一些错误。请不要不要写诸如“你能解释更多吗”之类的愚蠢答案,而不是投反对票。我认为问题可能出在我开始录制时,而且它无法停止。但我不确定。这是我的代码:
PhonecallReceiver.java
public abstract class PhonecallReceiver extends BroadcastReceiver {
//The receiver will be recreated whenever android feels like it. We need a static variable to remember data between instantiations
private static int lastState = TelephonyManager.CALL_STATE_IDLE;
private static Date callStartTime;
private static boolean isIncoming;
private static String savedNumber; //because the passed incoming is only valid in ringing
......
@Override
public void onReceive(Context context, Intent intent) {
recorder = new MediaRecorder();
......
//Toast.makeText(context,"Reciever", Toast.LENGTH_SHORT).show();
//We listen to two intents. The new outgoing call only tells us of an outgoing call. We use it to get the number.
if (intent.getAction().equals("android.intent.action.NEW_OUTGOING_CALL")) {
savedNumber = intent.getExtras().getString("android.intent.extra.PHONE_NUMBER");
} else {
String stateStr = intent.getExtras().getString(TelephonyManager.EXTRA_STATE);
String number = intent.getExtras().getString(TelephonyManager.EXTRA_INCOMING_NUMBER);
int state = 0;
if (stateStr.equals(TelephonyManager.EXTRA_STATE_IDLE)) {
state = TelephonyManager.CALL_STATE_IDLE;
} else if (stateStr.equals(TelephonyManager.EXTRA_STATE_OFFHOOK)) {
state = TelephonyManager.CALL_STATE_OFFHOOK;
} else if (stateStr.equals(TelephonyManager.EXTRA_STATE_RINGING)) {
state = TelephonyManager.CALL_STATE_RINGING;
}
onCallStateChanged(context, state, number);
}
}
//Derived classes should override these to respond to specific events of interest
protected void onIncomingCallStarted(Context ctx, String number, Date start) {
}
protected void onOutgoingCallStarted(Context ctx, String number, Date start) {
}
protected void onIncomingCallEnded(Context ctx, String number, Date start, Date end) {
}
protected void onOutgoingCallEnded(Context ctx, String number, Date start, Date end) {
}
protected void onMissedCall(Context ctx, String number, Date start) {
}
public void onIncomingCallAsnwered(Context ctx, String number, Date start) {
}
public void onIncomingCallIdle(Context ctx,String number,Date start){}
//Deals with actual events
//Incoming call- goes from IDLE to RINGING when it rings, to OFFHOOK when it's answered, to IDLE when its hung up
//Outgoing call- goes from IDLE to OFFHOOK when it dials out, to IDLE when hung up
public void onCallStateChanged(Context context, int state, String number) {
if (lastState == state) {
//No change, debounce extras
return;
}
switch (state) {
case TelephonyManager.CALL_STATE_RINGING:
isIncoming = true;
callStartTime = new Date();
savedNumber = number;
onIncomingCallStarted(context, number, callStartTime);
PhoneStateChangeListener pscl = new PhoneStateChangeListener(context, number);
TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
tm.listen(pscl, PhoneStateListener.LISTEN_CALL_STATE);
break;
case TelephonyManager.CALL_STATE_OFFHOOK:
//Transition of ringing->offhook are pickups of incoming calls. Nothing done on them
if (lastState != TelephonyManager.CALL_STATE_RINGING) {
isIncoming = false;
callStartTime = new Date();
onOutgoingCallStarted(context, savedNumber, callStartTime);
}
break;
case TelephonyManager.CALL_STATE_IDLE:
//Went to idle- this is the end of a call. What type depends on previous state(s)
if (lastState == TelephonyManager.CALL_STATE_RINGING) {
//Ring but no pickup- a miss
onMissedCall(context, savedNumber, callStartTime);
} else if (isIncoming) {
onIncomingCallEnded(context, savedNumber, callStartTime, new Date());
} else {
onOutgoingCallEnded(context, savedNumber, callStartTime, new Date());
}
break;
}
lastState = state;
}
//Detect if call is answered
private class PhoneStateChangeListener extends PhoneStateListener {
public boolean wasRinging;
Context context;
String number;
public PhoneStateChangeListener(Context context, String number) {
this.context = context;
this.number = number;
}
@Override
public void onCallStateChanged(int state, String incomingNumber) {
switch (state) {
case TelephonyManager.CALL_STATE_RINGING:
Log.i("Call recorder::", "RINGING");
wasRinging = true;
break;
case TelephonyManager.CALL_STATE_OFFHOOK:
try {
Thread.sleep(500); // Delay 0,5 seconds to handle better turning on
// loudspeaker
} catch (InterruptedException e) {
}
// context.setVolumeControlStream(AudioManager.STREAM_VOICE_CALL);
Log.i("Call recorder::", "OFFHOOK");
onIncomingCallAsnwered(context, number, callStartTime);
if (!wasRinging) {
// Start your new activity
} else {
// Cancel your old activity
}
// this should be the last piece of code before the break
wasRinging = true;
break;
case TelephonyManager.CALL_STATE_IDLE:
Log.i("Call recorder::", "IDLE");
// this should be the last piece of code before the break
onIncomingCallIdle(context, number, callStartTime);
wasRinging = false;
break;
}
}
}
}
这是 CallReceiver.java,它是 PhoneCallReciever.java 的扩展
public class CallReceiver extends PhonecallReceiver {
private String fileName;
private boolean recording = false;
//Phone Ringing From Incoming Call
@Override
protected void onIncomingCallStarted(Context ctx, String number, Date start) {
Log.d("Call recorder:: ", "onIncomingCallStarted Phone:" + number);
}
//Phone Outgoing Call Started
@Override
protected void onOutgoingCallStarted(Context ctx, String number, Date start) {
Log.d("Call recorder:: ", "onOutgoingCallStarted Phone:" + number);
if (is_recording) {
startRecording(number, ctx, "outgoing", false);
}
}
//Phone Incoming Call Ended
@Override
protected void onIncomingCallEnded(Context ctx, String number, Date start, Date end) {
Log.d("Call recorder:: ", "onIncomingCallEnded Phone:" + number);
}
//Phone Outgoing Call Ended
@Override
protected void onOutgoingCallEnded(Context ctx, String number, Date start, Date end) {
Log.d("Call recorder:: ", "onOutgoingCallEnded Phone:" + number);
if (is_recording) {
stopAndReleaseRecorder(ctx);
}
}
//Phone Call Missed
@Override
protected void onMissedCall(Context ctx, String number, Date start) {
Log.d("Call recorder:: ", "onMissedCall Phone:" + number);
}
//Phone Incoming Answered<--Main
@Override
public void onIncomingCallAsnwered(Context ctx, String number, Date start) {
Log.d("Call recorder:: ", "onIncomingCallAsnwered Phone:" + number);
if (is_recording) {
if (is_record_contacts_only && new FileHelper().is_number_in_contacts(ctx, number)) {
startRecording(number, ctx, "incoming", false);
} else if (!is_record_contacts_only) {
startRecording(number, ctx, "incoming", false);
}
if (is_record_all_except_contacts && !new FileHelper().is_number_in_contacts(ctx, number)) {
startRecording(number, ctx, "incoming", false);
} else if (!is_record_all_except_contacts) {
startRecording(number, ctx, "incoming", false);
}
}
}
//Phone Incoming Call Idle
@Override
public void onIncomingCallIdle(Context ctx, String number, Date start) {
Log.d("Call recorder:: ", "onIncomingCallIdle Phone:" + number);
if (is_recording) {
stopAndReleaseRecorder(ctx);
}
}
/*
Call feature
*/
//Recording
private void terminateAndEraseFile(Context context) {
Log.d(Constants.TAG, "RecordService terminateAndEraseFile");
stopAndReleaseRecorder(context);
recording = false;
deleteFile();
}
private void deleteFile() {
Log.d(Constants.TAG, "RecordService deleteFile");
FileHelper.deleteFile(fileName);
fileName = null;
}
public void stopAndReleaseRecorder(Context context) {
Log.d("Call recorder:: ", "Stoped recording");
if (recorder == null) {
Log.d("Call recorder:: ", "nill");
return;
}
Log.d(Constants.TAG, "RecordService stopAndReleaseRecorder");
boolean recorderStopped = false;
boolean exception = false;
try {
recorder.stop();
recorderStopped = true;
} catch (IllegalStateException e) {
Log.e(Constants.TAG, "IllegalStateException");
e.printStackTrace();
exception = true;
} catch (RuntimeException e) {
Log.e(Constants.TAG, "RuntimeException");
exception = true;
} catch (Exception e) {
Log.e(Constants.TAG, "Exception");
e.printStackTrace();
exception = true;
}
try {
recorder.reset();
} catch (Exception e) {
Log.e(Constants.TAG, "Exception");
e.printStackTrace();
exception = true;
}
try {
recorder.release();
} catch (Exception e) {
Log.e(Constants.TAG, "Exception");
e.printStackTrace();
exception = true;
}
recorder = null;
if (exception) {
deleteFile();
}
if (recorderStopped) {
Toast.makeText(context, "" + context.getResources().getString(R.string.receiver_end_call), Toast.LENGTH_SHORT).show();
}
}
public void startRecording(String phoneNumber, final Context context, String incoming_or_outgoing, boolean is_missed) {
Log.d(Constants.TAG, "RecordService startRecording");
boolean exception = false;
recorder = new MediaRecorder();
try {
recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
recorder.setAudioEncoder(MediaRecorder.OutputFormat.AMR_NB);
fileName = FileHelper.getFilename(phoneNumber, incoming_or_outgoing, is_missed);
recorder.setOutputFile(fileName);
Log.d("Name of file", "" + fileName);
MediaRecorder.OnErrorListener errorListener = new MediaRecorder.OnErrorListener() {
public void onError(MediaRecorder arg0, int arg1, int arg2) {
Log.e(Constants.TAG, "OnErrorListener " + arg1 + "," + arg2);
terminateAndEraseFile(context);
}
};
recorder.setOnErrorListener(errorListener);
MediaRecorder.OnInfoListener infoListener = new MediaRecorder.OnInfoListener() {
public void onInfo(MediaRecorder arg0, int arg1, int arg2) {
Log.e(Constants.TAG, "OnInfoListener " + arg1 + "," + arg2);
terminateAndEraseFile(context);
}
};
recorder.setOnInfoListener(infoListener);
recorder.prepare();
// Sometimes prepare takes some time to complete
Thread.sleep(2000);
recorder.start();
recording = true;
Log.d(Constants.TAG, "RecordService recorderStarted");
} catch (IllegalStateException e) {
Log.e(Constants.TAG, "IllegalStateException");
e.printStackTrace();
exception = true;
} catch (IOException e) {
Log.e(Constants.TAG, "IOException");
e.printStackTrace();
exception = true;
} catch (Exception e) {
Log.e(Constants.TAG, "Exception");
e.printStackTrace();
exception = true;
}
if (exception) {
terminateAndEraseFile(context);
}
if (recording) {
Toast.makeText(context, "" + context.getResources().getString(R.string.receiver_start_call), Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(context, "" + context.getResources().getString(R.string.record_impossible), Toast.LENGTH_SHORT).show();
}
}
}
这是我遇到的错误:
RecordService stopAndReleaseRecorder
08-29 13:16:02.586 19691-19691/free.call.automatic.recorder E/MediaRecorder: stop called in an invalid state: 1
08-29 13:16:02.586 19691-19691/free.call.automatic.recorder E/Call recorder:: IllegalStateException
08-29 13:16:02.586 19691-19691/free.call.automatic.recorder W/System.err: java.lang.IllegalStateException
08-29 13:16:02.586 19691-19691/free.call.automatic.recorder W/System.err: at android.media.MediaRecorder.stop(Native Method)
08-29 13:16:02.586 19691-19691/free.call.automatic.recorder W/System.err: at free.call.automatic.recorder.helper.CallReceiver.stopAndReleaseRecorder(CallReceiver.java:133)
08-29 13:16:02.586 19691-19691/free.call.automatic.recorder W/System.err: at free.call.automatic.recorder.helper.CallReceiver.onOutgoingCallEnded(CallReceiver.java:53)
08-29 13:16:02.586 19691-19691/free.call.automatic.recorder W/System.err: at free.call.automatic.recorder.helper.PhonecallReceiver.onCallStateChanged(PhonecallReceiver.java:151)
08-29 13:16:02.586 19691-19691/free.call.automatic.recorder W/System.err: at free.call.automatic.recorder.helper.PhonecallReceiver.onReceive(PhonecallReceiver.java:84)
08-29 13:16:02.586 19691-19691/free.call.automatic.recorder W/System.err: at android.app.ActivityThread.handleReceiver(ActivityThread.java:2725)
08-29 13:16:02.586 19691-19691/free.call.automatic.recorder W/System.err: at android.app.ActivityThread.-wrap14(ActivityThread.java)
08-29 13:16:02.586 19691-19691/free.call.automatic.recorder W/System.err: at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1421)
08-29 13:16:02.586 19691-19691/free.call.automatic.recorder W/System.err: at android.os.Handler.dispatchMessage(Handler.java:102)
08-29 13:16:02.586 19691-19691/free.call.automatic.recorder W/System.err: at android.os.Looper.loop(Looper.java:148)
08-29 13:16:02.586 19691-19691/free.call.automatic.recorder W/System.err: at android.app.ActivityThread.main(ActivityThread.java:5417)
08-29 13:16:02.586 19691-19691/free.call.automatic.recorder W/System.err: at java.lang.reflect.Method.invoke(Native Method)
08-29 13:16:02.586 19691-19691/free.call.automatic.recorder W/System.err: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
08-29 13:16:02.586 19691-19691/free.call.automatic.recorder W/System.err: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
08-29 13:16:02.586 19691-19691/free.call.automatic.recorder D/Call recorder:: RecordService deleteFile
最佳答案
以上代码 fragment 只是正确的,但在执行此操作之前,您必须确保以下几点:
MediaRecorder 已经停止,您再次尝试停止它:异常
如果 MediaRecorder 已经发布并且您正在再次尝试释放它:异常
android文档中camera developer guide中提到的正确配置顺序
设置音视频源、格式、编码器
准备
开始
关于java - MediaRecorder 停止在无效状态下调用 : 1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39205075/
我正在通读 Windows Phone 7.5 Unleashed,有很多代码看起来像这样(在页面的代码隐藏中): bool loaded; protected override void OnNav
在cgi服务器中,我这样返回 print ('Status: 201 Created') print ('Content-Type: text/html') print ('Location: htt
我正在查看 esh(easy shell)的实现,无法理解在这种情况下什么是 22 和 9 信号。理想情况下,有一个更具描述性的常量,但我找不到列表。 最佳答案 信号列表及其编号(包括您看到的这两个)
我的Oozie Hive Action 永远处于运行模式。 oozie.log文件中没有显示错误。
我正在编写一个使用 RFCOMM 通过蓝牙连接到设备的 Android 应用程序。我使用 BluetoothChat 示例作为建立连接的基础,大部分时间一切正常。 但是,有时由于出现套接字已打开的消息
我有一个云调度程序作业,它应该每小时访问我的 API 以更新一些价格。这些作业大约需要 80 秒才能运行。 这是它的作用: POST https://www.example.com/api/jobs/
我正在 Tomcat 上访问一个简单的 JSP 页面: 但是当我使用 curl 测试此页面时,我得到了 200 响应代码而不是预期的 202: $ curl -i "http://localhos
有时 JAR-RS 客户端会发送错误的语法请求正文。服务器应响应 HTTP status 400 (Bad Request) , 但它以 HTTP status 500 (Internal Serve
我正在尝试通过 response.send() 发送一个整数,但我不断收到此错误 express deprecated res.send(status): Use res.sendStatus(sta
我已经用 Excel 和 Java 做过很多次了……这次我需要用 Stata 来做,因为保存变量更方便'labels .如何将 dataset_1 重组为下面的 dataset_2? 我需要转换以下
我正在创建一个应用程序,其中的对象具有状态查找功能。为了提供一些上下文,让我们使用以下示例。 帮助台应用程序,其中创建作业并通过以下工作流程移动: 新 - 工作已创建但未分配 进行中 - 分配给工作人
我想在 Keras 中运行 LSTM 并获得输出和状态。在 TF 中有这样的事情 with tf.variable_scope("RNN"): for time_step in range
有谁知道 Scala-GWT 的当前状态 项目? 那里的主要作者 Grzegorz Kossakowski 似乎退出了这个项目,在 Spring 中从事 scalac 的工作。 但是,在 interv
我正在尝试编写一个 super 简单的 applescript 来启动 OneDrive App , 或确保打开,当机器的电源设置为插入时,将退出,或确保关闭,当电源设置为电池时。 我无法找到如何访问
目前我正在做这样的事情 link.on('click', function () { if (link.attr('href') !== $route.current.originalPath
是否可以仅通过查看用户代理来检测浏览器上是否启用/禁用 Javascript。 如果是,我应该寻找什么。如果否,检测用户浏览器是否启用/禁用 JavaScript 的最佳方法是什么 最佳答案 不,没有
Spring 和 OSGi 目前的开发状况如何? 最近好像有点安静了。 文档的最新版本 ( http://docs.spring.io/osgi/ ) 来自 2009 年。 我看到一些声明 Sprin
我正在从主函数为此类创建一个线程,但即使使用 Thread.currentThread().interrupt() 中断它,输出仍然包含“Still Here”行。 public class Writ
为了满足并发要求,我想知道如何在 Godog 中的多个步骤之间传递参数或状态。 func FeatureContext(s *godog.Suite) { // This step is ca
我有一个UIButton子类,它不使用UIImage背景,仅使用背景色。我注意到的一件事是,当您设置按钮的背景图像时,有一个默认的突出显示状态,当按下按钮时,该按钮会稍微变暗。 这是我当前的代码。
我是一名优秀的程序员,十分优秀!