7.腾讯微博Android客户端开发——自动获取验证码(1)
在進行正題之前,我們先來做一個簡單的實驗。下面是我編寫的一個簡單的測試網頁,其中包含兩個鏈接,第一個鏈接比較容易理解,點擊后跳轉到百度,第二個鏈接如果在我們的PC瀏覽器點擊肯定會提示找不到網頁,但是放在Android系統中呢?下面我們來進行測試。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><html> <head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /><title>Untitled</title> </head> <style> body {font-size: 20px;font-weight: bold;color: #0000FF; } </style> <body><a href="http://www.baidu.com">百度一下</a><br><br> <a href="android://MainActivity?id=coolszy">啟動Android</a></body> </html>創建一個Android項目,其中MainActivity界面如下:
?同時“打開”按鈕進行如下操作:
btnOpen=(Button)findViewById(R.id.btnOpen); btnOpen.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v){//測試網頁地址Uri uri = Uri.parse("http://192.168.1.100:8080/index.htm"); Intent intent = new Intent(Intent.ACTION_VIEW, uri);startActivity(intent);} });運行模擬器。點擊“打開”按鈕,點擊“啟動Android”鏈接并沒有任何效果,在Logcat下輸出如下錯誤信息:
android://MainActivity?id=coolszy The protocol is not supported.提示我們的android協議不支持。熟悉<intent-filter>的朋友應該知道?<action>,?<category>,,和<data>?這幾個元素,通過配置這幾個元素我們可以隱性的啟動Activity,在這里我們可以通過配置這三個元素讓我們的瀏覽器支持android協議,在MainActivity的 <intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /> </intent-filter>
下再添加一個<intent-filter>:
<intent-filter><action android:name="android.intent.action.VIEW" /><category android:name="android.intent.category.DEFAULT" /><category android:name="android.intent.category.BROWSABLE" /><data android:scheme="android" android:host="MainActivity" /> </intent-filter>添加完畢后當我們再次運行模擬器。點擊“打開”按鈕,點擊“啟動Android”鏈接后我們發現我們的又回到了MainActivity,注意我們是通過瀏覽器啟動Activity。下面我們需要處理的就是獲取請求的路徑,也就是?android://MainActivity?id=coolszy。這時我們可以復寫Activity種的onNewIntent()方法,不熟悉的朋友可以百度了解該方法。我們都知道Activity之間信息的傳遞時通過Intent對象,因此通過該方法中的Intent對象,我們可以獲得請求的路徑,最終獲得請求的參數信息:
@Override protected void onNewIntent(Intent intent) {Uri uri = intent.getData();if (null!=uri){String url = uri.toString();Log.i(TAG, url);int index = url.lastIndexOf("=");if (index!=-1){etParams.setText(url.substring(index+1));}}super.onNewIntent(intent); }注:如果想讓該方法執行,我們需修改AndroidManifest.xml文件中MainActivity的配置,添加android:lauchMode屬性:
<activity android:name=".MainActivity"android:label="@string/app_name"android:launchMode="singleTask">此時當我們再次運行模擬器。點擊“打開”按鈕,點擊“啟動Android”鏈接后我們發現我們的回到了MainActivity上,同時也得到了參數。
我們在總結下這個實驗:這個實驗的主要目的是學習如何從瀏覽器種啟動一個Activity,首先我們要給相關的Activity添加一個<intent-filter>,其次通過復寫onNewIntent()方法得到返回信息,如果想要被onNewIntent()調用,我們還行給其Activity添加一個android:lauchMode屬性。
下面我們回歸到本次主題,在OAuth認證第一步種有個oauth_callback參數,作用是認證成功后瀏覽器會被重定向到這個url中,如果我們url設置為http://www.baidu.com,則會定位到http://www.baidu.com,同樣,如果我們把url設置為android://MainActivity,則會定位到android://MainActivity上,如果Activity再加上<intent-filter>,這時MainActivity就可以自動獲取到驗證碼,而不需要我們手動的輸入。
首先,設置我們的oauth_callback參數:
params.add(new Parameter("oauth_callback", encode("android://MainActivity")));注:android://MainActivity之所以使用encode()是應為我在測試時發現當我們傳遞的url包含有“:”、“//”等符號會返回401錯誤,因此在這里進行encode()。
其次,修改AndroidManifest.xml文件中MainActivity配置:
<activity android:name=".MainActivity"android:label="@string/app_name"android:launchMode="singleTask"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter><intent-filter><action android:name="android.intent.action.VIEW" /><category android:name="android.intent.category.DEFAULT" /><category android:name="android.intent.category.BROWSABLE" /><data android:scheme="android" android:host="MainActivity" /> </intent-filter> </activity>同時給復寫MainActivity的onNewIntent()方法,用于接收傳遞過來的參數信息:
@Overrideprotected void onNewIntent(Intent intent){super.onNewIntent(intent);Uri uri = intent.getData();String url = uri.toString();Log.i(TAG, url);int index = url.lastIndexOf("=");if (index!=-1){txtVerifier.setText(url.substring(index+1));}}至此我們的程序就能自動的獲取驗證碼,而不需要用戶手動的輸入。
?
課程下載地址:http://u.115.com/file/dn43kklr
文檔下載地址:http://download.csdn.net/source/3430433
源碼下載地址:http://u.115.com/file/aq2vc8m4
總結
以上是生活随笔為你收集整理的7.腾讯微博Android客户端开发——自动获取验证码(1)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux下查看网络设备类型
- 下一篇: Android P update_eng