2012-06-06 3 views
4

Я пытаюсь разработать нечто похожее на AutoAnswer, но оно также автоматически зависает, когда уведомляется о широковещательном приемнике. Я потратил весь день на чтение другого вопроса stackoverflow по этой проблеме, и кажется, что разрешение MODIFY_PHONE_STATE ограничено системными приложениями, однако некоторые сообщения говорят, что с помощью endCall(); не требует этого разрешения.Есть ли вообще способ прекратить вызов в Android 2.3?

Мой вопрос состоит из двух частей:

  1. Is endCall() еще можно использовать? Используется ли он когда-либо в любом случае с Android 2.3?
  2. Если это так, мне нужна помощь, чтобы она работала, потому что сейчас она не работает. Я загружаю ITelephony.aidl от http://code.google.com/p/autoanswer/source/browse/trunk/src/com/#com/android/internal/telephony и поставлю его в упаковке. Я новый пользователь, поэтому я не могу отправлять изображения.

Это то, что мой файл дерево выглядит в NetBeans:
enter image description here

И это код, то будет работает в моем BroadcastReceiver. Это была размещена много раз здесь, прежде чем в качестве решения этой проблемы пока еще не могу заставить его работать:/

ITelephony telephonyService; 
    TelephonyManager telephony = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); 
    try { 
     Class c = Class.forName(telephony.getClass().getName()); 
     Method m = c.getDeclaredMethod("getITelephony"); 
     m.setAccessible(true); 
     telephonyService = (ITelephony) m.invoke(telephony); 
     telephonyService.endCall(); 
    } 
    catch (Exception e) { 
      //TODO: some exception handling 
    } 

Листая журналы, я вижу эту ошибку:

[PhoneIntfMgr] CMD_END_CALL: no call to hang up 

EDIT : Я новичок в разработке Android и не могу найти консольный вывод для приложений для Android - например, для вызова e.printStackTrace(), но у меня есть Toast, отображающий некоторый текст внутри блока catch следующим образом:

catch (Exception e) { 
     Toast toast = Toast.makeText(context, "IN CATCH BLOCK ", Toast.LENGTH_LONG); 
     toast.show(); 
     e.printStackTrace(); 
    } 

Но ничего не отображается на экране ..

+0

С состоянием вашего кода вы не можете определить, было ли исключено исключение. Возможно, для начала вы должны добавить в свой блок catch некоторый отладочный вывод. – Paulpro

+0

Надеюсь, что это поможет .. http://stackoverflow.com/questions/10860369/fetch-dial-number-while-calling –

+0

Сначала узнайте о logcat. Затем подумайте, почему вы хотите повесить трубку пользователя на них - это очень редко подходит. –

ответ

0

вы можете использовать этот код:

telephonyManager.listen(new PhoneStateListener() { 

      @Override 
      public void onCallStateChanged(int state, String incomingNumber) { 
       switch (state) { 
       case TelephonyManager.CALL_STATE_IDLE: 
        /* your code */ 
        break; 
       case TelephonyManager.CALL_STATE_OFFHOOK: 
        Toast.makeText(context.getApplicationContext(), "OFFHOOK", 
          Toast.LENGTH_SHORT).show(); 
        setResultData(null); 
        break; 
       case TelephonyManager.CALL_STATE_RINGING: 
        /* your code */ 
        break; 
       } 
       // super.onCallStateChanged(state, incomingNumber); 
      } 

     }, PhoneStateListener.LISTEN_CALL_STATE); 

Когда вы собираетесь OffHook состояния, вы можете увидеть тост, которые показывают «OffHook», а затем setResultData(null); является конец вызов.

+0

Будет ли этот код работать после того, как вызов уже выполняется? Я не хочу блокировать вызовы, я хочу закончить текущие вызовы. – user1304281

+0

см. Отредактированный пост, обнаруженные состояния вызова. Я использую состояние OFFHOOK для завершения вызова, это когда вы принимаете вызов или когда вводите номер и набираете – AliSh

+0

Спасибо! Я попробую это завтра утром. – user1304281

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