Android添加并设置APN

原文转载自:

https://blog.csdn.net/Anmmei/article/details/77461530 

==========照例先说废话,很久不写blog了,本人实际已一度退出码农生涯。转行通信去了。通信虽然没啥钱,但是做后台朝九晚五双休,半梦半醒干活,这才是生活啊。。。。感觉非常适合我这种大龄佛系青年。然而人算不如天算,一场疫情导致迟迟无法复工。人在杭州,房租贼贵,一天天的烧钱包,看着兜里不多的钱,其实有点坐不住,顶着疫情回家,然后年初正彷徨,打算省内继续干通信,未料前公司的合作公司的老板打电话让我去他厂里干活,横竖一时没通信的活可以干,所以继续入坑码农,以上。

最近有需求添加并设置APN。照例百度,找到一篇比较好的,就是上文地址。本人略微改进如下

package com.XXX你懂的;

import android.content.ContentResolver;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
import android.telephony.TelephonyManager;
import android.util.Log;

public class APNUtli {
    public static Uri APN_URI = Uri.parse("content://telephony/carriers");
    public static Uri CURRENT_APN_URI = Uri.parse("content://telephony/carriers/preferapn");

    public static int addAPN(Context context, String apn) {
        int id = -1;
        String NUMERIC = getSIMInfo(context);
        if (NUMERIC == null) {
            return -1;
        }

        ContentResolver resolver = context.getContentResolver();
        ContentValues values = new ContentValues();
        values.put("name", apn);                                  //apn中文描述
        values.put("apn", apn);                                     //apn名称
        values.put("type", "default");                            //apn类型
        values.put("numeric", NUMERIC);
        values.put("mcc", NUMERIC.substring(0, 3));
        values.put("mnc", NUMERIC.substring(3, NUMERIC.length()));
        values.put("proxy", "");                                        //代理
        values.put("port", "");                                         //端口
        values.put("mmsproxy", "");                                     //彩信代理
        values.put("mmsport", "");                                      //彩信端口
        values.put("user", "");                                         //用户名
        values.put("server", "");                                       //服务器
        values.put("password", "");                                     //密码
        values.put("mmsc", "");                                          //MMSC
        Cursor c = null;
        Uri newRow = resolver.insert(APN_URI, values);
        if (newRow != null) {
            c = resolver.query(newRow, null, null, null, null);
            int idIndex = c.getColumnIndex("_id");
            c.moveToFirst();
            id = c.getShort(idIndex);
        }
        if (c != null)
            c.close();
        return id;
    }

    public static String getSIMInfo(Context context) {
        TelephonyManager iPhoneManager = (TelephonyManager)context
                .getSystemService(Context.TELEPHONY_SERVICE);
                return iPhoneManager.getSimOperator();
    }

    // 设置接入点
    public static void setAPN(Context context, int id) {
        ContentResolver resolver = context.getContentResolver();
        ContentValues values = new ContentValues();
        values.put("apn_id", id);
        resolver.update(CURRENT_APN_URI, values, null, null);
    }

    public static int getAPN(Context context, String apn){
        ContentResolver resolver = context.getContentResolver();
        String apn_condition = String.format("apn like '%%%s%%'", apn);
        Cursor c = resolver.query(APN_URI, null, apn_condition, null, null);

        // 该项APN存在
        if (c != null && c.moveToNext()) {
            int id = c.getShort(c.getColumnIndex("_id"));
            String name1 = c.getString(c.getColumnIndex("name"));
            String apn1 = c.getString(c.getColumnIndex("apn"));

            Log.e("APN has exist", id + name1 + apn1);
            return id;
        }

        return -1;
    }
}

用法如下:

        String apn_name = "testapn567";
        int apn_id = APNUtli.getAPN( ZTLHelperService.this, apn_name);
        if(apn_id == -1){
            apn_id = APNUtli.addAPN( ZTLHelperService.this, apn_name );
            if( apn_id == -1){
                Log.e(TAG, "设置APN失败");
            }
        }

        if( apn_id != -1){
            APNUtli.setAPN(ZTLHelperService.this, apn_id);
        }

再次感谢文首楼主不吝分享。本人略作修改,方便有缘人。最近踩坑有点多,网上文章千篇一律。纯转载的事还是少做,起码得有点干货吧。

