2

我正在编写一个过滤不请自来的电话的应用程序。

该应用程序在 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)设备上的功能来阻止来电?有人对如何正确编程有任何建议吗?

我将不胜感激任何建议。

4

0 回答 0