[英]How to fix "Call requires API level 26 (current min is 25) " error in Android
[英]How to end the incoming phone call programmatically specially on devices API level 25,26,27
我正在使用一个Android应用程序,在该应用程序中,我确实拦截了传入的电话,并在某些用户操作下以编程方式结束了它。 为了实现这一点,使用了ITelephony.endCall
。
此实现仅在API级别24之前有效。
private void rejectCallViaTelephonyManager() {
ITelephony telephonyService = getTelephonyService();
if (telephonyService != null) {
telephonyService.endCall();
}
}
private ITelephony getTelephonyService() {
TelephonyManager tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
try {
Class c = Class.forName(tm.getClass().getName());
Method m = c.getDeclaredMethod("getITelephony");
m.setAccessible(true);
return (ITelephony) m.invoke(tm);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
我还遇到了API级别28中引入的新API TelecomManager.endCall
该API在P beta设备上运行良好。
private void rejectCall() {
try {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P /* 28 */) {
TelecomManager manager = (TelecomManager) getSystemService(Context.TELECOM_SERVICE);
if (manager != null) {
// complains required API app requires API level 28 (current min is 21).
manager.endCall();
}
} else {
rejectCallViaTelephonyManager();
}
Log.d(TAG, "call ended successfully.");
} catch (Exception e) {
e.printStackTrace();
}
}
现在,我也在寻找解决方案以使其也适用于API级别25、26、27 。
知道我们该怎么做吗?
我的目标是使“结束打入电话”功能适用于API版本21以后的所有版本。
这是我存档的方式,并且也可以在android P版本上使用。 首先。
清单权限:
<uses-permission android:name="android.permission.READ_CALL_LOG" />
<uses-permission android:name="android.permission.ANSWER_PHONE_CALLS"/>
<uses-permission android:name="android.permission.CALL_PHONE" />
<uses-permission android:name="android.permission.PROCESS_INCOMING_CALLS" />
<uses-permission
android:name="android.permission.MODIFY_PHONE_STATE"
tools:ignore="ProtectedPermissions" />
现在,在大于21的API上,还要求用户在代码中授予运行时权限。 如果低于奥利奥,那就这样问。
requestPermissions(new String[]{Manifest.permission.READ_CONTACTS, Manifest.permission.READ_PHONE_STATE},REQUEST_CONTACTS);
但是如果大于奥利奥的话。
requestPermissions(new String[]{Manifest.permission.READ_CONTACTS, Manifest.permission.ANSWER_PHONE_CALLS,Manifest.permission.READ_PHONE_STATE,Manifest.permission.READ_CALL_LOG},REQUEST_CONTACTS);
现在像这样在您的应用程序中创建一个完整的程序包。
com.android.internal.telephony
在此程序包中放置此接口。
package com.android.internal.telephony;
public interface ITelephony {
boolean endCall();
void answerRingingCall();
void silenceRinger();
}
现在像这样结束通话。
private void endCall(){
ITelephony telephonyService;
TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
if (tm == null)
return;
try {
Class c = Class.forName(tm.getClass().getName());
Method m = c.getDeclaredMethod("getITelephony");
m.setAccessible(true);
telephonyService = (ITelephony) m.invoke(tm);
} catch (Exception e) {
e.printStackTrace();
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
TelecomManager telecomManager = (TelecomManager) context.getSystemService(Context.TELECOM_SERVICE);
if (telecomManager != null) {
telecomManager.endCall();
}
} else {
if (telephonyService != null) {
telephonyService.silenceRinger();
telephonyService.endCall();
}
}}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.