2013-02-21 7 views
12

Я хочу отклонить входящие в android, я видел так много кода из этих ссылок.Отклонение входящего вызова в 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

Но я до сих пор не в состоянии сделать это, может anyb ody скажите мне в простых и простых шагах, как это сделать?

+0

Я перехватил исходящий вызов, но не в состоянии понять логику входящих звонков и их перехватов, упомянутых на этих страницах. – Zubair

+0

Возможный дубликат [Завершить вызов в android программно] (http://stackoverflow.com/questions/18065144/end-call-in-android-programmatically) – Flow

ответ

1

Вы будете нуждаться в широковещательный приемник для этого с намерением фильтр я думаю ACTION_ANSWER

более подробную информацию об этом здесь: http://developer.android.com/reference/android/content/Intent.html#ACTION_ANSWER

Вы можете зарегистрировать его с помощью файла манифеста или метод registerReceiver

Подробнее здесь: http://developer.android.com/reference/android/content/Context.html#registerReceiver(android.content.BroadcastReceiver, android.content.IntentFilter)

Также вам необходимо указать соответствующие разрешения в файле манифеста.

<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

lol..Я пробовал от 4 до 5 дней..подумать может быть что-то, что пропущено в этих ссылках. – Zubair

+1

Еще один совет, если вы хотите, чтобы телефонные звонки были отклонены, только если приложение запущено, лучше зарегистрируйте приемник программно в цикле onResume и отмените его регистрацию в цикле Pause. Поскольку я думаю, что если вы зарегистрируете его в манифесте, он будет зарегистрирован до тех пор, пока приложение не будет удалено в вашей системе, и оно будет захватывать или принимать телефонные звонки, даже если приложение не работает. –

+0

Хм. это хороший момент. Но что, если я пользуюсь услугами? Я должен отменить его на destroy()? – Zubair

14

Для того чтобы перехватить ваш звонок, вам просто нужно:
1. Сделайте пакет с именем. com.android.internal.telephony;
2. В этом пакете создайте файл интерфейса с именем ITelephony.
и напишите этот код в этом файле интерфейса.

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

Теперь в вашем классе, где вы хотите, чтобы перехватить вызов продлить этот класс BroadcastReceiver и onReceive() функции написать следующий код.

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

Thats it.

+0

Работал для меня. Потрясающие !! – Ahmed

+2

Получение NoSuchMethodException при методе m = c.getDeclaredMethod ("getITelephony"); .. Как его избежать ???? – astuter

+0

@ Zubair есть разрешение для этого? –

3

Обеспечить соответствующее разрешение и добавьте ITelephony.java файл

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 не работает :( –

+0

Отличные решения .. Нужно добавить одно дополнение к нему ... Для версий M + нам также потребуется разрешение на запуск для CALL_PHONE. Cheers! – AndroidHacker

+0

Положите полное решение вопрос о себе ... http://stackoverflow.com/questions/39527748/programmatically-disconnect-call-in-android-marshmallow-version – AndroidHacker

0

Создание интерфейса в com.android.internal.telephony и имя как

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

Добавить необходимое разрешение в манифесте

0

Это лучший учебник блокировать все входящие вызовы, которые вы можете настроить, чтобы заблокировать входящий вызов только выбранных номеров.

Android Incoming Call Block

 Смежные вопросы

  • Нет связанных вопросов^_^