- 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/
我正在使用 Tkinter 在 python 上写一个小游戏(顺便说一下,我不允许使用任何其他非内置模块)并且我想在主窗口上播放背景歌曲,这是那个包含标题,以及转到其他窗口和内容的按钮... 所以问题
我有一个 Azure WebJob,它在一个非常简单的应用服务标准:1 Small(计划)上运行。 现在,我的 WebJob(有 5 个函数正在运行)出现问题 - 我想停止 5 个正在运行的函数中的
我在 MacOS Lion 上使用 XCode 4.2。在模拟器中调试 iPhone/iPad 应用程序时,我使用 XCode 工具栏上的“停止”按钮(产品 | 停止)退出应用程序。在此之后,XCod
我刚刚下载了android开放源代码项目,并尝试使用make来构建它,我收到了以下消息: build/core/prebuilt.mk:91: *** recipe commences before
我以前从未制作过 makefile,但我们已经收到了这个,但是,如果我尝试运行它,它只会说, missing separator. stop. 我不知道可能出了什么问题 - 我已经确保空格只按制表符。
好吧,这段代码非常基本。用户将答案输入文本框,如果等于“第一+第二”,他们就得到一分。然后,他们有 5 秒钟的时间回答下一个数学问题。如果他们这样做了,函数“doCalculation”将再次运行,他
我在 viewController 中有一个循环动画 - (void)moveAnimating { [UIView animateWithDuration:2.0f animations:^
当我有一个待处理的 ASIFormDataRequest(作为异步任务启动)仍在执行并且用户按下后退按钮(为了弹出 View )时,我的 viewController 出现问题。 有什么方法可以停止该
我们正在使用 flashdevelop 和 flash CS 3 开发基于 flash 的游戏。我们正在使用 flash CS3 发布 swc,swc 将作为库在 flashdevlop 中使用。 一
我在线程中有一个连接,因此我将其添加到运行循环中以获取所有数据: [[NSRunLoop currentRunLoop] run]; [connection scheduleInRunLoop
你好,我做了一个 php 套接字服务器来从 plc 获取数据,plc 被配置为 tcp 套接字客户端。 我有一个严重的问题,如果本地网络出现故障,似乎功能 socket_accept 停止,plc 无
这个问题已经有答案了: How to stop a setTimeout loop? (10 个回答) 已关闭 8 年前。 请帮助获得正确的函数或方法来停止 setTimeout 函数。 我一直在尝试
我正在运行一个多项目SBT(v0.13)构建,并且希望它在子项目中遇到的第一个错误(编译)时快速失败(停止)。 当前的行为是,当某项无法在子项目中进行编译时,构建将继续(以编译所有其他子项目)。 一旦
我有播放.wav文件中声音的代码,但是我无法停止播放歌曲,甚至无法退出程序直到播放结束。因为这是一首5分钟的歌曲,所以这是一个问题。这是我如何播放wav的代码: public class EasySo
我正在寻找一种解决方案,该如何控制从JSF应用程序播放音频文件。 我不需要完整的解决方案,只需引用我可以用来控制播放音频文件(开始/停止/更改声音)的组件即可。 我尝试搜索过去的问题,但没有成功。 我
我已经在test.ps1中编写了以下函数,在运行该脚本以启动/停止/ ..时我想做一个选择: function getState($SeviceName) { $server = @('hos
我必须设置一个 10 分钟的计时器,它会重定向到主屏幕。此外,它必须在每个操作(例如按下按钮)时重置。我找到了这个计时器:https://github.com/fengyuanchen/vue-cou
我正在制作一个聊天应用程序,功能之一就是发送声音。发送的HTML如下: LOL Stop Play 第一次发送时,“自动播放”效果很好。因此,现在我
我基本上希望页面能够接受用户输入的时间(以秒为单位)。 之后我希望当用户按下“开始”按钮时开始倒计时按下暂停按钮时“暂停”。还有一个重置按钮,以便用户可以从头开始倒计时。 这是我到目前为止得到的:
我需要停止 $.each 循环,加载图像,然后继续循环。我有 Canvas ,可以在其中加载对象图像。对象以正确的顺序排列在数组中。现在,当我尝试从数组加载对象时,存在一个问题:由于尺寸不同,并且它们
我是一名优秀的程序员,十分优秀!