2012-06-27 4 views
1

android.intent.action.PHONE_STATE 변경 이벤트는 Android BroadCastReceiver에서 다음 코드 스 니펫을 사용하여 catch하고 있습니다. 이벤트를 성공적으로 인식하고 들어오는 호출을 처리 할 수 ​​있으며 다음 코드에 따라 수행 할 수도 있습니다.Android BroadCastReceiver and android.intent.action.PHONE_STATE 이벤트

필자가 요구하는 것은 특정 번호로 오는 호출을 식별하고 해당 호출을 코드를 통해 끝내고 해당 들어오는 이벤트에 대한 웹 서비스를 호출하는 것입니다.

여기서이 코드는 통화 수신 및 종료 이벤트에 대해 두 번 실행됩니다.

이 메서드를 두 번 호출하는 것을 중지하고 싶습니다. 두 번째 이벤트에 대한 코드 스 니펫 호출을 중지 할 수 있습니다 (호출 종료). 어느 누구라도이 일에 나를 도울 수 있다면 그것은 위대한 것이 될 것입니다.

if (intent.getAction().equals(
      "android.intent.action.PHONE_STATE")) { 
     Log.i("INFO", "Call Received"); 

     try { 

      TelephonyManager telephony = (TelephonyManager) context 
        .getSystemService(Context.TELEPHONY_SERVICE); 

      Bundle bundle = intent.getExtras(); 

      Log.i("Calling database", "Creatinng DataHandler Object"); 
      DatabaseHandler db = new DatabaseHandler(context); 
      String phoneNumber =db.getContact().getPhoneNumber(); 

      Log.i("Retriving : ", "Retriving .."+ db.getContact().getPhoneNumber()); 


      if ((bundle.getString("incoming_number").equals(phoneNumber))) { 

       Log.i("Test Call", "This is the test call"); 

       @SuppressWarnings("rawtypes") 
       Class c = Class.forName(telephony.getClass().getName()); 
       Method m = c.getDeclaredMethod("getITelephony"); 
       m.setAccessible(true); 

       ITelephony telephonyService = (ITelephony) m 
         .invoke(telephony); 
       telephonyService = (ITelephony) m.invoke(telephony); 


       telephonyService.endCall(); 

       // Call the web service and send log details 

       ServiceClient sc = new ServiceClient(); 
       sc.serviceCall(context); 


      } else { 
       Log.i("Normal Call", "This is not the test call"); 
      } 

     } catch (Exception e) { 
      Log.i("Exception Occured", "Exception in call code snipet"); 
     } 
    } 

}

+0

어떤 코드가 두 번 실행됩니까? –

+0

문제를 해결 했습니까 – Dory

답변

0

하면 수신기가 시작하자마자 이런 일을 시도 할 수 있습니다 :

Bundle bundle = nIntent.getExtras(); 
    String phoneNr= bundle.getString("incoming_number"); 

    if(null == phoneNr) 
    { // this is outgoing call so bail out 
     return; 
    } 
4

나는 당신이 겪고있는 문제가 그 전화 상태 변경을 두 번, 한 번 할 때 믿습니다 통화가 끝난 후, 전화가 유휴 상태가되면 전화벨이 울립니다.

이 코드를 한 번만 실행하면 가장 좋은 방법은 전화 상태를 확인하기 위해 전화 상태를 추가하여 전화벨이 울리고 통화가 끝나면 전화를 확인하는 것입니다.

체크 다음을 추가하여 수행 할 수 있습니다 : 당신 때문에 안드로이드 보안 이유로 타사 응용 프로그램을 사용하여 수신 통화를 종료 할 수 없습니다

+0

그 점 형제, 고마워요. – Obtice

0

을하는 데 도움이

if (intent.getAction().equals(
     "android.intent.action.PHONE_STATE")) { 
    Log.i("INFO", "Call Received"); 

String state = intent.getStringExtra(TelephonyManager.EXTRA_STATE); 
if (state.equals(TelephonyManager.EXTRA_STATE_RINGING)) { 
//your code here that starts with try block 
} 

희망을. 체크인 "안드로이드 애플 리케이션 개발 요리 책"페이지 번호 "164"

0

나는 그것이 너무 늦었다는 것을 알고 있지만 이것에 대한 배터 솔루션을 발견했다. 일반적으로 5.0 및 5.1에서 발생합니다. 두 번 전화하는 것을 멈출 수는 없지만 한 곳에서 모든 일을 할 수있는 보편적 인 점검을 할 수 있습니다. 그리고이 솔루션은 보편적으로 모든 OS에서 작동합니다. 다음은이 link을 확인 대한 추가 정보를 원하시면 코드

public void onReceive(Context context, Intent intent) { 
    Object obj = intent.getExtras().get("subscription"); 
     long subId; 
     if(obj == null) { 
     subId = Long.MIN_VALUE; // subscription not in extras 
     } else { 
     subId = Long.valueOf(obj.toString()); // subscription is long or int 
     } 

     if(subId < Integer.MAX_VALUE) { 
     // hurray, this is called only once on all operating system versions! 
     }} 

입니다.

관련 문제