2012-04-07 5 views
11

안드로이드 2.2까지 나는 리플렉션을 사용할 수 있고 getITelephony를 통해 호출을 종료 할 수 있다는 것을 알고있다. 앱에 MODIFY_PHONE_STATE 권한을 부여하더라도, 그것은 시스템 응용 프로그램을 현재 전용 권한이기 때문에프로그래밍 방식으로 2.3 이상의 전화를 끝내시겠습니까?

그러나, 2.3로이 더 이상 작동하지 않습니다 : 말했다 https://stackoverflow.com/a/5095956/821423

, 그것은 가능성이 여전히 있기 때문에 다양한 애플리케이션 구글 플레이 시장에서, 예를 들어, ICS에 그것을 잘을하고이 하나

https://play.google.com/store/apps/details?id=com.androminigsm.fscifree&hl=en

그래서, 그들은 그것을 어떻게 하는가하는 질문? 헤드셋 훅을 사용하여 전화를받을 수는 있지만 통화를 종료하는 방법을 알 수는 없습니다.

감사합니다.

답변

18

많은 영혼을 구한 후에 나는 정말로, 정말로, 정말로 바보 같은 것을 깨닫습니다. 더하기 측면에서 아무도 그것을 StackOverflow에 나타났습니다 것으로 보인다. MODIFY_PHONE_STATE는 2.3 이상으로 silenceRinger()에서 더 이상 작동하지 않지만 endCall은 정상적으로 작동합니다.

그래서 해결책은 silenceRinger()에 대한 호출을 주석 처리하는 것입니다.

방금 ​​일주일을 보냈다는 것을 믿을 수 없습니다! 다른 질문을 업데이트하려고 시도 할 것입니다. '더 이상 전화를 끊지 않으려면 리플렉션을 사용할 수 없습니다'라는 라인을 따라 SO에 대해 많은 사람들이있는 것처럼 보입니다.

+0

당신 말은, 우리는 STIL 허용하도록 ITelephony.aidl 기술을 사용하여 프로그래밍 방식으로 호출을 거부하지만, 그것은 단지 작동하지 않습니다 수 있습니다 침묵의 링거? 그런 다음 유일한 해결책은 aidl 파일의 silenceRinger에 댓글을다는 것입니다. Pls는 이것에 대한 귀하의 발견이 새로운 기술을 설계 할 때이 기술을 활용할 수있게 해줄 것을 제안합니다. –

+0

2.3.6에서, iTelephony를 통한 endCall()은이를 수행합니다. 권한 문제를 일으키는 것은 silenceRinger()입니다. silenceRinger()는 실제 코드에서 주석 처리 만하고 AIDL은 그대로 둡니다. 나는 이것을 1.5에서 2.2로 테스트하지 않았으므로 곧 그렇게 할 것이다. 이 페이지에서 알려 드리겠습니다. –

+0

와우 ... 나는 실제로 내 코드에서 endCall()을 가졌지 만 일부 if 문 때문에 충돌이 발생하지 않았습니다. API가 비활성화 되었기 때문에 작동하지 않는다고 가정했습니다. 내가 Google에서이 문제를 해결하지 않도록 삭제에 대한 답변을 표시하려고합니다. :) +1 – you786

3

call(), endcall() 함수도 잘 동작합니다. 그러나 iTelephony.aidl을 사용하지 않고도 작동하는 또 다른 방법이 있습니다. 이 게시물에 게시됩니다. BTW 나는 구글이 이미 알고 있다고 생각하지만 어떤 이유로 그들은 기능의 나머지 부분과 함께 아무것도하지 못했다. 좋은 점이있다 !!!

http://androidbridge.blogspot.com/2011/05/how-to-answer-incoming-call-in-android.html

+0

블로그가 말하기를 이제는 차단되었습니다. – George

1

개인 무효 통화 종료 (최종 문자열 cutofftime) {

TelephonyManager telephony = (TelephonyManager) srvs 
      .getSystemService(Context.TELEPHONY_SERVICE); 
    Class c; 
    final com.android.internal.telephony.ITelephony telephonyService; 
    try { 
     c = Class.forName("android.telephony.TelephonyManager");//telephony.getClass().getName()); 
     Log.i("TelephonyClass Name", telephony.getClass().getName()); 
     Method m = c.getDeclaredMethod("getITelephony"); 
     m.setAccessible(true); 
     telephonyService = (ITelephony) m.invoke(telephony); 
     TimerTask task = new TimerTask() { 

      @Override 
      public void run() { 
       try { 
        if (telephonyService.isIdle() 
          || telephonyService.isOffhook() 
          || telephonyService.isRinging()) 
         telephonyService.endCall(); 
       } catch (RemoteException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
      } 
     }; 
     long delay = Integer.parseInt(cutofftime) * 1000; 
     new Timer().schedule(task, delay); 
    } catch (ClassNotFoundException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (SecurityException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (NoSuchMethodException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (IllegalArgumentException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (IllegalAccessException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (InvocationTargetException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

} 
관련 문제