手机上网分为wap和net两种方式,使用net手机就会直接连入互联网,而使用wap则会中间多了一个代理网关,移动联通均是10.0.0.172,端口80。而写与联网有关的代码,wap和net是不一样的:
wap一般是这样:
view plaincopy to clipboardprint?
URL url = new URL("http://10.0.0.172:80/index.htm");
HttpURLConnection hc = (HttpURLConnection) url.openConnection();
hc.setRequestProperty("X-Online-Host", "www.csdn.net");
net一般是这样:
view plaincopy to clipboardprint?
URL url = new URL("http://www.csdn.net/index.htm");
HttpURLConnection hc = (HttpURLConnection) url.openConnection();
因此,编写程序时就要检测当前的APN类型,判断是wap还是net方式,有时候可能还要修改当前的APN,都是要解决的问题。
检查当前APN:
获取所有的APN,方法是通过ContentResolver,uri地址为"content://telephony/carriers"。代码如下:
view plaincopy to clipboardprint?
Uri uri = Uri.parse("content://telephony/carriers");
Cursor cr = getContentResolver().query(uri, null, null, null, null);
while(cr!=null && cr.moveToNext()){
// APN id
String id = cr.getString(cr.getColumnIndex("_id"));
// APN name
String apn = cr.getString(cr.getColumnIndex("apn"));
// do other things...
}
里面的 _id 和 apn 是什么?这个是系统存储apn的数据库中的字段。系统把所有的apn都保存在数据库中,数据库在:/data/data/com.android.providers.telephony/databases/telephony.db。把你的G3连上电脑,使用adb命令:
adb pull /data/data/com.android.providers.telephony/databases/telephony.db f:\
把它弄出来看看。(同目录下还有个mmssms.db,是存储短信的数据库)
里面有200多个apn,只有current为1的才会在手机的apn设置里面显示出来。数据库的各个字段对应了系统设置里面的各项。上面代码里面cr.getString(cr.getColumnIndex("_id"))就是取一个apn的_id了,同理可以取出其他需要的字段。
但是我们这些还没什么用,我们要的是当前所用的apn。
获取当前所使用的apn的uri地址为:"content://telephony/carriers/preferapn"。代码同上,替换uri后再取,发现取出来的只有一个,这个就是当前所使用的apn了,就是系统设置里面apn列表中后面那个小圆圈被选中的那个apn。
这个apn系统保存在一个xml文件里,地址为:/data/data/com.android.providers.telephony/shared_prefs/preferred-apn.xml 。同样可以取出这个文件打开看看,里面内容很简单:
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<map>
<long name="apn_id" value="218" />
</map>
就是说当前apn设定为数据库中_id为218的那个apn了。
要判断这个apn是wap还是net,最好是看proxy是不是10.0.0.172,因为apn字段是可以任意修改的,有可能用户把apn字段随便填写。
对了,关于apn的操作相关代码在android源代码的packages\providers\TelephonyProvider\src\com\android\providers\telephony\TelephonyProvider.java中,有兴趣可以看看。
修改当前APN:
接着就是修改它了。为什么要修改?有可能用户的卡只能wap上网,但是他却设定了net。程序中检测到net但无法联网,就把系统设置改为wap再试试。
view plaincopy to clipboardprint?
Uri uri = Uri.parse("content://telephony/carriers/preferapn");
ContentResolver resolver = getContentResolver();
ContentValues values = new ContentValues();
values.put("apn_id", id);
resolver.update(uri, values, null, null);
这里面的id就是对应数据库里面的_id字段了。至于如何取到net的APN,我看获取所有的APN里面current为1的然后自己判断了,要不自己新建一个apn也行。
至于哪些apn的current为1,应该是系统判断国家码和网络码,也就是MCC和MNC,和当前网络符合的才让它显示出来。(源代码懒的看,太多了)
分享到:
相关推荐
android APN开发流程
android 全面解析apn
设置android的APN配置,移动2G和联通的2G和3G网络配置,以及MMS的APN配置
Android APN开发流程分析
Android AT命令与APN开发流程分析
基于android2.2的apn开发,可以自己改写并通过第三方软件在来设置apn从而达到自己想要的结果。
android apn切换程序,支持最新版的安卓系统,绝对好用,下载下来收藏吧
android端通过代码实现apn配置,这里做一下记录,方便以后查看这部分实现内容
在HTC三星摩托手机均试验过,网上关于GPRS/3G开关的资源非常少,贴出来与到家一起学习,不好的地方请指正!
Android的数据连接是基于PPP方式的,主要步骤为:首先通过AT命令激活PDP连接,然后利用pppd通过数据端口完成拨号连接; 数据连接的核心控制类是DataConnectionTracker,存在于GSMPhone里,数据连接不需要用户的干预...
Android开发之系统信息【5】——获取APN列表Android开发之系统信息【5】——获取APN列表
在android代码中切换网络,如cmnet,cmwap
国内运营商,中国移动,联通,电信,android上网APN
android 设置apn,包括自动和手动,成熟代码
可以将Android中APN文件转化为windowphones8中的APN文件,因为APN数量过多,所以不用手动转化,方便极了。
附件为apndemo,apn.xml需放到U盘或者sd卡根目录,在有信号的时候插卡或U盘3秒后配置成功
这个是我在最近研究的android平台上消息推送的源码
中国移动上网APN设置按照以上的设置方法就可以使用 net上网,wap飞信,彩信收发 这三种功能,如果需要上飞信,那就要选择第三项的设置,才能上,如果要上网上QQ的话,那就要选择第一项的设置!!
APN的英文全称是Access Point Name,中文全称叫接入点,是您在通过手机上网时必须配置的一个参数,它决定了您的手机通过哪种接入方式来访问网络。 有时候需要修改APN的时候会发现无法更改,连常用的海卓HIAPN都无法...