編輯:Android開發教程
課題:
編寫一個Android應用,訪問一個基於Http服務的數據服務系統,為了提高安全性,該數據服務系統采用了Http Digest認證體系,理由是,相比基本認證方式而言,Digest認證可以保證認證信息(用戶名和密碼)的傳輸安全,同時比SSL簡單易用。在使用浏覽器訪問時,會提示一個用戶名和密碼對話框,但如果是程序訪問,就需要在程序訪問過程中編程提供認證信息。
要求:
-- 在程序中可以設置用戶名和密碼
-- 可以通過網絡訪問基於Digest認證和Http數據服務(JSON格式)
-- 使用Android基本庫,不使用其他擴展庫(基於兼容性考慮)
-- 支持Android2.2以上系統
-- 技術實現簡單清晰
實現:
網絡上提供的一些解決方案都有一些問題,如需要使用第三方的類庫,創建認證器,手工設置請求參數等等,都比較麻煩,而且問題很多,經過摸索,我在程序中實現了基於Android標准庫的認證過程,實現思路、過程和示例代碼如下:
基礎邏輯是:
--- 使用HttpClient(DefaultHttpClient)類連接服務器並獲取數據
DefualtHttpClient 類:創建client對象
excuete(HttpGet)方法:執行連接和獲取,參數是一個HttpGet對象
HttpGet類:基於url創建HttpGet對象
HttpResponse類: execute的返回值
getEntiry().getContent() 方法:獲取數據流
--- 該client訪問需要認證的資源需要一個認證方法,就需要設置一個認證提供者
client的 setCredentialsProvider(bcp) 方法:設置認證提供者
BasicCredentialsProvider 類:創建認證提供者實例
setCredentials 方法:設置AuthScope和UsernamePasswordCredentials類
AuthScope類:認證范圍,基於主機,端口和領域構建
UsernamePasswordCredentials:基於用戶名和口令的證書,基於用戶名和口令構建
實現代碼如下:
// 1. 獲取並設置url地址,一個字符串變量,一個URL對象
String urlStr ="http://<host>:<port>/data.json";
URL url= new URL(urlStr);
// 2. 創建一個密碼證書,(UsernamePasswordCredentials類)
String username="foo";
String password="bar";
UsernamePasswordCredentials upc = new UsernamePasswordCredentials(username, password);
// 3. 設置認證范圍 (AuthScore類)
String strRealm = "<mydomain>";
String strHost = url.getHost();
int iPort = url.getPort();
AuthScope as = new AuthScope(strHost, iPort, strRealm);
// 4. 創建認證提供者(BasicCredentials類) ,基於as和upc
BasicCredentialsProvider bcp=new BasicCredentialsProvider();
bcp.setCredentials(as, upc);
// 5. 創建Http客戶端(DefaultHttpClient類)
DefaultHttpClient client=new DefaultHttpClient();
// 6. 為此客戶端設置認證提供者
client.setCredentialsProvider(bcp);
// 7. 創建一個get 方法(HttpGet類),基於所訪問的url地址
HttpGet hg= new HttpGet(urlStr);
// 8. 執行get方法並返回 response
HttpResponse hr = client.execute(hg);
// 9. 從response中取回數據,使用InputStreamReader讀取Response的Entity:
String line=null;
StringBuilder builder = new StringBuilder();
BufferedReader reader = new BufferedReader(new InputStreamReader(hr.getEntity().getContent() ));
while((line = reader.readLine()) != null) builder.append(line);
strContent=builder.toString();
總結
--- 對比Java中的實現,可以看到Andriod中的apache.http庫和commons-httpclient庫有比較大的結構和實現上的差異,這個原因導致了基於Java的實現不能直接移植到Android上。
--- 上述的實現簡單、邏輯清楚而容易理解,並且不涉及到更復雜的Digest認證的技術細節,而是由CredentialsProvider封裝了。
--- 上述實現沒有使用通常的connection類,而是client類,提供更豐富的連接和狀態控制功能,相比較而言,connection更加簡單
--- 用戶名和密碼作為認證框架中的參數而不是http request的組成部分,更加安全
--- 這裡沒有討論服務器端的實現,實際上我是通過Rails來實現http digest的。但理論上這種認證方式是標准。
查看本欄目更多精彩內容:http://www.bianceng.cn/OS/extra/
Android app性能測試總結(持續更新中)1.性能測試的幾個指標:
默認情況下,一個activity占據整個屏幕。然而,可以為一個activity設置一個“對話框”主題,這樣, 它就能像一個浮動的對話框顯示出來了。
Android系統自帶一個GridView和Gallery兩個控件,GridView網格顯示,Gallery單個浏覽,兩者結合起來可以真正實現 Gallery浏覽圖片效果
根據最近洩露的一份代碼顯示,最新的Android 4.3果凍豆系統將會支持應用和小部件根據使用頻率次數排序,而不僅僅是目前默認采用的根據字母順序排序。Myce網站首先在谷