什么是Apn

Apn,Access Point Name,接入点名称,是手机上网必须要配置的一个参数,他决定了手机通过什么方式访问哪种网络环境。对于手机用户来讲,可以访问的网络类型有英特网,WAP网络,集团企业内部网络。而WAP网络估计现在已经被遗忘的差不多了,WAP是专门针对早期性能比较差的手机设计的精简版的网络协议,看下图相信大家就会有所记忆,尤其是80,90后,随着智能手机的发展,由于WAP不能满足智能手机强大的浏览器,所以很多WAP网站陆陆续续被关停。

移动手机默认两种CMWAP和CMNET,一些使用移动办公的大客户,通常会使用专用APN,其接入点随意定义,只要和该省运营商其他APN不冲突即可。

CMWAP也叫移动梦网,通过该接入点可接入一个比较大的移动私网,网内有大量的手机应用下载及资源访问。因为CMWAP不接入互联网,只接入移动运营商的私网,所以流量费用比较低廉。

CMNET也叫GPRS连接互联网,通常每个省的运营商会提供若干个Internet出口以供CMNET拨号用户使用。其流量费用较CMWAP要高一些。

目前国内销售的手机,如果是非智能机,通常已配置好CMWAP连接,智能机通常会配置CMWAP和CMNET连接。如需手动添加这些配置,请参考手机说明书。

代码设置Apn

