Android实现来电挂断
2021-01-05 本文已影响0人
Mixqum
Android实现来电挂断要注意区分系统版本
- Android 9.0 以后使用TelecomManager
(需要权限Manifest.permission.ANSWER_PHONE_CALLS)。 - Android 8.0 前用aidl反射方法
下面来封装挂断电话工具类
- 创建aidl文件夹,在该文件夹创建包名
com.android.internal.telephony
注意包名不能改变,因为是通过反射方式来实现挂断

- 创建
ITelephony
类
package com.android.internal.telephony;
interface ITelephony {
boolean endCall();
void answerRingingCall();
void silenceRinger();
}
- 最后创建
PhoneUtil
,用来挂断电话
class PhoneUtil {
private static final String TAG = "PhoneUtil";
/**
* 挂断电话
*
* @param context
* @return
*/
public static boolean endCall(Context context) {
boolean callSuccess = false;
try {
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.P) {
// >=Android 9,需打开 Manifest.permission.ANSWER_PHONE_CALLS 权限
TelecomManager telecomManager = (TelecomManager) context.getSystemService(Context.TELECOM_SERVICE);
telecomManager.endCall();
callSuccess = true;
Log.d(TAG, "telecomManager.endCall() finish");
} else {
// 1.获取TelephonyManager
// 2.获取TelephonyManager.class
// 3.反射调用TelephonyManager的 getITelephony方法获取ITelephony
// 4.挂断电话ITelephony.endCall
TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
Class c = Class.forName(tm.getClass().getName());
Method m = c.getDeclaredMethod("getITelephony");
m.setAccessible(true);
ITelephony telephonyService = (ITelephony) m.invoke(tm);
if (telephonyService != null) {
callSuccess = telephonyService.endCall();
Log.d(TAG, " telephonyService.endCall finish");
}
}
} catch (Exception e) {
Log.d(TAG, "Exception error: " + e.getMessage());
callSuccess = disconnectCall();
;
e.printStackTrace();
}
return callSuccess;
}
private static boolean disconnectCall() {
try {
Log.d(TAG, "input keyevent " + KeyEvent.KEYCODE_ENDCALL);
Runtime.getRuntime().exec("input keyevent " +
Integer.toString(KeyEvent.KEYCODE_ENDCALL));//KEYCODE_HEADSETHOOK
} catch (Exception exc) {
Log.d(TAG, "exc.printStackTrace");
exc.printStackTrace();
return false;
}
return true;
}
}
演示如何挂断电话:
PhoneUtil.endCall(context);