Android 1.5 的APN設定與上網處理

原文地址:http://blog.csdn.net/liujian885/archive/2010/06/08/5656350.aspx

 

手機上網分爲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, null null null null );     
  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, null null );  
    這裏面的id就是對應數據庫裏面的_id字段了。至於如何取到net的APN,我看獲取所有的APN裏面current爲1的然後自己判斷了,要不自己新建一個apn也行。
    至於哪些apn的current爲1,應該是系統判斷國家碼和網絡碼,也就是MCC和MNC,和當前網絡符合的才讓它顯示出來。(源代碼懶的看,太多了)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章