原文地址:http://blog.csdn.net/liujian885/archive/2010/06/08/5656350.aspx
手機上網分爲wap和net兩種方式,使用net手機就會直接連入互聯網,而使用wap則會中間多了一個代理網關,移動聯通均是10.0.0.172,端口80。而寫與聯網有關的代碼,wap和net是不一樣的:
wap一般是這樣:
- 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一般是這樣:
- 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"。代碼如下:
- 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" ?>
- 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 );