2013-04-11 16 views
10

Ich möchte abgehender Anruf in ICS trennen.Keine solche Methode getITelefony zu trennen Call

Mein Problem ist in erster Linie ich bin nicht die Übertragung in IC 'in Gingerbread funktioniert es gut und blockiert die Anrufe, aber in ICS ist es nicht Broadcasting.

für BroadCast habe ich einen Dienst, und daß ich BroadCast von PHONE_STATE in ICS bin immer auch, aber wenn ich versuche, Anruf zu trennen Ich erhalte Fehler von

NO such method name 'getITelephony' 

in ICS Anruf trennen nicht.

verwende ich folgenden Code Anruf trennen des Broadcasts mit ...

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

mit packgename von package com.android.internal.telephony;

ITelephony.aidl

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

Ich bekomme das gleiche Problem in Google Nexus – Harshid

Antwort

1

Verwendung von Reflexion erhalten Zugang zu "getITelephony" wird in Android nicht funktionieren 2.3+

Referenz:

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

How do you programmatically end a call on 2.3+?

+0

Ich weiß, dass es nicht funktioniert, deshalb habe ich diese Frage geschrieben und den anderen Link habe ich bereits überprüft es auch mir die gleiche Antwort .. . – Developer

+0

Dann sollte Ihre Frage entsprechend geändert werden, um die alternative Lösung –

+0

anzufragen, aber in dieser Antwort wird erwähnt, dass 'silenceRinger() nicht funktioniert, aber endCall() ist in Ordnung ' – Developer

1

1) diese Klasse herunterladen: ITelephony

2) Fügen Sie dieses class.java in Ihrem Projekt in Paket hinzu: com.android.internal.telep hony

3) Fügen Sie diese Erlaubnis in Ihrem Manifest:

<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" /> 

Und um diesen Empfänger in Anwendung balise:

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

4) Erstellen CallReceiver Klasse:

@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

Sie können auch ITelefony.aidl hier herunterladen -> https://github.com/android/platform_frameworks_base/blob/master/telefonie/java/com/android/internal/telephony/ITelefony.aidl –

+0

Gibt es eine Möglichkeit, direkt anzurufen zur Mailbox? – powder366

0

Klasse c = Class.forName ("android.telephony.TelephonyManager"); Dies wird Ihr Problem für Android 2.3 lösen