2009-03-01 4 views
42

저는 우리가 필요로하는 것 중 하나가 발신 전화를 제어하고 최소한 애플리케이션에서 멈출 수있는 애플리케이션을 개발 중입니다.Android에서 전화를 끊는 방법?

는 내가 기존 활동에서 Intent.ACTION_CALL를 사용하여 시도했다 :

Intent callIntent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:" + phoneNumber)); 
startActivity(callIntent); 

그러나 전화를 중지하면 API를 통해 허용 될 것으로 보인다.

몇 가지 해결 방법을 제안 할 수 있습니까?

예 : 통화 중에 비행기 모드를 사용 하시겠습니까? 단지 예입니다. 이 해킹은 나를 위해 작동하지 않았다.

+0

사용 했 'BroadcastReceiver'가 효과가 있습니까? 이 질문을 수정하거나 답변을 수락 할 수 있습니까? –

+0

전화를 끊을 수 있습니다. Android 마켓의 TextMe4Callback이이를 수행합니다. –

답변

3

놀라운 장난의 가능성을 고려해 볼 때 이것이 허용된다면 놀랄 것입니다.

이 스레드는 편평하게 그 the API cannot end a call라고합니다. 기타 have tried.

+3

그렇다면 그들이 [tCallBlocking Lite] (http://www.taosoftware.co.jp/en/android/callblockinglite/)에서 어떻게 했습니까? – an0

+1

물론 가능합니다. 위의 답변을 참조하십시오. –

21
  1. 이 중 호를 방지 할

동일한 방법으로 호출 setResultData(null)

  • onReceive 방법에서 ACTION_NEW_OUTGOING_CALL 의도 비씨 인터셉트 0.
  • 의 우선 순위가 BroadcastReceiver 만들기 (당신의 수신기가 내가 생각한 의도를 마지막으로 처리하는 한) 시작하십시오.

  • +2

    Android 2.1 및 2.2에서 작동하는지 확인할 수 있습니다. –

    +0

    나는 또한이 방법을 사용한다. – Nissan911

    +0

    Android 2.3.3 및 이전 버전에서 작동하는 이유에 대한 의견은 있지만 Android 4.0 이상은 사용할 수 없습니까? 내 BroadcastReceiver에서 ACTION_NEW_OUTGOING_CALL을 (를) 선택할 수 없습니다. 나는 취소 통화 부분에 관심이 없지만, 그냥 일할 수없는 전화에 대해서 알고 있습니다. 어떤 생각이라도 고맙게 생각할 것입니다, 감사합니다! – DonnaLea

    5

    sabling 비행기 모드 :

    EXTRA_PHONE_NUMBER - 원래 전화를 거는하도록 전화 번호 :

    android.provider.Settings.System.putInt(getContentResolver(), 
         android.provider.Settings.System.AIRPLANE_MODE_ON, 1); 
    
    Intent intent = new Intent(Intent.ACTION_AIRPLANE_MODE_CHANGED); 
    intent.putExtra("state", 1); 
    sendBroadcast(new Intent("android.intent.action.AIRPLANE_MODE")); 
    sendBroadcast(intent); 
    android.provider.Settings.System.putInt(getContentResolver(), 
         android.provider.Settings.System.AIRPLANE_MODE_ON, 0); 
    
    intent.putExtra("state", 0); 
    sendBroadcast(new Intent("android.intent.action.AIRPLANE_MODE")); 
    sendBroadcast(intent); 
    
    +11

    슬레지 해머, 너트. –

    +3

    현재 발신 통화를 끊을 수있는 방법이 없습니다. Gung Shi Jie가 제안한 해결책은 좋은 생각이지만 작동하지 않습니다. 발신 통화 중에는 'AIRPLANE MODE'상태가 무시되고, 개발 도중 emulaterd 터미널에서만 작동하며 HTC Desire 및 Acer Liquid 휴대 전화에서 모두 시도하고 실패했습니다. –

    0

    ACTION_NEW_OUTGOING_CALL

    의도는 다음과 같은 별도의 값을 갖게됩니다에 대한 설명서에 따르면.

    브로드 캐스트가 끝나면 resultData가 실제 호출 할 번호로 사용됩니다. null의 경우, 호출은 행해지 지 않습니다. 일라 들어

    +1

    이것은 [재의 답변] (http://stackoverflow.com/questions/599443/android-how-to-hang-up-outgoing-call/637284#637284)에 대한 설명으로,'setResultData (null)'을 사용합니다. . –

    4

    : 모든입니다

    <uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" /> 
    

    :

    public class ilanasReceiver extends BroadcastReceiver { 
        public void onReceive(Context context, Intent intent) { 
         if (intent.getAction().equals(Intent.ACTION_NEW_OUTGOING_CALL)) { 
          if (getResultData()!=null) { 
           String number = "123456"; 
           setResultData(number); 
          } 
         } 
        } 
    } 
    

    매니페스트에서 또한 패키지 섹션을 넣어.

    29

    BroadcastReceiver의 발신 통화 캡처가 언급되었으며 전화를 걸기 전에 통화를 끝내려면 가장 좋은 방법입니다.

    전화를 걸거나 전화를 걸면 해당 기술이 더 이상 작동하지 않습니다. 지금까지 내가 만난 유일한 방법은 Java Reflection을 사용하는 것입니다. 공개 API의 일부가 아니기 때문에 을 사용하고 사용하지 말고을 사용해야합니다.Android의 내부 구성이 변경되면 애플리케이션이 효과적으로 중단됩니다.

    Prasanta Paul's blog demonstrates 내가 어떻게 요약 할 수 있는가? 통화 종료

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

    : 다음 ITelephony 객체를 얻기

    시도

    telephonyService.endCall(); 
    
    +6

    +1 바람직하지 않은 방법이지만, OP는 API가 허용하지 않는 것에 대한 해결 방법을 구체적으로 묻습니다. 따라서 좋은 대답입니다. –

    +1

    이것이 유일한 해결책이라면, 이것이 훌륭한 대답이라고 생각합니다! – TacB0sS

    +0

    이 코드로 particlar 호출을 차단할 수 없습니다. –

    25

    이 :

    (나는 Reflection to access advanced telephony features을 사용하고 일도 수정)

    // required permission <uses-permission android:name="android.permission.CALL_PHONE"/> 
    
    try { 
        //String serviceManagerName = "android.os.IServiceManager"; 
        String serviceManagerName = "android.os.ServiceManager"; 
        String serviceManagerNativeName = "android.os.ServiceManagerNative"; 
        String telephonyName = "com.android.internal.telephony.ITelephony"; 
    
        Class telephonyClass; 
        Class telephonyStubClass; 
        Class serviceManagerClass; 
        Class serviceManagerStubClass; 
        Class serviceManagerNativeClass; 
        Class serviceManagerNativeStubClass; 
    
        Method telephonyCall; 
        Method telephonyEndCall; 
        Method telephonyAnswerCall; 
        Method getDefault; 
    
        Method[] temps; 
        Constructor[] serviceManagerConstructor; 
    
        // Method getService; 
        Object telephonyObject; 
        Object serviceManagerObject; 
    
        telephonyClass = Class.forName(telephonyName); 
        telephonyStubClass = telephonyClass.getClasses()[0]; 
        serviceManagerClass = Class.forName(serviceManagerName); 
        serviceManagerNativeClass = Class.forName(serviceManagerNativeName); 
    
        Method getService = // getDefaults[29]; 
        serviceManagerClass.getMethod("getService", String.class); 
    
        Method tempInterfaceMethod = serviceManagerNativeClass.getMethod(
           "asInterface", IBinder.class); 
    
        Binder tmpBinder = new Binder(); 
        tmpBinder.attachInterface(null, "fake"); 
    
        serviceManagerObject = tempInterfaceMethod.invoke(null, tmpBinder); 
        IBinder retbinder = (IBinder) getService.invoke(serviceManagerObject, "phone"); 
        Method serviceMethod = telephonyStubClass.getMethod("asInterface", IBinder.class); 
    
        telephonyObject = serviceMethod.invoke(null, retbinder); 
        //telephonyCall = telephonyClass.getMethod("call", String.class); 
        telephonyEndCall = telephonyClass.getMethod("endCall"); 
        //telephonyAnswerCall = telephonyClass.getMethod("answerRingingCall"); 
    
        telephonyEndCall.invoke(telephonyObject); 
    
    } catch (Exception e) { 
        e.printStackTrace(); 
        Log.error(DialerActivity.this, 
           "FATAL ERROR: could not connect to telephony subsystem"); 
        Log.error(DialerActivity.this, "Exception object: " + e); 
    } 
    
    +1

    덕분에 응용 프로그램을 던지기 전화 끊기에 문제가 없습니다. – shereifhawary

    +3

    우수합니다. [필수 사용 권한 ""] –

    +0

    은 정말 잘 작동합니다. 스피커, 응답 등 사용 가능한 다른 통화 동작을 알고 있습니까? –

    관련 문제