Автоматический ответ на входящие звонки в Nougat

Есть ли способ программно отвечать на входящие звонки в Android 7.0 без привилегий root? Я попытался следующим образом ответить на входящий звонок.

 TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
                  Class<?> c = Class.forName(tm.getClass().getName());
                  Method m = c.getDeclaredMethod("getITelephony");
                  m.setAccessible(true);
                  Object telephonyService = m.invoke(tm);
                  Class<?> telephonyServiceClass = Class.forName(telephonyService.getClass().getName());
                  Method endCallMethod = telephonyServiceClass.getDeclaredMethod("answerRingingCall");
                  endCallMethod.invoke(telephonyService);

person Sanjay Bhalani    schedule 12.08.2018    source источник
comment
С версии API 23 доступен Telecom API, который позволяет вашему приложению принимать все вызовы напрямую. но пользователю нужно будет пометить его как приложение для набора номера по умолчанию.   -  person Pawel    schedule 12.08.2018
comment
Вы пробовали смотреть на этот вопрос? stackoverflow.com/questions/26924618/   -  person a_local_nobody    schedule 17.07.2019
comment
Да знаю, но помочь не могу   -  person Sanjay Bhalani    schedule 17.07.2019


Ответы (1)


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

Создать сервис

class AutoCallPickerService : NotificationListenerService() {

override fun onNotificationPosted(sbn: StatusBarNotification?) {
    super.onNotificationPosted(sbn)
    sbn?.let {
        it.notification.actions?.let { actions ->
            actions.iterator().forEach { item ->
                if (item.title.toString().equals("Answer", true)) {
                    val pendingIntent = item.actionIntent
                    pendingIntent.send()
                }
            }
        }
    }
}

override fun onNotificationRemoved(sbn: StatusBarNotification?) {
    super.onNotificationRemoved(sbn)
    }
}

Здесь мы предполагаем, что у уведомления есть действие с меткой answer, тем самым мы сопоставляем и вызываем соответствующее намерение, связанное с ним. В активности запуска спросите разрешение на доступ к уведомлениям

class MainActivity : AppCompatActivity() {

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    val intent = Intent("android.settings.ACTION_NOTIFICATION_LISTENER_SETTINGS")
    startActivity(intent)
    }
}

Наконец зарегистрируйте сервис для прослушивания уведомлений

<service
            android:name=".AutoCallPickerService"
            android:label="@string/app_name"
            android:permission="android.permission.BIND_NOTIFICATION_LISTENER_SERVICE">
        <intent-filter>
            <action
                    android:name="android.service.notification.NotificationListenerService" />
        </intent-filter>
</service>

Если модель телефона не показывает уведомление о входящих звонках, этот код будет полным провалом.

person Manoj Perumarath    schedule 24.07.2019
comment
Спасибо, но я не хочу отвечать на звонок с помощью уведомления - person Sanjay Bhalani; 24.07.2019
comment
@SanjayBhalani Это для ответа на звонок с помощью уведомления, для использования класса телекоммуникаций я добавлю - person Manoj Perumarath; 24.07.2019
comment
Большое спасибо за ваш ответ, но для меня он бесполезен. - person Sanjay Bhalani; 24.07.2019