我正在编写一个用于过滤未经请求的呼叫的应用程序。
该应用程序可以在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)设备上的功能阻止来电?有人对如何正确编程有任何建议吗?
如果有任何建议,我将不胜感激。