Android 紧急电话号码规则

在Android系统中,为了满足紧急情况下用户能够快速拨打紧急电话,系统会将一些常见的紧急电话号码进行匹配识别。

紧急电话号码匹配规则通常包括以下几个方面:

  1. 国际通用紧急电话号码:包括112、911等。

  2. 国家或地区的紧急电话号码:Android系统会根据设备的地理位置自动匹配该地区的紧急电话号码,例如中国大陆的紧急电话号码为110和120。

  3. 自定义紧急电话号码:用户可以在设置中自定义一些特定的紧急电话号码,系统会将这些号码进行匹配。

紧急电话号码匹配规则的目的是为了方便用户在紧急情况下能够快速拨打紧急电话,提高用户的安全性和便利性。

为了防止恶意拨打紧急电话号码,系统也对拨打紧急号码进行了限制,如果一个号码被判定为紧急号码,那么除了系统应用或默认电话应用外,其他三方应用都不可以直接使用 Intent.ACTION_CALL 方式拨号呼叫。

java 复制代码
//packages/services/Telecomm/src/com/android/server/telecom/NewOutgoingCallIntentBroadcaster.java
    public CallDisposition evaluateCall() {
... ...
        if (Intent.ACTION_CALL.equals(action)) {
//这是三方APP可以直接使用的普通拨号广播,会判断号码isPotentialEmergencyNumber以及mIsDefaultOrSystemPhoneApp
            if (isPotentialEmergencyNumber) {
                if (!mIsDefaultOrSystemPhoneApp) {
                    Log.w(this, "Cannot call potential emergency number %s with CALL Intent %s "
                            + "unless caller is system or default dialer.", number, intent);
                    launchSystemDialer(intent.getData());
                    result.disconnectCause = DisconnectCause.OUTGOING_CANCELED;
                    return result;
                } else {
                    result.callImmediately = true;
                    result.requestRedirection = false;
                }
            }
        }

国内紧急号码默认实际获取有

000 08 110 112 118 119 120 122 911 999 #911 *911

其他的也可以自定义设置。

java 复制代码
//frameworks/opt/telephony/src/java/com/android/internal/telephony/emergency/EmergencyNumberTracker.java

    public boolean isEmergencyNumber(String number, boolean exactMatch) {
        if (number == null) {
            return false;
        }
        number = PhoneNumberUtils.stripSeparators(number);
        if (!mEmergencyNumberListFromRadio.isEmpty()) {
            for (EmergencyNumber num : mEmergencyNumberList) {
                // According to com.android.i18n.phonenumbers.ShortNumberInfo, in
                // these countries, if extra digits are added to an emergency number,
                // it no longer connects to the emergency service.
                if (mCountryIso.equals("br") || mCountryIso.equals("cl")
                        || mCountryIso.equals("ni")) {
                    exactMatch = true;
                } else {
                    exactMatch = false || exactMatch;
                }
                if (exactMatch) {
                    if (num.getNumber().equals(number)) {
                        return true;
                    }
                } else {
//这里判断是否有和紧急号码相同开头的,如果普通号码以110之类开头会被误判
                    if (number.startsWith(num.getNumber())) {
                        return true;
                    }
                }
            }
            return false;
        } else {
            return isEmergencyNumberFromEccList(number, exactMatch)
                    || isEmergencyNumberFromDatabase(number) || isEmergencyNumberForTest(number);
        }
    }
相关推荐
tangweiguo0305198715 分钟前
Android Kotlin ViewModel 错误处理:最佳 Toast 提示方案详解
android·kotlin
火柴就是我35 分钟前
android 基于 PhotoEditor 这个库 开发类似于dlabel的功能_2
android
每次的天空1 小时前
Android学习总结之Java篇(一)
android·java·学习
8931519602 小时前
Android开发Glide做毛玻璃效果
android·glide·android开发·android教程·glide做毛玻璃效果
whysqwhw3 小时前
DRouter代码走读
android
人生游戏牛马NPC1号4 小时前
学习Android(五)玩安卓项目实战
android·kotlin
前行的小黑炭5 小时前
Android Lifecycle代码分析:为什么使用;注解的方式为什么过期?源码分析;状态与事件
android
和煦的春风5 小时前
案例分析 | SurfaceFlinger 大片Runnable引起的卡顿
android·linux
浩宇软件开发6 小时前
Android开发,实现一个简约又好看的登录页
android·java·android studio·android开发
未扬帆的小船6 小时前
在gpt的帮助下安装chales的证书,用于https在root情况下抓包
android·charles