Android 连接wifi 检测是否需要portal 认证
前言
最近在做一個新需求,就是針對開機歡迎引導頁,當連接如星巴克,KFC,地鐵上等公共場所的WIFI時,都需要認證功能,而我要調起這個認證頁面呈現給用戶,登陸任何網頁會跳轉到wifi得認證頁面,輸入賬號密碼,點擊驗證,能夠驗證wifi,并保證手機網絡能正常使用。某些手機管家軟件在手機連接上CMCC等wifi時,會彈出通知欄提示跳轉到webview去進行portal驗證。而我由于各種限制原因,并不能自動調用,就需要自己來處理這些功能了,而他們是怎樣檢測的呢?請往下看~
正文
我們的目標很明確,就是要在wifi連接后,判斷wifi是否需要portal驗證?如果需要portal驗證,那么我們直接啟動一個Activity,默認用WebView去加載一個網頁,比如:http://XXX.com,服務器就會去檢測當前網絡是否需要驗證(Google會進行一個http的訪問,如果返回碼為204,就證明手機當前連接的wifi,是不需要進行portal驗證的)portal 檢測到有新的連接,就會去劫持wifi路由,強制訪問wifi的portal驗證網頁,用戶只要完成驗證,就可以使用該網絡了,實現原理如下:
/*** 驗證當前wifi是否需要Portal驗證* @return*/ private boolean isWifiSetPortal() {String mWalledGardenUrl = "http://g.cn/generate_204";// 設置請求超時int WALLED_GARDEN_SOCKET_TIMEOUT_MS = 10000;HttpURLConnection urlConnection = null;try {URL url = new URL(mWalledGardenUrl);urlConnection = (HttpURLConnection) url.openConnection();urlConnection.setInstanceFollowRedirects(false);urlConnection.setConnectTimeout(WALLED_GARDEN_SOCKET_TIMEOUT_MS);urlConnection.setReadTimeout(WALLED_GARDEN_SOCKET_TIMEOUT_MS);urlConnection.setUseCaches(false);urlConnection.getInputStream();// 判斷返回狀態碼是否204return urlConnection.getResponseCode()!=204;} catch (IOException e) {// e.printStackTrace();return false;} finally {if (urlConnection != null) {//釋放資源urlConnection.disconnect();}}}這塊驗證一般放在網絡改變的廣播接受者里面處理的action.equals(ConnectivityManager.CONNECTIVITY_ACTION
把驗證方法封裝一下就可以判斷使用了,很簡單吧~~
package woyou.welcome.api;import android.os.AsyncTask;import java.io.IOException; import java.net.HttpURLConnection; import java.net.URL;/*** Created by Xiho on 11:09* MyBlog: xuhaoblog.com* GitHub: github.com/git-xuhao* Function:*/ public class CheckWifiLoginTask extends AsyncTask<Integer,Integer,Boolean> {private ICheckWifiCallBack mCallBack;public CheckWifiLoginTask (ICheckWifiCallBack mCallBack){super();this.mCallBack=mCallBack;}@Overrideprotected Boolean doInBackground(Integer... params) {return isWifiSetPortal();}@Overrideprotected void onPostExecute(Boolean result) {if (mCallBack != null) {mCallBack.portalNetWork(result);}}/*** 驗證當前wifi是否需要Portal驗證* @return*/private boolean isWifiSetPortal() {String mWalledGardenUrl = "http://g.cn/generate_204";// 設置請求超時int WALLED_GARDEN_SOCKET_TIMEOUT_MS = 10000;HttpURLConnection urlConnection = null;try {URL url = new URL(mWalledGardenUrl);urlConnection = (HttpURLConnection) url.openConnection();urlConnection.setInstanceFollowRedirects(false);urlConnection.setConnectTimeout(WALLED_GARDEN_SOCKET_TIMEOUT_MS);urlConnection.setReadTimeout(WALLED_GARDEN_SOCKET_TIMEOUT_MS);urlConnection.setUseCaches(false);urlConnection.getInputStream();// 判斷返回狀態碼是否是204return urlConnection.getResponseCode()!=204;} catch (IOException e) {// e.printStackTrace();return false;} finally {if (urlConnection != null) {//釋放資源urlConnection.disconnect();}}}/*** 檢測Wifi 是否需要portal 認證* @param callBack*/public static void checkWifi(ICheckWifiCallBack callBack){new CheckWifiLoginTask(callBack).execute();}public interface ICheckWifiCallBack{void portalNetWork(boolean isLogin);}}在廣播接收里判斷網絡是否需要portal認證:
/** * 接受網絡改變的廣播 */private BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {@Overridepublic void onReceive(Context mContext, Intent intent) {String action = intent.getAction();if (action.equals(ConnectivityManager.CONNECTIVITY_ACTION)) {//.....省略邏輯portalWifi();} }};/** wifi 認證 檢測 **/private void portalWifi() {CheckWifiLoginTask.checkWifi(new CheckWifiLoginTask.ICheckWifiCallBack() {@Overridepublic void portalNetWork(boolean isLogin) {//不需要wifi認證if(!isLogin){//TODO... }else {//TODO...}}});}實現原理很簡單吧~
總結
以上是生活随笔為你收集整理的Android 连接wifi 检测是否需要portal 认证的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 微信浏览器清理缓存的方法
- 下一篇: 《MLB棒球创造营》:走近棒球运动·西雅