zoukankan      html  css  js  c++  java
  • Android-操作系统拨打电话广播的处理

    Android操作系统的 packages/apps/phone/AndroidManifest.xml源码阅读

    在之前的博客,Android-隐式意图激活操作系统通话界面,讲解了,阅读Android操作系统的 packages/apps/phone/AndroidManifest.xml,是如何暴露的

    ...... 等等


     Android操作系统的 packages/apps/phone/OutgoingCallBroadcaster源码阅读

    具体很多细节想不管,因为在 Android-隐式意图激活操作系统通话界面已经介绍过了

    现在只关心 OutgoingCallBroadcaster ,OutgoingCallBroadcaster是一个没有布局的Activity,只处理业务逻辑

    OutgoingCallBroadcaster --> onCreate()

    发送了有序广播,而且明确指定了 接收者

    参数一:意图

    参数二:谁能接收我的广播(自定义权限)

    参数三:明确指定的 接收者

    参数四:null

    参数五:初始码

    参数六:初始值(拨打的号码)

    参数七:null(携带的参数)


    我的应用:

    在AndroidManifest.xml订阅(可以去接收者,专门接收Android操作系统拨号发出的广播)

    注意:⚠️ 优先级设置了 1000,此接收者最新接收到拨打电话的信息

         <!--
                订阅(Xml形式订阅接收者)
                订阅接收者:专门接收Android操作系统拨号发出的广播
    
                android.intent.action.NEW_OUTGOING_CALL 这是系统应用发送的Action
             -->
            <receiver android:name=".br.CustomCallBroadcastReceiver">
    
                <intent-filter android:priority="1000"> <!-- 优先级设置最大,我先接收(处理) -->
    
                    <action android:name="android.intent.action.NEW_OUTGOING_CALL" />
    
                </intent-filter>
    
            </receiver>

    在AndroidManifest.xml 必须设置的权限,为什么要设置此权限呢,因为 上面Android操作系统 OutgoingCallBroadcaster 的源码中 -> 参数二:指定了此权限

      <!--
            参数二:谁能接收我的广播(自定义权限) 处理外拨电话的权限
        -->
        <uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" />

    设置外拨电话,在号码前面+888888

    package liudeli.croadcast1.br;
    
    import android.content.BroadcastReceiver;
    import android.content.Context;
    import android.content.Intent;
    import android.util.Log;
    
    /**
     * 订阅接收者:专门接收Android操作系统拨号发出的广播
     * 此接收者优先级1000是最高的,最先接收,所以才有机会修改相关操作
     */
    public class CustomCallBroadcastReceiver extends BroadcastReceiver {
    
        private String TAG = "CustomCallBroadcastReceiver";
    
        @Override
        public void onReceive(Context context, Intent intent) {
            //  参数六:初始值(拨打的号码)
            String initNumberValue = getResultData();
            Log.d(TAG, "获取Android操作系统初始的值:" + initNumberValue);
    
            /**
             * 设置初始值
             */
            setResultData("888888" + initNumberValue);
        }
    }

    Log:

    12-17 21:48:02.491 2263-2263/liudeli.croadcast1 D/CustomCallBroadcastReceiver: 获取Android操作系统初始的值:15555

    效果:

     


    设置电话病毒,永远打不出电话

    package liudeli.croadcast1.br;
    
    import android.content.BroadcastReceiver;
    import android.content.Context;
    import android.content.Intent;
    import android.util.Log;
    
    /**
     * 订阅接收者:专门接收Android操作系统拨号发出的广播
     * 此接收者优先级1000是最高的,最先接收,所以才有机会修改相关操作
     */
    public class CustomCallBroadcastReceiver extends BroadcastReceiver {
    
        private String TAG = "CustomCallBroadcastReceiver";
    
        @Override
        public void onReceive(Context context, Intent intent) {
            /**
             * 无法中断广播
             * 注意:⚠️ 这是无法中断广播的,因为Android操作系统拨号是使用 有序广播(指定接收者)
             */
            // abortBroadcast();
    
            /**
             * 既然无法中断广播,我就把号码设置为null,就永远打不出去了
             */
            setResultData(null);
    
    
        }
    }


    此接收者是最先接收到拨打电话的信息的,所以此接收者还可以做很多其他的事情

  • 相关阅读:
    查看tls指纹
    并行流
    方法引入2
    方法引入
    Optional.ofNullable
    stream.filter
    stream.skip limit
    反射
    Optional orElseGet
    nginx 预压缩(gzip)
  • 原文地址:https://www.cnblogs.com/android-deli/p/10135152.html
Copyright © 2011-2022 走看看