6

有没有办法在没有root权限的情况下以编程方式在Android 7.0中接听来电?我尝试了以下方式来接听来电。

 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);
4

1 回答 1

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>

如果电话型号未显示来电通知,则此代码将完全失败。

于 2019-07-24T06:28:49.470 回答