在没有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);
答案 0 :(得分:1)
您可以使用通知侦听器来做一个怪异的技巧,通过创建服务来侦听所有通知,每当有电话要来时,它肯定会显示一条通知,询问用户是否接听。
创建服务
Log.Information("REQUEST: {request}", Newtonsoft.Json.JsonConvert.SerializeObject(request));
在这里,我们假设通知具有标签为 answer 的操作,因此我们进行匹配并调用与之相关的相应意图。 在启动器活动中,询问访问通知的权限
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)
}
}
最后注册该服务以收听通知
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)
}
}
如果电话型号未显示来电通知,则此代码将完全失效。