我正在开发一个android应用程序,以便依次拨打一些电话号码。例如,有3个editText
,其中每个都包含一个特定的电话号码,并且在拨打第一个电话号码之后,会在拨打第二个电话号码之前发生延迟,依此类推。
但是当我开始打电话时,我看到(不是应用程序正在响应)消息,并且没有登录(logcat)。解决办法是什么? 代码如下:
private void onClickCall() {
check = true;
sumSms = 0;
delayCall = Integer.parseInt(editTextDelayCall.getText().toString());
repeatCall = Integer.parseInt(editTextRepeatCall.getText().toString());
for (int j=0;j<phoneNumberList.size();j++)
for (int i = 0; i <repeatCall; i++) {
Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:" + phoneNumberList.get(i).getPhoneNumber()));
startActivity(intent);
try {
Thread.sleep(delayCall);
endCall(context);
} catch (InterruptedException ie) {
Thread.currentThread().interrupt();
Log.e("0", ie + "");
} catch (Exception e) {
e.printStackTrace();
}
}
}
结束调用方法:
private void endCall(Context context) throws Exception {
String serviceManagerName = "android.os.ServiceManager";
String serviceManagerNativeName = "android.os.ServiceManagerNative";
String telephonyName = "com.android.internal.telephony.ITelephony";
Class<?> telephonyClass;
Class<?> telephonyStubClass;
Class<?> serviceManagerClass;
Class<?> serviceManagerNativeClass;
Method telephonyEndCall;
Object telephonyObject;
Object serviceManagerObject;
telephonyClass = Class.forName(telephonyName);
telephonyStubClass = telephonyClass.getClasses()[0];
serviceManagerClass = Class.forName(serviceManagerName);
serviceManagerNativeClass = Class.forName(serviceManagerNativeName);
Method getService = serviceManagerClass.getMethod("getService", String.class);
Method tempInterfaceMethod = serviceManagerNativeClass.getMethod("asInterface", IBinder.class);
Binder tmpBinder = new Binder();
tmpBinder.attachInterface(null, "fake");
serviceManagerObject = tempInterfaceMethod.invoke(null, tmpBinder);
IBinder retbinder = (IBinder) getService.invoke(serviceManagerObject, "phone");
Method serviceMethod = telephonyStubClass.getMethod("asInterface", IBinder.class);
telephonyObject = serviceMethod.invoke(null, retbinder);
telephonyEndCall = telephonyClass.getMethod("endCall");
telephonyEndCall.invoke(telephonyObject);
}
答案 0 :(得分:0)
决不要在UI线程上休眠。这将阻塞线程,导致您的应用程序无响应。不要这样做。
我不知道您打算怎样睡觉,等待通话结束?那行不通。曾经如果您正在等待通话结束,请查找电话状态以更改为响铃,然后再转回摘机状态。但是您不能通过睡眠来做到这一点,这将是通过广播接收器进行的异步事件。
我不确定endcall()应该做什么,但是在Android中无法终止除拨号程序之外的任何应用程序的呼叫。千方百计,Google已在下一版本中打破了传统。不支持该功能。
答案 1 :(得分:0)
我认为您要做的是首先在清单中添加以下2个权限:
<uses-permission android:name="android.permission.CALL_PHONE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
第一个用于通话,第二个用于读取电话状态,例如,如果您要在完成第一个通话结束后拨打第二个通话,则应该执行第二个通话。我认为您应该使用同步线程来调用 一个人一个接一个。并处理听众。