在Android 8 Oreo中以编程方式阻止(取消)来电?

时间:2018-07-18 19:10:28

标签: android android-8.0-oreo incoming-call

我正在编写一个用于过滤未经请求的呼叫的应用程序。

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

如果有任何建议,我将不胜感激。

0 个答案:

没有答案