Android8.1 通過(guò)黑名單屏蔽系統(tǒng)短信和來(lái)電功能
前言
同樣的最近有個(gè)新需求,需要將8.1 設(shè)備的來(lái)電功能和短信功能都屏蔽掉,特殊產(chǎn)品就是特殊定制,那就開始吧。
屏蔽短信功能
還可沿用之前的6.0 處理方法, 在 SmsReceiverService.java 中 handleSmsReceived()中進(jìn)行攔截分發(fā)
但是想了想這次準(zhǔn)備搞點(diǎn)不一樣的,我發(fā)現(xiàn)通訊錄和之前6.0不太一樣,8.1有個(gè)添加屏蔽聯(lián)系人的功能,能夠屏蔽指定電話和短信,也就是黑名單功能。所以此次就通過(guò)黑名單的方式進(jìn)行攔截,通過(guò)下面幾位老哥的詳盡分析和打印日志找到修改地方
源碼位置 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;
}
代碼很簡(jiǎn)單,傳遞一個(gè)號(hào)碼,去BlockedNumberContract數(shù)據(jù)庫(kù)中查找是否存在,存在即為黑名單,攔截,不存在則不攔截。
為了實(shí)現(xiàn)攔截的功能,我在前面加了判斷,Settings.Global.IS_INTERCEPT_TELE 讀取值,這是在Settings中自定義的,當(dāng)然你也可以采用SharedPreference保存,這樣就可以動(dòng)態(tài)的控制達(dá)到屏蔽短信和電話的功能。
當(dāng)然如果你需要有黑名單列表,可在此處增加xml或者數(shù)據(jù)庫(kù)查詢,再做對(duì)應(yīng)的攔截返回true操作。
屏蔽來(lái)電功能
方法同上
相關(guān)的簡(jiǎn)單分析
BlockChecker的isBlocked()方法,電話和短信都會(huì)走這里,如果你需要單獨(dú)分開,那么就需要去跟蹤各自從哪里調(diào)用過(guò)來(lái)的。
通過(guò)全局搜索,找到如下目錄
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中調(diào)用 BlockCheckerAdapter 的isBlocked(),而BlockCheckerAdapter最終調(diào)用到BlockChecker中,所以要單獨(dú)屏蔽電話,可在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();
}
}
接下來(lái)再來(lái)看短信的
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
都是直接調(diào)用BlockChecker的isBlocked()方法
在Settings中增加Switch控制是否啟用攔截

效果圖
實(shí)際上就是添加一個(gè)SwitchPreference來(lái)控制 Settings.Global.IS_INTERCEPT_TELE 的值
在安全性和位置信息中添加 攔截設(shè)置選項(xiàng)
源碼位置 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"),監(jiān)聽onPreferenceChange()事件,將回調(diào)結(jié)果 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;
}
總結(jié)
以上所述是小編給大家介紹的Android8.1 通過(guò)黑名單屏蔽系統(tǒng)短信和來(lái)電功能,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
如果你覺(jué)得本文對(duì)你有幫助,歡迎轉(zhuǎn)載,煩請(qǐng)注明出處,謝謝!
相關(guān)文章
Android 限制顯示小數(shù)點(diǎn)后兩位的實(shí)現(xiàn)方法
下面小編就為大家分享一篇Android 限制顯示小數(shù)點(diǎn)后兩位的實(shí)現(xiàn)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-01-01
Android開發(fā)自定義TextView省略號(hào)樣式的方法
這篇文章主要介紹了Android開發(fā)自定義TextView省略號(hào)樣式的方法,結(jié)合實(shí)例形式分析了Android文本控件TextView相關(guān)屬性與字符串操作技巧,需要的朋友可以參考下2017-10-10
Android 5.0 實(shí)現(xiàn)水波擴(kuò)散效果
這篇文章主要為大家詳細(xì)介紹了Android 5.0 實(shí)現(xiàn)水波擴(kuò)散效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-01-01
Android利用Espresso進(jìn)行UI自動(dòng)化測(cè)試的方法詳解
因?yàn)槲沂歉鉧ndroid開發(fā)的,所以被分到了自動(dòng)化測(cè)試小組,所以了解了一些UI自動(dòng)化測(cè)試。下面這篇文章主要給大家介紹了關(guān)于Android利用Espresso進(jìn)行UI自動(dòng)化測(cè)試的相關(guān)資料,需要的朋友可以參考借鑒,下面來(lái)一起看看吧。2017-12-12
基于Android中dp和px之間進(jìn)行轉(zhuǎn)換的實(shí)現(xiàn)代碼
本篇文章是對(duì)在Android中dp和px之間進(jìn)行轉(zhuǎn)換的實(shí)現(xiàn)方法進(jìn)行了分析介紹,需要的朋友參考下2013-05-05
Android開發(fā)之獲取短信驗(yàn)證碼后按鈕背景變化并且出現(xiàn)倒計(jì)時(shí)
在開發(fā)是經(jīng)常會(huì)遇到獲取短信驗(yàn)證碼,然后獲取驗(yàn)證碼后需要等待n秒倒計(jì)時(shí),這時(shí)是不能再次發(fā)送短信請(qǐng)求的,這是需要一個(gè)倒計(jì)時(shí)程序,本文給大家分享了實(shí)現(xiàn)此功能的代碼,需要的朋友參考下2016-01-01
Android View.onMeasure方法詳解及實(shí)例
這篇文章主要介紹了Android View.onMeasure方法詳解及實(shí)例的相關(guān)資料,需要的朋友可以參考下2017-05-05
Android Activity與Intent詳解及示例代碼
本文主要講解Android Activity與Intent的知識(shí),這里整理了相關(guān)資料并附有示例代碼,有興趣的小伙伴可以參考下2016-08-08

