2013-02-21 21 views
12

Voglio rifiutare in arrivo in Android, ho visto così tanti codice da questi collegamenti.Rifiuta chiamata in arrivo in Android

  1. Android: Taking complete control of phone(kiosk mode), is it possible? How?

  2. How to Reject a call programatically in android

  3. http://androidsourcecode.blogspot.in/2010/10/blocking-incoming-call-android.html

  4. http://androidbridge.blogspot.com/2011/05/how-to-answer-incoming-call-in-android.html?showComment=1361478035090#c5468022990217431781

Ma io sono ancora in grado di farlo, può anyb qualcuno mi dice in semplici e facili passaggi come farlo?

+0

ho intercettato delle chiamate in uscita, ma incapace di capire la logica dietro le chiamate in arrivo e le loro intercettazioni citati in queste pagine. – Zubair

+0

possibile duplicato di [Fine chiamata in Android a livello di programmazione] (http://stackoverflow.com/questions/18065144/end-call-in-android-programmatically) – Flow

risposta

1

Vi sarà bisogno di un ricevitore broadcast per che con un filtro intento Penso ACTION_ANSWER

maggiori dettagli su di esso qui: http://developer.android.com/reference/android/content/Intent.html#ACTION_ANSWER

È possibile registrarsi utilizzando il file manifesto o il metodo registerReceiver

maggiori informazioni qui: http://developer.android.com/reference/android/content/Context.html#registerReceiver(android.content.BroadcastReceiver, android.content.IntentFilter)

Inoltre, è necessario specificare le autorizzazioni appropriate nel file 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" /> 
<uses-permission android:name="android.permission.PROCESS_INCOMING_CALLS" /> 

I collegamenti che hai fornito sono abbastanza buoni. Hai solo bisogno di più pazienza :)

codifica felice.

+0

lol..Io sto provando da 4 a 5 giorni..pensato potrebbe esserci qualcosa che non è presente in questi collegamenti .. – Zubair

+1

Un altro suggerimento, se si desidera che le telefonate vengano rifiutate solo se l'app è in esecuzione, è meglio registrare il ricevitore a livello di codice in ciclo di pagamento e annullarne la registrazione in ciclo. Perché penso che se lo registrerai sul manifest, verrà registrato fino a quando l'app non verrà rimossa nel tuo sistema e catturerà o riceverà telefonate anche se l'app non è in esecuzione. –

+0

Hmm. questo è un buon punto. Ma cosa succede se sto usando i servizi? Dovrei annullare la registrazione su destroy()? – Zubair

14

Per intercettare la chiamata è sufficiente:
1. Creare un pacchetto denominato. com.android.internal.telephony;
2. In questo pacchetto creare un file di interfaccia denominato ITelephony.
e scrivere questo codice in tale file di interfaccia.

boolean endCall(); 
void answerRingingCall(); 
void silenceRinger(); 

Ora nella classe in cui si desidera intercettare la chiamata si estendono quella classe di BroadcastReceiver e in onReceive() funzione di scrivere il seguente codice.

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

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

Questo è tutto.

+0

ha funzionato per me. Eccezionale !! – Ahmed

+2

ottenere NoSuchMethodException nel metodo m = c.getDeclaredMethod ("getITelephony"); .. Come evitarlo ???? – astuter

+0

@Zubair c'è qualche permesso necessario per fare questo? –

3

Fornire autorizzazione appropriata e aggiungere il file

private void declinePhone(Context context) throws Exception { 

     try { 

      String serviceManagerName = "android.os.ServiceManager"; 
      String serviceManagerNativeName = "android.os.ServiceManagerNative"; 
      String telephonyName = "com.android.internal.telephony.ITelephony"; 
      Class<?> telephonyClass; 
      Class<?> telephonyStubClass; 
      Class<?> serviceManagerClass; 
      Class<?> serviceManagerNativeClass; 
      Method telephonyEndCall; 
      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); 
      telephonyEndCall = telephonyClass.getMethod("endCall"); 
      telephonyEndCall.invoke(telephonyObject); 

     } catch (Exception e) { 
      e.printStackTrace(); 
      Log.d("unable", "msg cant dissconect call...."); 

     } 
+0

Ajay non funziona :( –

+0

Grandi soluzioni .. Bisogno di mettere un add on ad esso ... Per le versioni M + ci viene anche richiesto il permesso di run time per CALL_PHONE. Cheers! – AndroidHacker

+0

Hanno messo la soluzione completa su domanda self: http://stackoverflow.com/questions/39527748/programmatically-disconnect-call-in-android-marshmallow-version – AndroidHacker

0

ITelephony.java Creare un'interfaccia in com.android.internal.telephony e nome come

interface ITelephony { 
    /** 
    * Demonstrates some basic types that you can use as parameters 
    * and return values in AIDL. 
    */ 
    void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat, 
      double aDouble, String aString); 
    boolean endCall(); 
    void silenceRinger();strong text 
    void answerRingingCall(); 
} 

// then catch the incoming call intent and call below method 



    if (intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER) != null) { 
         number = intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER); 
         Toast.makeText(context, "INCOMING call catched: ", Toast.LENGTH_SHORT).show(); 
disconnectPhoneItelephony(mContext) 
        } 


    private void disconnectPhoneItelephony(Context context) { 
      ITelephony telephonyService; 
      TelephonyManager telephony = (TelephonyManager) 
        context.getSystemService(Context.TELEPHONY_SERVICE); 
      try { 
       Class c = Class.forName(telephony.getClass().getName()); 
       Method m = c.getDeclaredMethod("getITelephony"); 
       m.setAccessible(true); 
       SessionManager.getInstance(context).setBlockStatusAllow("BLOCKED"); 
       telephonyService = (ITelephony) m.invoke(telephony); 
       telephonyService.silenceRinger(); 
       telephonyService.endCall(); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 

Aggiungere l'autorizzazione necessaria in Manifesta

0

Questo è il miglior tutorial per blocca tutte le chiamate in arrivo è possibile personalizzarlo per bloccare la chiamata in arrivo solo dei numeri selezionati.

Android Incoming Call Block