Отклонение входящего вызова в Android

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

  1. Android: получение полного контроля над телефоном ( режим киоска) это возможно? Как?

  2. Как программно отклонить вызов в 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

Но я все еще не могу этого сделать, может ли кто-нибудь рассказать мне простыми и легкими шагами, как это сделать?


person Zubair    schedule 21.02.2013    source источник
comment
Я перехватил исходящий звонок, но не смог понять логику входящих звонков и их перехватов, упомянутых на этих страницах.   -  person Zubair    schedule 22.02.2013
comment
возможный дубликат Завершить вызов в Android программно   -  person Flow    schedule 28.08.2014


Ответы (6)


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

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

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

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

Вот и все.

person Community    schedule 22.02.2013
comment
Работал на меня. Потрясающий !! - person Ahmed; 18.03.2013
comment
получение NoSuchMethodException в методе m = c.getDeclaredMethod(getITelephony);.. Как этого избежать???? - person uniruddh; 26.03.2014
comment
@Zubair, нужно ли для этого какое-либо разрешение? - person Sazzad Hissain Khan; 30.06.2014
comment
это не работает. Есть ли обновленный метод программной блокировки вызовов в Android? - person Wijay Sharma; 21.03.2018
comment
Это сработало, но с последним путем безопасности (H2 2018) кажется, что этот метод был подключен Google. По крайней мере, это похоже на мой Pixel 2, не уверен, что кто-то еще может подтвердить - person D2TheC; 26.06.2018

Предоставьте соответствующее разрешение и добавьте файл 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....");

        }
person Ajay Pandya    schedule 12.02.2015
comment
Отличные решения .. Нужно добавить к нему одно дополнение ... Для версий M + нам также необходимо получить разрешение времени выполнения для CALL_PHONE. Ваше здоровье! - person AndroidHacker; 04.10.2016
comment
Поместили полное решение в ответ на вопрос, заданный самим собой. версия зефира"> stackoverflow.com/questions/39527748/ - person AndroidHacker; 04.10.2016

Для этого вам понадобится широковещательный приемник с фильтром намерений, я думаю, 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" />

Ссылки, которые вы предоставили, довольно хороши. Просто нужно больше терпения :)

счастливое кодирование.

person Ariel Magbanua    schedule 21.02.2013
comment
лол .. Я пытался от 4 до 5 дней .. думал, может быть что-то пропущено в этих ссылках .. - person Zubair; 22.02.2013
comment
Еще один совет: если вы хотите, чтобы телефонные звонки отклонялись только в том случае, если приложение запущено, лучше зарегистрируйте приемник программно в цикле onResume и отмените его регистрацию в цикле Pause. Потому что я думаю, что если вы зарегистрируете его в манифесте, оно будет зарегистрировано до тех пор, пока приложение не будет удалено из вашей системы, и оно будет перехватывать или принимать телефонные звонки, даже если приложение не запущено. - person Ariel Magbanua; 22.02.2013
comment
Хм. это хороший момент. Но что, если я пользуюсь услугами? Я должен отменить регистрацию при уничтожении ()? - person Zubair; 22.02.2013
comment
Вы не можете отменить регистрацию сервисов, вместо этого вызвать метод stopService и выполнить его в цикле onPause(), потому что я думаю, что onDestroy() не гарантируется системой. - person Ariel Magbanua; 22.02.2013

Создайте интерфейс в 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();
            }
        }

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

person Ramesh Kanuganti    schedule 08.08.2016

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

Блокировка входящих вызовов Android

person Community    schedule 26.04.2017

Если вы собираетесь создать киоск-приложение, я предлагаю вам получить настройки уведомлений и перевести устройство в режим «Не беспокоить».

var mNotificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager

mNotificationManager.setInterruptionFilter(NotificationManager.INTERRUPTION_FILTER_NONE)
person Waqar Afzal    schedule 16.04.2020