android auto answer,android.permission.ANSWER_PHONE_CALLS How I can use? for auto answer

For answering a phone call, this is available only from Android O. Before, it might not work. Here's a code for it:

/**returns true iff we are sure that answering the phone call worked*/

fun answerCall(context: Context): Boolean {

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {

val telecomManager = context.getSystemService(Context.TELECOM_SERVICE) as TelecomManager

if (ContextCompat.checkSelfPermission(context, Manifest.permission.ANSWER_PHONE_CALLS) == PackageManager.PERMISSION_GRANTED

|| ContextCompat.checkSelfPermission(context, Manifest.permission.MODIFY_PHONE_STATE) == PackageManager.PERMISSION_GRANTED) {

telecomManager.acceptRingingCall()

return true

}

return false

}

// https://stackoverflow.com/a/29651130/878126

// for HTC devices we need to broadcast a connected headset

val audioManager = context.getSystemService(Context.AUDIO_SERVICE) as AudioManager

val broadcastConnected = "htc" == Build.MANUFACTURER.toLowerCase(Locale.US) && !audioManager.isWiredHeadsetOn

if (broadcastConnected)

broadcastHeadsetConnected(context, false)

try {

try {

Runtime.getRuntime().exec("input keyevent " + Integer.toString(KeyEvent.KEYCODE_HEADSETHOOK))

} catch (e: IOException) {

// Runtime.exec(String) had an I/O problem, try to fall back

val enforcedPerm = "android.permission.CALL_PRIVILEGED"

val btnDown = Intent(Intent.ACTION_MEDIA_BUTTON).putExtra(Intent.EXTRA_KEY_EVENT, KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_HEADSETHOOK))

val btnUp = Intent(Intent.ACTION_MEDIA_BUTTON).putExtra(Intent.EXTRA_KEY_EVENT, KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_HEADSETHOOK))

context.sendOrderedBroadcast(btnDown, enforcedPerm)

context.sendOrderedBroadcast(btnUp, enforcedPerm)

}

} finally {

if (broadcastConnected)

broadcastHeadsetConnected(context, false)

}

return false

}

For hanging up a call, this was added officially on Android P, but the workaround seems to work on most cases I've tried so far (doesn't work on Nexus 5x with Android 8.1, for example) . Here's code for this :

@SuppressLint("PrivateApi")

fun endCall(context: Context): Boolean {

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {

val telecomManager = context.getSystemService(Context.TELECOM_SERVICE) as TelecomManager

if (telecomManager != null && ContextCompat.checkSelfPermission(context, Manifest.permission.ANSWER_PHONE_CALLS) == PackageManager.PERMISSION_GRANTED) {

telecomManager.endCall()

return true

}

return false

}

//use unofficial API for older Android versions, as written here: https://stackoverflow.com/a/8380418/878126

try {

val telephonyClass = Class.forName("com.android.internal.telephony.ITelephony")

val telephonyStubClass = telephonyClass.classes[0]

val serviceManagerClass = Class.forName("android.os.ServiceManager")

val serviceManagerNativeClass = Class.forName("android.os.ServiceManagerNative")

val getService = serviceManagerClass.getMethod("getService", String::class.java)

val tempInterfaceMethod = serviceManagerNativeClass.getMethod("asInterface", IBinder::class.java)

val tmpBinder = Binder()

tmpBinder.attachInterface(null, "fake")

val serviceManagerObject = tempInterfaceMethod.invoke(null, tmpBinder)

val retbinder = getService.invoke(serviceManagerObject, "phone") as IBinder

val serviceMethod = telephonyStubClass.getMethod("asInterface", IBinder::class.java)

val telephonyObject = serviceMethod.invoke(null, retbinder)

val telephonyEndCall = telephonyClass.getMethod("endCall")

telephonyEndCall.invoke(telephonyObject)

return false

} catch (e: Exception) {

e.printStackTrace()

return false

}

}

So, for both answering and rejecting calls, the safest way to do it, is to have it run on Android P... :(

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值