从Android程序自动拨打一些电话号码

时间:2018-08-15 06:22:15

标签: android telephonymanager

我正在开发一个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);

    }

2 个答案:

答案 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" />

第一个用于通话,第二个用于读取电话状态,例如,如果您要在完成第一个通话结束后拨打第二个通话,则应该执行第二个通话。我认为您应该使用同步线程来调用 一个人一个接一个。并处理听众。