private Uri APN_URI = Uri.parse("content://telephony/carriers");
private Uri CURRENT_APN_URI = Uri.parse("content://telephony/carriers/preferapn");
//新增Apn节点
private int addApn(Context context, String apnName) {int id = -1;String simInfo = getSimInfo(context);Log.e("SetApnReceiver", "simInfo " + simInfo);if (TextUtils.isEmpty(simInfo)) {return -1;}ContentResolver resolver = context.getContentResolver();ContentValues values = new ContentValues();//apn中文描述values.put("name", apnName);//apn名称values.put("apn", apnName);//apn类型values.put("type", "default");values.put("numeric", simInfo);values.put("mcc", simInfo.substring(0, 3));values.put("mnc", simInfo.substring(3, 5));//代理values.put("proxy", "");//端口values.put("port", "");//彩信代理values.put("mmsproxy", "");//彩信端口values.put("mmsport", "");//用户名values.put("user", "");//服务器values.put("server", "");//密码values.put("password", "");//MMSCvalues.put("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;}
 //获取SIM卡的IMSI码,由MCC、MNC、MSIN组成//网上很多人使用的是getSimOperator()方法,但是本人使用时获取为空,//所以使用getSubscriberId()方法
@SuppressLint("MissingPermission")
public static String getSimInfo(Context context) //https://blog.csdn.net/love_xsq/article/details/50420433TelephonyManager iPhoneManager = (TelephonyManager)             context.getSystemService(Context.TELEPHONY_SERVICE);return iPhoneManager.getSubscriberId();}
// 设置接入点
public 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);}
//获取apn的id
public int getAPN(Context context, String apnName) {ContentResolver resolver = context.getContentResolver();Cursor c = resolver.query(APN_URI, new String[]{"_id", "name","apn"}, "apn like '%" + apnName + "%'", null, null);// 该项APN存在if (c != null && c.moveToNext()) {int id = c.getShort(c.getColumnIndex("_id"));String name = c.getString(c.getColumnIndex("name"));String apn = c.getString(c.getColumnIndex("apn"));Log.e("SetApnReceiver", "APN has exist " + id + name + apn);return id;} else {Log.e("SetApnReceiver", "APN has not exist ");}return -1;}
//获取当前Apn
public int getCurrentAPN(Context context) {ContentResolver resolver = context.getContentResolver();Cursor c = resolver.query(CURRENT_APN_URI, null, null, null, null);// 该项APN存在if (c != null && c.moveToNext()) {int id = c.getShort(c.getColumnIndex("_id"));String name = c.getString(c.getColumnIndex("name"));String apn = c.getString(c.getColumnIndex("apn"));String user = c.getString(c.getColumnIndex("user"));String pass = c.getString(c.getColumnIndex("password"));Log.e("SetApnReceiver", "current APN " + id + name + apn);Log.e("SetApnReceiver", "current APN " + user + pass);return id;} else {Log.e("SetApnReceiver", "current APN is null");}return -1;
}

使用如下

int id = getAPN(context, apnName);
//如果在apn列表中存在则直接设置
if (id == -1) {id = addApn(context, apnName);}setAPN(context, id);

需要开启权限

<!-- 开关APN的权限 -->
<uses-permission android:name="android.permission.WRITE_APN_SETTINGS" />

注意

1.设置Apn的对象是手机(或者其他android终端设备)系统,而不是4G卡,系统中/system/etc路径下apns-conf.xml文件记录了大量详细的国内apn节点,也就是说getAPN()方法里查询到的apn节点内容也是来自这里。

2.如果用户使用自己专用的APN节点不存在设备系统中,则手机卡插入设备中不能访问该节点网络。

3.MCC=移动国家号码,由3位数字组成,唯一地识别移动用户所属的国家,我国为460。
MNC=移动网号,一般大多由2位数字组成,中国移动的是00或02,中国联通的是01。
运营商号码就是MCC+MNC
46000, “CHINA MOBILE”, “CN” 中国移动
46001, “CHN-CUGSM”, “CN” 中国联通
46002, “CHINA MOBILE”, “CN” 中国移动

参考文献

1.https://www.cnblogs.com/hanyonglu/archive/2012/03/29/2423298.html
2.https://www.cnblogs.com/zhangkeyu/p/6647382.html
3.https://blog.csdn.net/glunoy/article/details/108535191

Android设备设置Apn相关相关推荐

  1. Android设备设置代理的两种方法

    本文将介绍两种给给android设备设置网络代理的方法,一种是直接在网络设置中操作,另一种是通过adb指令操作 第一种最常用的通过设置页面操作(此处以夜神模拟器为例讲解,其他设备操作方式基本类似) 操 ...

  2. Android代码设置APN

    转载:https://blog.csdn.net/Anmmei/article/details/77461530 亲测有效 ------ 2020.12.31. 什么是APN? APN(Access ...

  3. android apn代码详解,android 代码设置apn

    代码设置apn,上代码: public class APNActivity extends Activity { public static final Uri APN_URI = Uri.parse ...

  4. android系统之apn相关

    工作一年了,好久没来,默默地当颗小螺丝钉.今天借此机会把学习的写一下,记录下.最近工作在交接,正好总结回顾,这一年,主要和三个字母打交道A,P,N. APN概述: APN 的类型分为web(inter ...

  5. Qt Creator连接Android设备

    Qt Creator连接Android设备 连接Android设备 要求 指定Android设备设置 手动设定 查看Android工具链设置 管理Android SDK程序包 管理Android虚拟设 ...

  6. android标题栏添加按钮_如何从iPhone或Android设备访问PC

    如果您不 在家中工作 ,您仍然可以远程访问办公室中的计算机. 可以在计算机之间完成此操作,也可以使用Microsoft的 远程桌面工具 从iOS或Android设备访问远程PC. 有了它,您就可以像坐 ...

  7. android设备内部添加apn信息

    由于工作原因今天需要给多台android设备中写入某张sim卡的apn相关信息,虽然可以通过sqlite命令写sql语句来写入到设备中,但设备一多起来就太低效了,所以在学习的过程中摸索着写了一个将ap ...

  8. 设置android启动器,教程:在任意 Android 设备上安装 HTC 专属桌面启动器

    HTC 手机的标志性 Sense UI 几乎是伴随着 Android 系统成长起来的,BlinkFeed 作为 Sense 5 的新特性进入了人们的视野之中.经历了几代更新,BlinkFeed 受到更 ...

  9. apn服务器源码,android 设置apn

    [实例简介] android 设置apn,包括自动和手动,成熟代码 [实例截图] [核心代码] MyApnDemo └── MyApnDemo ├── AndroidManifest.xml ├── ...

最新文章

  1. 【引用】在Eclipse中将java Project转换成Dynamic Web Project
  2. 阿里云免费开放一切AI算力,加速新型冠状病毒新药和疫苗研发
  3. 【干货】Facebook产品经理:高效对接and流程解读
  4. 照片处理软件(iSee图片专家) 3.930 中文免费版
  5. 2016年第七届蓝桥杯 - 省赛 - C/C++大学A组 - H. 四平方和
  6. 【算法竞赛学习】气象海洋预测-Task2 数据分析
  7. WCF分布式开发常见错误(10):套接字连接中断,The socket connection was aborted
  8. do_something方法解析
  9. 老李分享云计算基本概念 2
  10. python人脸识别特征脸法_人脸识别-PCA特征脸
  11. word2vec模型原理及实现词向量训练案例
  12. 金仓数据库KingbaseES blob类型数据导入导出
  13. Python 爬取网页数据的两种方法
  14. 内存淘汰策略 删除策略
  15. 在网页中使用嵌入字体
  16. 模板引擎Beet的6大创新点
  17. 4.4 使用倾斜工具和整形工具制作图标 [Illustrator CC教程]
  18. C语言----取反~
  19. JavaScript的语法解析与抽象语法树
  20. 到底是JavaEye这边的爽啊

热门文章

  1. 驴之初体验-记休龙古道徒步之旅
  2. 6款不错的jquery画图插件
  3. 超大图片的显示:BitmapRegionDecoder 1
  4. 《机器人SLAM导航核心技术与实战》第1季:第3章_OpenCV图像处理
  5. .SCI-HUB搜索引擎(强大无比,只要有网就能下载你要的文献,无需购买数据库)http://sci-hub.tw/
  6. 安全防御 --- 防火墙高可靠技术
  7. 怎么把pdf转换成txt
  8. Excel中包含大量无尽autoshape、无尽空白单元格怎么办?
  9. C++的“友元”是否会破坏类的封装?
  10. Kubernetes集群更换证书(正常更新方法、和更新证书为99年)