2011-09-08 14 views
5

Nella mia app manterrò un elenco di contatti.Come rifiutare una chiamata programmaticamente in Android

Qualsiasi chiamata dai contatti nell'elenco verrà eliminata. Mostreranno le chiamate perse ma il telefono non squillerà.

+0

ContentObserver è la parola in cui il vostro barattolo migliori pratiche –

+0

possibile duplicato di [Come bloccare le chiamate in Android] (http://stackoverflow.com/questions/1083527/how-to-block-calls-in-android) –

+0

'MODIFY_PHONE_STATE' [permesso è solo per le app di sistema] (http://stackoverflow.com/questions/4715250/how-to-grant-modify-phone-state-permission-for-apps-ran-on-gingerbread) (per Android 2.3 e versioni successive). Se si desidera utilizzare l'app solo per il telefono a cui si ha accesso, è possibile [creare l'app del sistema app] (http://projectmaxs.org/documentation/systemapp.html) – tchelidze

risposta

15

Innanzitutto creare questa interfaccia:

public interface ITelephony { 

     boolean endCall(); 

     void answerRingingCall(); 

     void silenceRinger(); 

    } 

quindi creare questa classe che si estende BroadcastReceiver

public class IncomingCallReceiver extends BroadcastReceiver { 
    private ITelephony telephonyService; 
    private String blacklistednumber = "+458664455"; 

    @Override 
    public void onReceive(Context context, Intent intent) { 

     TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); 
     try { 
     Class c = Class.forName(tm.getClass().getName()); 
     Method m = c.getDeclaredMethod("getITelephony"); 
     m.setAccessible(true); 
     ITelephony telephonyService = (ITelephony) m.invoke(tm); 
     Bundle bundle = intent.getExtras(); 
     String phoneNumber = bundle.getString("incoming_number"); 
     Log.e("INCOMING", phoneNumber); 
     if ((phoneNumber != null) && phoneNumber.equals(blacklistednumber)) { 
      telephonyService.silenceRinger(); 
      telephonyService.endCall(); 
      Log.e("HANG UP", phoneNumber); 
     } 

     } catch (Exception e) { 
     e.printStackTrace(); 
     } 
} 

Questo bloccherà solo quel singolo phonenumber, ma si ottiene il punto.

Nel vostro manifesto aggiungere questo:

<receiver android:name=".IncomingCallReceiver"> 
    <intent-filter android:priority="999"> 
     <action android:name="android.intent.action.PHONE_STATE" /> 
    </intent-filter> 
</receiver> 
<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" /> 
<uses-permission android:name="android.permission.PROCESS_INCOMING_CALLS" /> 
+0

ciao l'ho fatto. Ma è successo sapere. Come creare quell'interfaccia cosa intendo per interfaccia normale o file helpl – harish

+0

basta creare un intercafe normale. Ma potresti aver bisogno di metterlo in un pacchetto chiamato: com.android.internal.telephony provalo. –

+0

anche se non funziona penso che dobbiamo generare il file aidl. Ma non so come farlo. – harish

2

Scarica la classe di ITelephony da here.

poi metterlo in un pacchetto (fare un nuovo pacchetto) di com.android.internal.telephony. quindi importare il pacchetto per la classe appropriata e per rifiuto di una chiamata utilizzare il metodo endCall()

Problemi correlati