本网站(662p.com)打包出售,且带程序代码数据,662p.com域名,程序内核采用TP框架开发,需要联系扣扣:2360248666 /wx:lianweikj
精品域名一口价出售:1y1m.com(350元) ,6b7b.com(400元) , 5k5j.com(380元) , yayj.com(1800元), jiongzhun.com(1000元) , niuzen.com(2800元) , zennei.com(5000元)
需要联系扣扣:2360248666 /wx:lianweikj
Android8.1 源码修改之通过黑名单屏蔽系统短信功能和来电功能
iamitnan · 946浏览 · 发布于2019-05-10 +关注

前言

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

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

屏蔽短信功能

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

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

源码位置 frameworks\opt\telephony\src\java\com\android\internal\telephony\BlockChecker.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()方法,电话和短信都会走这里,如果你需要单独分开,那么就需要去跟踪各自从哪里调用过来的。

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

vendor\mediatek\proprietary\packages\services\Telecomm\src\com\android\server\telecom\callfiltering

  • 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();

    }

}

接下来再来看短信的

vendor\mediatek\proprietary\frameworks\opt\telephony\src\java\com\mediatek\internal\telephony\cdma\MtkCdmaInboundSmsHandler.java

vendor\mediatek\proprietary\frameworks\opt\telephony\src\java\com\mediatek\internal\telephony\gsm\MtkGsmInboundSmsHandler.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

@Overridepublic 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;
}

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


相关推荐

android下vulkan与opengles纹理互通

talkchan · 1174浏览 · 2020-11-23 10:37:39
Android 使用RecyclerView实现轮播图

奔跑的男人 · 2172浏览 · 2019-05-09 17:11:13
微软发布新命令行工具 Windows Terminal

吴振华 · 866浏览 · 2019-05-09 17:15:04
Facebook 停止屏蔽部分区块链广告

· 752浏览 · 2019-05-09 17:20:08
加载中

0评论

评论
分类专栏
小鸟云服务器
扫码进入手机网页