<think>好的,我需要帮助用户在RK3568平台的Android 11上找到添加设置APN的API方法。首先,我需要回顾一下Android系统中APN设置的相关知识。APN(接入点名称)是设备连接到移动网络所需的配置信息,通常涉及数据库和ContentProvider的操作。 在Android中,APN信息存储在telephony数据库中,访问这些数据需要特定的权限。用户可能需要使用ContentResolver来操作apn表。不过,直接修改APN可能需要系统权限或签名级别的权限,因为普通应用无法修改这些设置。根据用户提供的引用[1],看起来他们之前处理过跳转到设置界面的Intent,比如移动网络设置。但用户现在需要的是通过API进行设置,而不是通过界面。 接下来,我需要考虑RK3568平台的特殊性。引用[3]提到在RK3568的硬件相关代码中,有关于rild(Radio Interface Layer Daemon)的库路径和参数的设置。这可能意味着在修改APN时,需要确保RILD正确配置,以便与基带通信。不过,APN设置通常是在上层处理,可能不直接涉及RILD的配置。 用户可能需要创建一个具有系统权限的应用,或者修改系统代码来添加API。根据Android的版本差异,Android 11APN的管理可能有变化,需要确认是否仍然使用Telephony.Carriers类。通常,添加APN的步骤包括: 1. 检查写入APN的权限,可能需要系统签名或特权权限。 2. 使用ContentResolver插入新的APN条目到Telephony.Carriers表中。 3. 确保插入的APN字段正确,如name、apn、type、mcc、mnc等。 4. 可能需要设置为默认APN,这涉及更新数据库中的selected字段。 引用[2]提到了平台签名相关的文件,这可能意味着用户的应用需要平台签名才能获得必要的权限。引用[4]涉及启动动画,可能与当前问题无关。 需要验证在Android 11中,插入APN的方法是否仍然有效。查阅Android官方文档,发现从Android 10开始,对APN的写入权限更加严格,只有系统应用或具有Carrier Privileges的应用才能修改APN。因此,用户可能需要将应用作为系统应用安装,或者使用系统API。 可能的代码步骤包括使用ContentValues插入新的APN条目,然后通过TelephonyManager设置默认APN。同时,需要在AndroidManifest.xml中添加必要的权限,如WRITE_APN_SETTINGS,但该权限可能只对系统应用有效。 另外,用户可能需要通过Settings.Global类设置特定的属性,或者使用隐藏的API,这需要反射或者访问@SystemApi注解的方法。但使用隐藏API可能有兼容性问题,尤其是在不同设备上。 总结步骤: - 创建具有系统权限的应用。 - 使用ContentResolver插入APN。 - 处理权限问题,可能需要平台签名。 - 验证APN配置是否生效,可能需要重启或重新注册网络。 还需要考虑RK3568的具体实现,是否有自定义的Telephony设置,可能需要查阅厂商提供的文档或代码示例。例如,检查是否有特定的系统属性或配置需要调整,如引用[3]中提到的LIB_PATH_PROPERTY,但可能不直接相关。 最后,生成相关问题,帮助用户深入理解APN设置的各个方面。</think>### RK3568 Android 11 设置APN的API实现方法 #### 1. **权限与系统要求** - **系统权限**:修改APN需要应用具备`WRITE_APN_SETTINGS`权限(需系统签名或特权应用)[^1]。 - **AndroidManifest配置**: ```xml <uses-permission android:name="android.permission.WRITE_APN_SETTINGS" /> ``` #### 2. **APN数据库操作** APN信息存储在`content://telephony/carriers`中,通过`ContentResolver`操作: ```java ContentValues values = new ContentValues(); values.put("name", "My APN"); values.put("apn", "internet.example.com"); values.put("mcc", "310"); // 美国MCC values.put("mnc", "260"); // 美国MNC values.put("type", "default,supl"); ContentResolver resolver = context.getContentResolver(); Uri uri = resolver.insert(Uri.parse("content://telephony/carriers"), values); ``` #### 3. **设为默认APN** 需更新`carriers`表的`apn_id`字段(需系统权限): ```java if (uri != null) { long apnId = ContentUris.parseId(uri); TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); tm.setPreferredApn(apnId); // 需要系统权限或反射调用[^2] } ``` #### 4. **RK3568平台适配** - **系统签名**:应用需使用平台签名(如`platform.x509.pem`)。 - **RILD配置**:确保`rild.libpath`和`rild.libargs`属性正确指向基带库(参考`rild.c`中的定义)[^3]。 #### 5. **完整代码示例** ```java public class ApnManager { public static boolean addApn(Context context, String name, String apn, String mcc, String mnc) { try { ContentValues cv = new ContentValues(); cv.put("name", name); cv.put("apn", apn); cv.put("mcc", mcc); cv.put("mnc", mnc); cv.put("type", "default,supl"); Uri newUri = context.getContentResolver().insert( Uri.parse("content://telephony/carriers"), cv ); return newUri != null; } catch (Exception e) { Log.e("APN", "Insert failed: " + e.getMessage()); return false; } } } ``` #### 6. **验证与调试** - **查看APN列表**:通过`adb shell`执行`content query --uri content://telephony/carriers`。 - **网络重置**:修改APN后可能需要重启或调用`TelephonyManager.reloadCarriers()`(需系统权限)。 --- ###
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值