Android Apn相关整理

本文详细解析了Android系统中APN设置的权限控制机制,包括ContentProvider的实现方式及不同版本间的权限变化。介绍了从Android 4.0开始对第三方应用修改APN设置的限制,并探讨了部分设备上存在的特殊行为。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

android手机修改当前Apn接入点信息,主要涉及源码目录/packages/providers/TelephonyProvider,其中涉及到apn的是TelephonyProvider.java,它是一个ContentProvider,关联的数据库名为:telephony.db

其中提供的uri有

s_urlMatcher.addURI("telephony", "carriers", URL_TELEPHONY);
        s_urlMatcher.addURI("telephony", "carriers/current", URL_CURRENT);
        s_urlMatcher.addURI("telephony", "carriers/#", URL_ID);
        s_urlMatcher.addURI("telephony", "carriers/restore", URL_RESTOREAPN);
        s_urlMatcher.addURI("telephony", "carriers/preferapn", URL_PREFERAPN);

对于该db的操作中,查询不需要权限,其他操作需要权限:

1.查询

@Override
    public Cursor query(Uri url, String[] projectionIn, String selection,
            String[] selectionArgs, String sort) {
        SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
        qb.setTables("carriers");

        int match = s_urlMatcher.match(url);
        switch (match) {
            // do nothing
            case URL_TELEPHONY: {
                break;
            }


            case URL_CURRENT: {
                qb.appendWhere("current IS NOT NULL");
                // do not ignore the selection since MMS may use it.
                //selection = null;
                break;
            }

            case URL_ID: {
                qb.appendWhere("_id = " + url.getPathSegments().get(1));
                break;
            }

            case URL_PREFERAPN: {
                qb.appendWhere("_id = " + getPreferredApnId());
                break;
            }

            default: {
                return null;
            }
        }

        SQLiteDatabase db = mOpenHelper.getReadableDatabase();
        Cursor ret = qb.query(db, projectionIn, selection, selectionArgs, null, null, sort);
        ret.setNotificationUri(getContext().getContentResolver(), url);
        return ret;
    }

