Android 1.5 的APN设定与上网处理

来源:互联网 发布:上海市数据服务网 编辑:程序博客网 时间:2024/05/03 03:23
手机上网分为wap和net两种方式,使用net手机就会直接连入互联网,而使用wap则会中间多了一个代理网关,移动联通均是10.0.0.172,端口80。而写与联网有关的代码,wap和net是不一样的:

    wap一般是这样:

    

view plainprint?
  1. URL url = new URL("http://10.0.0.172:80/index.htm");  
  2.   
  3. HttpURLConnection hc = (HttpURLConnection) url.openConnection();  
  4.   
  5. hc.setRequestProperty("X-Online-Host""www.csdn.net");  

    net一般是这样:

   

view plainprint?
  1. URL url = new URL("http://www.csdn.net/index.htm");  
  2. HttpURLConnection hc = (HttpURLConnection) url.openConnection();  

 

    因此,编写程序时就要检测当前的APN类型,判断是wap还是net方式,有时候可能还要修改当前的APN,都是要解决的问题。

 

    检查当前APN:

    获取所有的APN,方法是通过ContentResolver,uri地址为"content://telephony/carriers"。代码如下:

   

view plainprint?
  1. Uri uri = Uri.parse("content://telephony/carriers");   
  2. Cursor cr = getContentResolver().query(uri, nullnullnullnull);     
  3. while(cr!=null && cr.moveToNext()){   
  4.     // APN id  
  5.     String id = cr.getString(cr.getColumnIndex("_id"));    
  6.     // APN name   
  7.     String apn = cr.getString(cr.getColumnIndex("apn"));  
  8.     // do other things...  
  9. }  

    里面的 _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>
             <longname="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 plainprint?
  1. Uri uri = Uri.parse("content://telephony/carriers/preferapn");   
  2. ContentResolver resolver = getContentResolver();  
  3. ContentValues values = new ContentValues();  
  4. values.put("apn_id", id);  
  5. resolver.update(uri, values, nullnull);  
    这里面的id就是对应数据库里面的_id字段了。至于如何取到net的APN,我看获取所有的APN里面current为1的然后自己判断了,要不自己新建一个apn也行。
    至于哪些apn的current为1,应该是系统判断国家码和网络码,也就是MCC和MNC,和当前网络符合的才让它显示出来。(源代码懒的看,太多了)

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 生地会考考了140怎么办 数学成绩考砸了怎么办? 考砸了家长发火怎么办 大型考试考砸了怎么办 能力考试考砸了怎么办 考砸了老师批评怎么办 英语抽测考砸了老师怎么办? 辅导班学生考砸了老师怎么办 好学生考砸了怎么办? 孩子学习不认真马虎怎么办 孩子做作业不认真马虎怎么办 一年级小孩学习不认真怎么办 孩子做题审题不认真怎么办 初二孩子不认真审题怎么办 孩子总是粗心抄错题看错题怎么办 孩子总马虎我要怎么办 年检标志跟车牌号不一样怎么办 纹完身后喝酒了怎么办 孩子学习态度不端正怎么办 孩子高考三模考差了家长怎么办 一年级学生学习马虎大意怎么办 一年级下册孩子做作业马虎怎么办 一年级孩子做题马虎怎么办 四年级小孩不喜欢数学该怎么办 工作出了大错误怎么办 遇到不讲道理的人怎么办 四岁宝宝爱生闷气怎么办 一岁宝宝没耐心怎么办 孩子挑食 幼儿园老师该怎么办 小孩被惯的无法无天怎么办 高中的儿子不写作业怎么办 儿子总是不写作业怎么办 长鸡眼脚背肿了怎么办 脚上反复长鸡眼怎么办 脚底长鸡眼很痒怎么办 小脚趾上长鸡眼怎么办 6岁宝宝不爱学习怎么办 上班站久了腿肿怎么办 站时间长了腿肿怎么办 孩子做作业老是粗心大意怎么办 高中孩子没学习兴趣怎么办