我正在编写一个过滤不请自来的电话的应用程序。
该应用程序在 Android 4.2(API 级别 17)到 Android 7.1(API 级别 25)上正常运行。
在某些搭载 Android 8.0(API 级别 26)的设备上运行良好(如 SAMSUNG A5 2017),不幸的是,一些搭载 Android 8.0(API 级别 26)的设备无法正常运行(SAMSUNG GALAXY S7、S7 EDGE)
我使用这个代码(代码已被大大简化为本论坛的需要):
public class IncomingCallReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
ITelephony telephonyService;
try {
String state = intent.getStringExtra(TelephonyManager.EXTRA_STATE);
String number = intent.getExtras().getString(TelephonyManager.EXTRA_INCOMING_NUMBER);
if(state.equalsIgnoreCase(TelephonyManager.EXTRA_STATE_RINGING)){
TelephonyManager tm = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);
try {
Method m = tm.getClass().getDeclaredMethod("getITelephony");
m.setAccessible(true);
telephonyService = (ITelephony) m.invoke(tm);
if ((number != null)) {
telephonyService.endCall();
Toast.makeText(context, "Ending the call from: " + number,Toast.LENGTH_SHORT).show();
}
} catch (Exception e) {
e.printStackTrace();
}
Toast.makeText(context, "Ring " + number,Toast.LENGTH_SHORT).show();
}
if(state.equalsIgnoreCase(TelephonyManager.EXTRA_STATE_OFFHOOK)){
Toast.makeText(context, "Answered " + number,Toast.LENGTH_SHORT).show();
}
if(state.equalsIgnoreCase(TelephonyManager.EXTRA_STATE_IDLE)){
Toast.makeText(context, "Idle "+ number, Toast.LENGTH_SHORT).show();
}
} catch (Exception e) {
e.printStackTrace();
}
}
此方法无缝适用于 Android 7.1.1(包括)
对于 Android 9(Android P,API 级别 28+),将使用以下代码:
TelecomManager tm;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
tm = (TelecomManager)mContext.getSystemService(Context.TELECOM_SERVICE);
if (tm == null) {
throw new NullPointerException("tm == null");
}
if (ActivityCompat.checkSelfPermission(mContext, Manifest.permission.ANSWER_PHONE_CALLS) != PackageManager.PERMISSION_GRANTED) {
return;
}
tm.endCall();
};
此方法已在 Android P Preview 上进行了测试,完全没有任何问题。
现在我问以下问题:
是否可以保证 Android 8(API 级别 26 和 27)设备上的功能来阻止来电?有人对如何正确编程有任何建议吗?
我将不胜感激任何建议。