2.插入

  @Override
    public Uri insert(Uri url, ContentValues initialValues)
    {
        Uri result = null;

        checkPermission();

        SQLiteDatabase db = mOpenHelper.getWritableDatabase();
        int match = s_urlMatcher.match(url);
        boolean notify = false;
        switch (match)
        {
.
....

3.删除

  @Override
    public int delete(Uri url, String where, String[] whereArgs)
    {
        int count;

        checkPermission();

        SQLiteDatabase db = mOpenHelper.getWritableDatabase();
        int match = s_urlMatcher.match(url);
        switch (match)
        {
            case URL_TELEPHONY:
            {   
.....

4.更新

  @Override
    public int update(Uri url, ContentValues values, String where, String[] whereArgs)
    {
        int count = 0;

        checkPermission();

        SQLiteDatabase db = mOpenHelper.getWritableDatabase();
        int match = s_urlMatcher.match(url);
        switch (match)
        {
            case URL_TELEPHONY:
            {
              
......

其中上述操作中checkPermission();就是权限检测

  private void checkPermission() {
        // Check the permissions
        getContext().enforceCallingOrSelfPermission("android.permission.WRITE_APN_SETTINGS",
                "No permission to write APN settings");
    }



目前android手机存在以下情况:

1.虽然从一开始,android就说明不允许第三方程序WRITE_APN_SETTINGS,



但事实上是从android 4.0开始,才屏蔽了<uses-permission android:name="android.permission.WRITE_APN_SETTINGS">权限,换句话说即使配置了该权限,程序也不会按照预期完成对应的功能。(经过测试2.x可以正确使用该权限完成相应apn修改操作,不会产生异常,1.x因为几乎看不到,所以未做测试)。在4.x手机上将会产生如下异常:



在手机未root的情况下,目前第三方应用(非system/app下面,不具有系统签名的)将无法直接修改Apn设置信息。注意这里即使手机root之后,通过常规的方法进行apn修改的操作也是会抛出该异常。这里我使用了小米1(4.1),步步高x-play(4.2.2),小米2(4.1),三星GTS752I(4.04),其中三星是已root。上述手机都抛出了该异常。但在测试过程中,测试了一款华为手机(c8815 已root),能够正确的执行apn操作,具体原因尚不明确,初步猜测是华为在这方面做了一些改动,例如没有进行权限检查。当然可能也有其他的方式,但尚未可知。此外不排除因为android自身漏洞而存在能修改Apn信息又不会异常的可能。


~~~~~~~~~~~~~~~~~~~~~~~~~~

其他备注:

用户通过setting程序

1.填写错误的apn参数,当apn类型为default时,也能够正常连接外网。此时连接的网络类型为mobile。

2.apn填写正确的apn(我这里填写的cmsip,cmsip是中国移动提供的一条内网网络,需要手机号开通才能使用),类型为default时,若手机卡开通了cmsip,则手机可以连接通内网(外网不通,即没法登陆使用QQ等一切使用公网网络的程序),若手机卡未开通,此时手机也能正常连接外网(无法连接内网)连接的网络类型为mobile.

<think>好的,我现在需要帮助用户了解物联网卡APN的配置和使用方法。首先,我得确认用户的需求是什么。根据用户的问题,他们想知道如何配置物联网卡的APN以及相关的使用教程。用户还提供了三个引用资料,我需要结合这些资料来生成回答。 首先,我需要回忆一下物联网卡的基本概念。物联网卡是用于物联网设备的SIM卡,通常用于数据传输,而不是普通的手机通信。根据引用[1]和[2],物联网卡在Android设备上默认无法使用,必须配置APN。而手机SIM卡插入后可以直接使用,这说明物联网卡可能需要特定的APN设置才能接入网络。 接下来,我需要整理APN配置的步骤。根据引用[1],配置APN需要进入Android的设置,找到移动网络设置,添加新的APN,填写名称、APN、MNC等信息,保存并选择该APN,然后重启设备。不同运营商可能有不同的参数,比如移动、联通、电信各自的APN设置不同,引用[2]提到这一点,但用户提供的引用中没有具体参数,可能需要进一步查阅资料。不过引用[1]中给出移动的APN是CMIOT,MNC是08,这可能是一个例子。 然后,使用教程方面,引用[3]提到在Linux系统中配置eth1网卡获取IP地址的方法,使用udhcpc命令。这可能涉及到物联网设备在嵌入式系统上的配置,比如树莓派或Linux网关设备。这部分需要解释如何通过命令行配置网络,确保网卡获得IP地址,从而能够上网。 用户的问题可能涉及不同设备,比如Android手机和嵌入式设备,所以需要分情况说明。同时,需要注意APN参数的正确性,不同运营商可能有不同的APN名称,比如移动的CMNET、联通的3GNET、电信的CTNET,或者物联网专用的APN如CMIOT。引用[1]中的例子是CMIOT,而引用[2]提到APN是必须设置的参数。 现在需要确保步骤清晰,结构分明。可能的结构是分为Android配置和Linux配置两部分。Android部分详细说明每一步操作,包括路径、参数填写;Linux部分说明如何通过命令行工具配置网络,引用[3]中的udhcpc命令。 另外,需要注意常见问题,比如APN保存后无法选择,可能需要重启设备;参数填写错误导致无法联网,需要检查APN和MNC等是否正确。引用[1]中提到了重启机器,引用[3]中的udhcpc命令可能需要权限或者特定工具。 最后,生成相关问题,可能涉及不同操作系统的配置、参数获取途径、无法联网的排查步骤等。 现在需要检查是否有遗漏的信息,比如APN的具体参数是否完整,是否需要用户名和密码。根据引用[1]和[2],可能有些APN需要额外的信息,但用户提供的引用中没有提到,可能需要假设这些字段留空,或者根据运营商要求填写。 总结步骤: 1. Android配置APN:设置-移动网络-APN-新建,填写名称、APN、MNC等,保存并选择,重启。 2. Linux设备配置:检查网卡,使用udhcpc获取IP,配置路由。 3. 常见问题:APN无法选择需重启,参数错误需检查,运营商不同参数不同。</think>### 物联网卡APN配置及使用教程 #### 一、Android设备配置APN 1. **进入APN设置界面** - 打开设置 → 移动网络/蜂窝网络 → 接入点名称(APN) - 点击右上角“+”或“新建APN”[^1][^2] 2. **填写APN参数** - **名称**:自定义(如“IoT-Card”) - **APN**:根据运营商类型填写(移动:`CMIOT`;联通:`UNIM2M.NJM2MAPN`;电信:`CTNET`) - **MNC**:移动填写`08`,联通填写`01`,电信填写`11`(部分设备需与MCC配合使用) - 其他字段(用户名/密码)通常留空 3. **保存并应用配置** - 保存后返回APN列表,选择新建的APN - 重启设备使配置生效 #### 二、Linux设备配置网络 1. **检查网卡状态** ```bash ifconfig -a # 查看网卡名称(如eth1) ``` 2. **动态获取IP地址** ```bash udhcpc -i eth1 # 使用DHCP客户端获取IP[^3] ``` 3. **验证网络连通性** ```bash ping 8.8.8.8 # 测试外网连接 ``` #### 三、常见问题与注意事项 - **APN无法选择**:重启设备后重试 - **参数错误**:联系运营商确认APN、MNC等参数 - **多运营商差异**: - 移动物联网卡APN通常为`CMIOT` - 联通需区分省份(如江苏为`UNIM2M.NJM2MAPN`) - 电信常用`CTNET`[^2] ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值