Android 1.5 的APN設定與上網處理 – Android移動開發技術文章_手機開發 Android移動開發教學課程

手機上網分為wap和net兩種方式,使用net手機就會直接連入互聯網,而使用wap則會中間多瞭一個代理網關,移動聯通均是10.0.0.172,端口80。而寫與聯網有關的代碼,wap和net是不一樣的:

    wap一般是這樣:

    [java] 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"); 
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一般是這樣:

    [java] URL url = new URL("http://www.csdn.net/index.htm"); 
HttpURLConnection hc = (HttpURLConnection) url.openConnection(); 
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"。代碼如下:

    [java] 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再試試。
    [java] 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,和當前網絡符合的才讓它顯示出來。(源代碼懶的看,太多瞭)

作者 liujian885

發佈留言