Android 1.5 的APN设定与上网处理

本文详细介绍了手机上网的两种方式:wap和net的区别,并提供了如何通过编程检测当前APN类型及判断wap或net的方法。此外,还介绍了如何通过ContentResolver获取和修改当前APN设置。

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

手机上网分为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.youkuaiyun.com");
URL url = new URL("http://10.0.0.172:80/index.htm");

HttpURLConnection hc = (HttpURLConnection) url.openConnection();

hc.setRequestProperty("X-Online-Host", "www.youkuaiyun.com");

net一般是这样:

view plaincopy to clipboardprint?
URL url = new URL("http://www.youkuaiyun.com/index.htm");
HttpURLConnection hc = (HttpURLConnection) url.openConnection();
URL url = new URL("http://www.youkuaiyun.com/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...
}
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);
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,和当前网络符合的才让它显示出来。(源代码懒的看,太多了)


本文来自优快云博客,转载请标明出处:http://blog.youkuaiyun.com/liujian885/archive/2010/06/08/5656350.aspx

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值