Android8.1 源碼修改之通過黑名單屏蔽系統簡訊功能和來電功能

来源:https://www.cnblogs.com/cczheng-666/archive/2019/05/09/10840342.html
-Advertisement-
Play Games

前言 之前寫過一篇Android6.0 的屏蔽系統簡訊功能和來電功能,具體看 "這裡" 同樣的最近有個新需求,需要將8.1 設備的來電功能和簡訊功能都屏蔽掉,特殊產品就是特殊定製,那就開始吧。 屏蔽簡訊功能 還可沿用之前的6.0 處理方法, 在 SmsReceiverService.java 中 h ...


前言

之前寫過一篇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

@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來電流程分析(一)


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 雖然做一名程式猿好幾年了,但其實。。。 ...
  • 寫了2個自定義函數,獲取指定日期所在年份的第一天日期或最後一天的日期: SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- -- Author: Insus.NET -- Create date: 2019-05-09 -- Update date ...
  • 在SQL開發過程中,經常需要創建臨時表。在創建時,需要判斷所創建的臨時表是否存在,如果存在,把它DROP掉: IF OBJECT_ID('tempdb..#tempTable') IS NOT NULL BEGIN DROP TABLE #tempTable END ...
  • [20190509]rman備份的疑問5.txt--//別人跟我提到的rman備份問題,我開始以為是assm與mssm的問題,實際測試情況不是.--//開始備份時生成的備份集文件很大,以後會回縮(對方採用壓縮方式).我以前測試也遇到類似的情況,我重覆演示看看.1.環境:SYS@book> @ ver ...
  • 一 . 基礎規範 1.必須使用InnoDB存儲引擎 解讀:支持事務;支持行級鎖;支持MVCC多版本控制;支持外鍵;死鎖自動檢測;併發性能更好、CPU及記憶體緩存頁優化使得資源利用率更高。 2. 表字元集推薦使用utf8mb4 解讀:utf8 是 Mysql 中的一種字元集,只支持最長三個位元組的 UTF ...
  • 實現這個功能,先參考下麵幾篇博文《T-SQL獲取二月份天數》https://www.cnblogs.com/insus/archive/2011/04/22/2025019.html 《如何獲取月份的天數》https://www.cnblogs.com/insus/archive/2011/09/1 ...
  • 1.前言 對於資料庫引擎來說,記憶體是一個性能提升的重要解決手段。把數據緩存起來,可以避免在查詢或更新數據時花費多餘的時間,而這時間通常是從磁碟獲取數據時用來等待磁碟定址的。把執行計劃緩存起來,可以避免重覆分析執行計劃時帶來額外的CPU及各種資源的開銷。通過在記憶體中開闢查詢記憶體空間,可以迅速地完成排序 ...
  • 記法 : 次級等於上級 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...