2013-04-11 30 views
10

Chcę odłączyć połączenie wychodzące w ICS.Nie ma takiej metody getITelephony do rozłączenia Zadzwoń

Mój problem to przede wszystkim brak transmisji w IC` w Gingerbread, działa dobrze i blokuje połączenia, ale w ICS nie jest nadawany.

do nadawania I stworzył usługę i że jestem coraz transmisji PHONE_STATE w ICS też ale gdy próbuję odłączyć połączenia otrzymuję błąd z

NO such method name 'getITelephony' 

w zaproszeniu ICS nie jest odłączenie.

używam następujący kod, aby rozłączyć połączenie za pomocą audycji ...

try{ 
     TelephonyManager manager = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE); 
     Class c = Class.forName(manager.getClass().getName()); 
     Method m = c.getDeclaredMethod("getITelephony"); 
     m.setAccessible(true); 
     ITelephony telephony = (ITelephony)m.invoke(manager); 
     telephony.endCall(); 
    } catch(Exception e){ 
     Log.d("",e.getMessage()); 
    } 

AndroidMaifest.xml

PhonecallStateBroadcastReceiver.java

z packgename z package com.android.internal.telephony;

ITelephony.aidl

interface ITelephony 
{ 
    boolean endCall(); 
    void answerRingingCall(); 
    void silenceRinger(); 
} 
+0

Mam ten sam problem w Google Nexus – Harshid

Odpowiedz

1

wykorzystanie odbicia, aby uzyskać dostęp do "getITelephony" nie będzie działać w systemie Android 2.3+

referencyjny:

http://hive-mind.org/android-call-blocking

How do you programmatically end a call on 2.3+?

+0

Wiem, że to nie działa, dlatego opublikowałem to pytanie, a drugi link już sprawdziłem jego również daje mi tę samą odpowiedź .. – Developer

+0

następnie ur pytanie powinno być odpowiednio zmodyfikowane, aby zażądać alternatywnego rozwiązania –

+0

, ale w tej odpowiedzi wspomniano, że 'silenceRinger() nie działa, ale endCall() jest po prostu dobrze' – Developer

1

1) Pobierz tę klasę: ITelephony

2) Dodaj tę klasę.java w projekcie w pakiecie: com.android.internal.telep Hony

3) Dodaj tę zgodę w swoim manifeście:

<uses-permission android:name="android.permission.READ_PHONE_STATE" /> 
<uses-permission android:name="android.permission.MODIFY_PHONE_STATE" /> 
<uses-permission android:name="android.permission.CALL_PHONE" /> 

i ten odbiornik w balisą Zastosowanie:

<receiver android:name=".CallReceiver" > 
    <intent-filter> 
    <action android:name="android.intent.action.PHONE_STATE" /> 
    </intent-filter> 
</receiver> 

4) Utwórz klasę CallReceiver:

@Override 
public void onReceive(Context context, Intent intent) { 
    ITelephony telephonyService = getTeleService(context); 
    if(telephonyService!=null) { 
     try { 
      String numberCall = intent.getExtras().getString(TelephonyManager.EXTRA_INCOMING_NUMBER); 
      Log.i("TAG", "CALL NUM: " + numberCall); 
      if(numberCall.equals(TEST_NUMBER)) { 
       telephonyService.endCall(); 
       Toast.makeText(context, "END CALL: " + numberCall, Toast.LENGTH_LONG).show(); 
       Log.i("TAG", "END CALL"); 
      } else { 
       Log.i("TAG", "ACCEPT CALL"); 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
      Log.i("TAG", "CATCH CALL"); 
     } 
    } 
} 

private ITelephony getTeleService(Context context) { 
    TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); 
    try { 
     Method m = Class.forName(tm.getClass().getName()).getDeclaredMethod("getITelephony"); 
     m.setAccessible(true); 
     return (ITelephony) m.invoke(tm); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    return null; 
} 
+1

Możesz także pobrać ITelephony.aidl tutaj -> https://github.com/android/platform_frameworks_base/blob/master/telephony/java/com/android/internal/telephony/ITelephony.aidl –

+0

Czy istnieje sposób na bezpośrednie połączenie do poczty głosowej? – powder366

0

Klasa C = Class.forName ("android.telephony.TelephonyManager"); to rozwiąże twój problem dla Androida 2.3+