0

Я создаю приложение для Android, которое делает звонок. Я просто хочу отменить или отменить вызов после определенной продолжительности, например, я хочу сделать вызов, который автоматически падает через 60 секунд. Возможно ли это в android? Вот мой код:Android - Как ограничить вызов на определенную продолжительность?

public void onCreate(Bundle savedInstanceState) { 

    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    // add PhoneStateListener 
    PhoneCallListener phoneListener = new PhoneCallListener(); 
    TelephonyManager telephonyManager = (TelephonyManager) this.getSystemService(Context.TELEPHONY_SERVICE); 
    telephonyManager.listen(phoneListener, PhoneStateListener.LISTEN_CALL_STATE); 

    Intent callIntent = new Intent(Intent.ACTION_CALL); 

    callIntent.setData(Uri.parse("tel:*03362111904")); 

    startActivity(callIntent); 
} 

private class PhoneCallListener extends PhoneStateListener { 

    private boolean isPhoneCalling = false; 

    String LOG_TAG = "LOGGING 123"; 

    @Override 
    public void onCallStateChanged(int state, String incomingNumber) { 

     if (TelephonyManager.CALL_STATE_RINGING == state) { 
      // phone ringing 
      Log.i(LOG_TAG, "RINGING, number: " + incomingNumber); 
     } 

     if (TelephonyManager.CALL_STATE_OFFHOOK == state) { 
      // active 
      Log.i(LOG_TAG, "OFFHOOK"); 

      isPhoneCalling = true; 
     } 

     if (TelephonyManager.CALL_STATE_IDLE == state) { 
      // run when class initial and phone call ended, need detect flag 
      // from CALL_STATE_OFFHOOK 
      Log.i(LOG_TAG, "IDLE"); 

      if (isPhoneCalling) { 

       Log.i(LOG_TAG, "restart app"); 

       // restart app 
       Intent i = getBaseContext().getPackageManager() 
         .getLaunchIntentForPackage(
           getBaseContext().getPackageName()); 
       i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
       startActivity(i); 

       isPhoneCalling = false; 
      } 

     } 
    } 
} 

}

ответ

1

Захват исходящего вызова в BroadcastReceiver было упомянуто и, безусловно, лучший способ сделать это, если вы хотите, чтобы завершить вызов перед набором номера.

Единственный способ повесить трубку, с которой я столкнулся до сих пор, - это сделать через Java Reflection. Поскольку он не является частью общедоступного API, вы должны быть осторожным, чтобы использовать его, а не полагаться на него. Любое изменение во внутреннем составе Android эффективно нарушит ваше приложение.

Prasanta Paul's blog demonstrates как это можно сделать, что я кратко изложил ниже.

Получение ITelephony объекта:

TelephonyManager tm = (TelephonyManager) context 
     .getSystemService(Context.TELEPHONY_SERVICE); 
try { 
    // Java reflection to gain access to TelephonyManager's 
    // ITelephony getter 
    Log.v(TAG, "Get getTeleService..."); 
    Class c = Class.forName(tm.getClass().getName()); 
    Method m = c.getDeclaredMethod("getITelephony"); 
    m.setAccessible(true); 
    com.android.internal.telephony.ITelephony telephonyService = 
      (ITelephony) m.invoke(tm); 
} catch (Exception e) { 
    e.printStackTrace(); 
    Log.e(TAG, 
      "FATAL ERROR: could not connect to telephony subsystem"); 
    Log.e(TAG, "Exception object: " + e); 
} 

Завершение вызова:

telephonyService.endCall(); 
+0

Спасибо за ответ. Код, который вы предоставили, просто отменяет вызов, но как я могу отменить вызов после 60 секунд набранного вызова? –

+0

вы можете добавить свою логику в «BroadcastReceiver», чтобы получить информацию о звонках –

+0

Вы можете установить таймер или обработчик с последующим завершением вызова через 60 секунд. – Sripathi

Смежные вопросы