zoukankan      html  css  js  c++  java
  • apn设置。转

       手机上网分为wap和net两种方式,使用net手机就会直接连入互联网,而使用wap则会中间多了一个代理网关,移动联通均是10.0.0.172,端口80。而写与联网有关的代码,wap和net是不一样的:

        wap一般是这样:

        

    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一般是这样:

       

    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"。代码如下:

       

    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>
                  <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再试试。
       
    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,和当前网络符合的才让它显示出来。(源代码懒的看,太多了)
  • 相关阅读:
    ant 软件包不存在报错
    在 Internet Explorer 中使用 Windows 窗体控件
    智能客户端
    Back to the Future with Smart Clients
    "Automation 服务器不能创建对象" 的解决方案
    Top 10 Reasons for Developers to Create Smart Clients
    Updater Application Block for .NET
    Smart Client Application Model and the .NET Framework 1.1
    Security and Versioning Models in the Windows Forms Engine Help You Create and Deploy Smart Clients
    智能客户端技术总结(二)
  • 原文地址:https://www.cnblogs.com/xitang/p/2190195.html
Copyright © 2011-2022 走看看