zoukankan      html  css  js  c++  java
  • Android8.1 源码修改之通过黑名单屏蔽系统短信功能和来电功能

    前言

    之前写过一篇Android6.0 的屏蔽系统短信功能和来电功能,具体看这里

    同样的最近有个新需求,需要将8.1 设备的来电功能和短信功能都屏蔽掉,特殊产品就是特殊定制,那就开始吧。

    屏蔽短信功能

    还可沿用之前的6.0 处理方法, 在 SmsReceiverService.java 中 handleSmsReceived()中进行拦截分发

    但是想了想这次准备搞点不一样的,我发现通讯录和之前6.0不太一样,8.1有个添加屏蔽联系人的功能,能够屏蔽指定电话和短信,也就是黑名单功能。所以此次就通过黑名单的方式进行拦截,通过下面几位老哥的详尽分析和打印日志找到修改地方

    源码位置 frameworksopt elephonysrcjavacomandroidinternal elephonyBlockChecker.java

    public static boolean isBlocked(Context context, String phoneNumber) {
        boolean isBlocked = false;
        long startTimeNano = System.nanoTime();
    	//cczheng add [S]
        log("phoneNumber==="+phoneNumber);
        boolean isIntercept = Settings.Global.getInt(context.getContentResolver(), 
                Settings.Global.IS_INTERCEPT_TELE, 1) == 1;
        if (isIntercept) {
            log("Intercept tele don't delivery..... default is blocked");
            return true;
        }
    	//cczheng add [E]
        try {
            if (BlockedNumberContract.SystemContract.shouldSystemBlockNumber(
                    context, phoneNumber)) {
                Rlog.d(TAG, phoneNumber + " is blocked.");
                isBlocked = true;
            }
        } catch (Exception e) {
            Rlog.e(TAG, "Exception checking for blocked number: " + e);
        }
    
        int durationMillis = (int) ((System.nanoTime() - startTimeNano) / 1000000);
        if (durationMillis > 500 || VDBG) {
            Rlog.d(TAG, "Blocked number lookup took: " + durationMillis + " ms.");
        }
        return isBlocked;
    }
    

    代码很简单,传递一个号码,去BlockedNumberContract数据库中查找是否存在,存在即为黑名单,拦截,不存在则不拦截。

    为了实现拦截的功能,我在前面加了判断,Settings.Global.IS_INTERCEPT_TELE 读取值,这是在Settings中自定义的,当然你也可以采用SharedPreference保存,这样就可以动态的控制达到屏蔽短信和电话的功能。

    当然如果你需要有黑名单列表,可在此处增加xml或者数据库查询,再做对应的拦截返回true操作。

    屏蔽来电功能

    方法同上

    相关的简单分析

    BlockChecker的isBlocked()方法,电话和短信都会走这里,如果你需要单独分开,那么就需要去跟踪各自从哪里调用过来的。

    通过全局搜索,找到如下目录

    vendormediatekproprietarypackagesservicesTelecommsrccomandroidserver elecomcallfiltering

    • AsyncBlockCheckFilter.java
    • BlockCheckerAdapter.java
    • CallFilteringResult.java
    • CallFilterResultCallback.java
    • CallScreeningServiceFilter.java
    • DirectToVoicemailCallFilter.java
    • IncomingCallFilter.java

    AsyncBlockCheckFilter中调用 BlockCheckerAdapter 的isBlocked(),而BlockCheckerAdapter最终调用到BlockChecker中,所以要单独屏蔽电话,可在AsyncBlockCheckFilter中操作

     @Override
    protected Boolean doInBackground(String... params) {
        try {
            Log.continueSession(mBackgroundTaskSubsession, "ABCF.dIB");
            Log.addEvent(mIncomingCall, LogUtils.Events.BLOCK_CHECK_INITIATED);
            return mBlockCheckerAdapter.isBlocked(mContext, params[0]);
        } finally {
            Log.endSession();
        }
    }
    

    接下来再来看短信的

    vendormediatekproprietaryframeworksopt elephonysrcjavacommediatekinternal elephonycdmaMtkCdmaInboundSmsHandler.java

    vendormediatekproprietaryframeworksopt elephonysrcjavacommediatekinternal elephonygsmMtkGsmInboundSmsHandler.java

    都是直接调用BlockChecker的isBlocked()方法

    在Settings中增加Switch控制是否启用拦截

    效果图

    实际上就是添加一个SwitchPreference来控制 Settings.Global.IS_INTERCEPT_TELE 的值

    在安全性和位置信息中添加 拦截设置选项

    源码位置 vendor/mediatek/proprietary/packages/apps/MtkSettings/src/com/android/settings/SecuritySettings.java

    仿照security_settings_misc.xml增加一份 security_settings_blockcheck.xml

    <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
        android:title="@string/security_settings_title">
    
        <PreferenceCategory android:title="@string/security_blockcheck_title"
                android:persistent="false">
    
            <SwitchPreference
                android:key="is_intercept"
                android:title="@string/is_intercept"
                android:summary="@string/is_intercept_summary"/>
    
        </PreferenceCategory>
    
    </PreferenceScreen>
    

    在SecuritySettings中findPreference("is_intercept"),监听onPreferenceChange()事件,将回调结果 value 保存到IS_INTERCEPT_TELE

    @Override
    public boolean onPreferenceChange(Preference preference, Object value) {
        boolean result = true;
        final String key = preference.getKey();
        final LockPatternUtils lockPatternUtils = mChooseLockSettingsHelper.utils();
    
    	 if (KEY_IS_INTERCEPT.equals(key)) {
            Settings.Global.putInt(getContentResolver(), Settings.Global.IS_INTERCEPT_TELE,
                    ((Boolean) value) ? 1 : 0);
        }
        return result;
    }
    

    好了,至此功能完成,感兴趣的可研读下列参考文章

    参考文章

    Android7.0 Phone应用源码分析(二) phone来电流程分析

    Telephony之GsmCallTracker

    Android 8.0来电流程分析(一)

  • 相关阅读:
    OCP-1Z0-053-200题-77题-654
    OCP-1Z0-053-200题-45题-623
    OCP-1Z0-053-200题-46题-624
    OCP-1Z0-053-200题-48题-626
    OCP-1Z0-053-200题-49题-627
    OCP-1Z0-053-V13.02-619题
    OCP-1Z0-053-200题-43题-678
    OCP-1Z0-053-200题-44题-622
    OCP-1Z0-053-V13.02-512题
    OCP-1Z0-053-200题-38题-617
  • 原文地址:https://www.cnblogs.com/cczheng-666/p/10840342.html
Copyright © 2011-2022 走看看