1

在我的应用程序中,我需要多次按意图拨打电话。这就是场景。1. 用户在界面中输入电话号码、延迟时间和尝试次数。2. 一旦用户在我的 UI 中按下拨号按钮,它将拨打电话并在指定的延迟后挂断。3. 挂断后,应用程序需要再次拨打电话,直到满足输入的尝试次数。

我使用 android ITelephony.aidl 和 java 反射来调用挂断功能。一次尝试,我可以成功终止通话。当我需要进行多次尝试时会出现问题。这是我的代码:

private void sendCommand(String number, int delay, int tries){
    for(int i=0;i<tries;i++){
        callPhone(number);
        delayTimer(delay);
    }
}
private void callPhone(String number){
    String num = "0776355524";
    Intent callIntent = new Intent(Intent.ACTION_CALL);
    if(!(number.equalsIgnoreCase(""))){
        num = number;
    }   
    callIntent.setData(Uri.parse("tel:"+num));
    startActivity(callIntent);
}
private void delayTimer(int delay){
    final Handler handler = new Handler();
    handler.postDelayed(new Runnable() {
        @Override
        public void run() {
            // Do something after delay
            if(isOffhook()){
                cancelCall();
            }

        }
    }, delay);
}

private boolean isOffhook(){
     TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
try {
    Log.v(TAG, "Get getTeleService...");
    Class c = Class.forName(tm.getClass().getName());
    Method m = c.getDeclaredMethod("getITelephony");
    m.setAccessible(true);
    telephonyService = (ITelephony) m.invoke(tm);

    return telephonyService.isOffhook();

    } catch (Exception e) {
        e.printStackTrace();
        Log.d(TAG, "Error in accessing Telephony Manager: "+ e.toString());
         telephonyService = null;
    }

    return false;
}

private void cancelCall(){
    Log.d(TAG, "Ending call..."+ incomingNumber);
    try {
        if(telephonyService != null)
        telephonyService.endCall();
    } catch (Exception e) {
        e.printStackTrace();
        Log.d(TAG, "Error in accessing Telephony Manager: "+ e.toString());
    }
}

我在代码中做错了什么。在此先感谢,哈萨拉

4

1 回答 1

0

这是行不通的:

for(int i=0;i<tries;i++){
    callPhone(number);
    delayTimer(delay);
}

此循环呼叫该号码,然后Runnable在一段时间后发布挂断电话。然后立即再次拨打该号码。您需要等待延迟才能再次拨打该号码。这样做一次(不是循环):

    callPhone(number);
    delayTimer(delay);

然后,在您的 中Runnable,执行以下操作:

        // Do something after delay
        if(isOffhook()){
            cancelCall();
        }
        // now call the number again
        callPhone(number);
        // reschedule the delay
        delayTimer(delay);

您必须在某处跟踪尝试次数,以便知道何时停止。

于 2013-11-11T09:51:44.487 回答