Android:如何在for循环中调用intent?

时间:2013-11-10 10:52:42

标签: android android-intent

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

我使用android ITelephony.aidl和java反射来调用hangup函数。对于一次尝试,我可以成功终止呼叫。当我需要多次尝试时会出现问题。 这是我的代码:

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());
    }
}

我的代码中出错了什么。 提前致谢, Hasala

1 个答案:

答案 0 :(得分: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);

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