关于Android O系统短信拦截的流程

前言

本文的源码采用anroid9的
首先待拦截的号码需要进行存储,而且号码的个数肯定很多,用户使用的情况复杂,所以选择数据库进行存储。拦截层需要在系统中进行,所以上层APP需要访问数据,所以数据库不能是本地数据库,需要是以contentprovider形式提供服务。

frameworks/base/core/java/android/provider/BlockedNumberContract.java

BlockedNumberContract中包含了:

  • BlockedNumbers ,存取黑名单号码&content_uri
  • SystemContract 系统与黑名单ContentProvider的联系接口
  • BlockSuppressionStatus

桥接器类

BlockChecker 是在 InboundSmsHandlerBlockedNumberContract之间的一个类,InboundSmsHandler不直接调用BlockedNumberContract的方法。根据设计模式的定义,BlockChecker是一个桥接器类。

拦截

InboundSmsHandler短信转发是在这个类中。

    /**
     * Process the inbound SMS segment. If the message is complete, send it as an ordered
     * broadcast to interested receivers and return true. If the message is a segment of an
     * incomplete multi-part SMS, return false.
     * @param tracker the tracker containing the message segment to process
     * @return true if an ordered broadcast was sent; false if waiting for more message segments
     */
    // MTK-START
    // Modification for sub class
    protected boolean processMessagePart(InboundSmsTracker tracker) {
...
        // +Clown@20140217, Sprint Reassemble SMS may had duplicate fragment in raw table
        // we need delete the raw table by id for avoid the duplicate one be deleted.
        boolean isSprintReassembleSms = bundle.getBoolean("isSprintReassembleSms");
        long[] ids = new long[messageCount];
        //huangchunmao  end
        if (messageCount == 1) {
            // single-part message
            pdus = new byte[][]{tracker.getPdu()};
            block = BlockChecker.isBlocked(mContext, tracker.getDisplayAddress(), null);
        } else {
        ...
        if (block) {
            deleteFromRawTable(tracker.getDeleteWhere(), tracker.getDeleteWhereArgs(),
                    DELETE_PERMANENTLY);
            return false;
        }

Provider

privider 的apk源码在:packages/providers/BlockedNumberProvider/;文件结构很简单

src/
└── com
    └── android
        └── providers
            └── blockednumber
                ├── BlockedNumberBackupAgent.java
                ├── BlockedNumberDatabaseHelper.java
                ├── BlockedNumberProvider.java
                └── Utils.java

你可能感兴趣的:(编程,android)