nor current process has android.permission.WRITE_APN_SETTINGS Proxy andriod,代理上網,wap網絡請求問題

很多朋友,在使用android做網絡請求時,會遇上一個問題,當用戶使用的是wap網絡時,則需要爲網絡請求頭加上代理地理和端口號。

而使用wifi或者cmnet網絡連接時,不用設置代理地址和端口號。很多朋友在網上找到解決辦法,是通過讀取數據庫,如:

Cursor cursor = contentResolver.query(Uri.parse("content://telephony/carriers/preferapn")
, apnInfo, null, null, null); 

然後就讀取數據庫裏面的數據,爲表頭進行設置

然後就用

HttpHost httpHost = new HttpHost(proxy, port, "http");
httpClient.getParams().setParameter("http.route.default-proxy", httpHost);

類似這樣的代碼來添加網絡請求代理。


但是讀者朋友使用以上的代碼進行設置代理請求,你會遇上不少麻煩,就是在android4.0以上的系統上,只要你使用網絡請求就必崩,並且錯誤提示爲

nor current process has android.permission.WRITE_APN_SETTINGS。

當你碰上這樣的問題後,你豪不猶豫的就爲系統添加<User-permision android.permission.WRITE_APN_SETTINGS />

可是你發現,問題依然出現。

  有很多朋友對這樣的解決辦法有很多,正如下述:

第一個方法簡單點,不過需要在Android系統源碼的環境下用make來編譯:

        1. 在應用程序的AndroidManifest.xml中的manifest節點中加入android:sharedUserId="android.uid.system"這個屬性。

        2. 修改Android.mk文件,加入LOCAL_CERTIFICATE := platform這一行

        3. 使用mm命令來編譯,生成的apk就有修改系統時間的權限了。

第二個方法麻煩點,不過不用開虛擬機跑到源碼環境下用make來編譯:

        1. 同上,加入android:sharedUserId="android.uid.system"這個屬性。

        2. 使用eclipse編譯出apk文件,但是這個apk文件是不能用的。

        3. 用壓縮軟件打開apk文件,刪掉META-INF目錄下的CERT.SF和CERT.RSA兩個文件。

        4. 使用目標系統的platform密鑰來重新給apk文件簽名。這步比較麻煩,首先找到密鑰文件,在我的Android源碼目錄中的位置 是"build\target\product\security",下面的platform.pk8和platform.x509.pem兩個文件。然 後用Android提供的Signapk工具來簽名,signapk的源代碼是在"build\tools\signapk"下,用法爲java -jar signapk.jar platform.x509.pem platform.pk8 ***.apk ***_signed.apk 得到具有對應權限的APK.

工具和密鑰下載地址:http://download.csdn.net/detail/bulkin/4329253

==******************************************=====以上代碼對應用開發者來說太過於複雜了,根本不適用做應用開發的開發者,我剛開始用這個的時候,直接把我逼風了。

其實解決 上述的問題很簡單,主要是想獲取當前網絡是否爲wap請求,如果是wap請求,則獲取到當前wap請求的ip地址和port就可以了。而上述的解決 辦法都是獲取wap的端口號和地址 。那我們有沒有 其它的辦法獲取到這個內容呢。答案當然是有的,並且特別簡單,還不需要這麼複雜的操作數據庫和權限限制。

獲取當前連接代理地址和端口號代碼如下:

	String proxy=Proxy.getDefaultHost();
	int port = Proxy.getDefaultPort() == -1 ? 80 : Proxy.getDefaultPort();
接下來我們只要判斷proxy是否爲空就可以了,對於是否爲wap請求,android有接口:

如下所示:

NetworkInfo networkInfo = ((ConnectivityManager) context  
				.getApplicationContext().getSystemService("connectivity"))  
				.getActiveNetworkInfo();  
public boolean isWapNetwork() {  
		//return this.mUseWap;  
		
		 if (networkInfo!=null && networkInfo.getType() == 0) {//0表示是wap請求,你可以去檢查一下0表示的是哪個宏
			 return true;
		 }else{
			 return false;
		 }
	} 


if(isWapNetwork){//注意,is
if (proxy !=null) {
HttpHost httpHost = new HttpHost(proxy, port, "http");
httpClient.getParams().setParameter("http.route.default-proxy", httpHost);
} else {
httpClient.getParams().removeParameter("http.route.default-proxy");
}
//HttpHost host=new HttpHost(proxy,port);
//request.getParams().setParameter(ConnRouteParams.DEFAULT_PROXY, host);
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章