基於安卓9的wifi自動連線和校園網自動連線程式
阿新 • • 發佈:2022-04-10
實現目的,我校校園網需要先開啟wlan在選擇連線到指定wifi,然後會彈出一個認證介面,輸入賬號密碼才可登入,於是自然而然的想能不能完成自動處理,做到一鍵登入,於是寫了這個程式。
開啟該程式後能自開啟wlan,掃描周圍的wifi,根據ssid找到要連線的wifi,自動嘗試連線,連線後get請求認證頁面來認證。
注意安卓10以上無法執行(因為我手機是安卓9,以此來開發的,然後發現這些元件後面被棄用了,因此程式碼基本也只是自用,賬號密碼在程式碼裡面寫死了)
MainActivity
package com.example.http; import androidx.appcompat.app.AppCompatActivity;import androidx.core.app.ActivityCompat; import android.app.Activity; import android.content.pm.PackageManager; import android.net.wifi.ScanResult; import android.net.wifi.WifiConfiguration; import android.net.wifi.WifiInfo; import android.net.wifi.WifiManager; import android.os.Bundle; import android.util.Log;import android.view.View; import java.io.IOException; import java.util.List; import okhttp3.Call; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.Response; public class MainActivity extends AppCompatActivity { WifiManager wifiManager; List<ScanResult> scanResult; List<WifiConfiguration> wifiConfiguration; String ip; private OkHttpClient okHttpClient; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); okHttpClient = new OkHttpClient(); connectedWifi(this); WifiInfo wifiInfo = wifiManager.getConnectionInfo(); int ipAddress = wifiInfo.getIpAddress(); ip = intToIp(ipAddress); } public void no(View view) { new Thread() { @Override public void run() { Request myre = new Request.Builder().url("登出的get url").build(); Log.e("TEST", "no"); Call call = okHttpClient.newCall(myre); try { Response response = call.execute(); Log.e("TEST", response.body().string()); } catch (IOException e) { e.printStackTrace(); } } }.start(); } public void get(View view) { new Thread() { @Override public void run() { Request myre = new Request.Builder().url("登入的get url").build(); Log.e("TEST", "get"); Call call = okHttpClient.newCall(myre); try { Response response = call.execute(); Log.e("TEST", response.body().string()); } catch (IOException e) { e.printStackTrace(); } } }.start(); } private void connectedWifi(MainActivity context) { String[] permission = new String[]{ "ACCESS_FINE_LOCATION" ,"ACCESS_COARSE_LOCATION" }; Permissions.checkPermission(this , permission); wifiManager = (WifiManager) context.getSystemService(WIFI_SERVICE); int wifiId; openWifi();
Log.e("TEST","ok"); while (!wifiManager.isWifiEnabled()) //等待到WiFi開了 { Log.e("TEST","a");} if (wifiManager.isWifiEnabled()) { wifiManager.startScan(); scanResult = wifiManager.getScanResults(); Log.e("TEST", "掃描出的熱點數量:" + String.valueOf(scanResult.size())); wifiConfiguration = wifiManager.getConfiguredNetworks(); //得到配置好的網路列表 if ((wifiId = isConfiguration("\"NTU\"")) == -1) { Log.i("Debug", "需要新增配置"); //加入了密碼 wifiId = addWifiConfig(scanResult, "NTU",""); } else Log.i("Debug", "不需要新增"); if (wifiId != -1) { if(connectWifi(wifiId)){ Log.i("Debug","連線成功!"); } else { Log.i("Debug","連線失敗!"); } } } else{ Log.i("Debug","未開啟wifi"); } } /** * 開啟Wifi */ private boolean openWifi() { if (!wifiManager.isWifiEnabled()) { return wifiManager.setWifiEnabled(true); } else if(wifiManager.isWifiEnabled()){ return true; } else{ return false; } } /** * 判斷是否需要新增配置 */ private int isConfiguration(String SSID) { for (int i = 0; i < wifiConfiguration.size(); i++) { Log.i("Debug", "配置中的wifi列表:"+wifiConfiguration.get(i).SSID); Log.e("Debug", String.valueOf(wifiConfiguration.get(i).networkId)+" "+wifiConfiguration.get(i).SSID); if (wifiConfiguration.get(i).SSID.equals(SSID)) { return wifiConfiguration.get(i).networkId; } } return -1; } private boolean connectWifi(int wifiId) { Log.e("Debug", String.valueOf(wifiId)); Log.e("Debug", "新增成功"); boolean flag; Log.i("Debug","wifiConfiguration的數量:"+String.valueOf(wifiConfiguration.size())); flag=wifiManager.enableNetwork(wifiId,false); Log.e("Debug", String.valueOf(flag)); return flag; } /** * 新增配置 */ private int addWifiConfig(List<ScanResult> scanResult, String ssid,String pass) { int wifiId = -1; Log.i("Debug", "掃描出的熱點數量:"+scanResult.size()+" 需要新增的熱點"+ssid); for (int i = 0; i < scanResult.size(); i++) { ScanResult wifi = scanResult.get(i); Log.i("Debug", "掃描出的wifi列表:"+wifi.SSID); if (wifi.SSID.equals(ssid)) { Log.i("Debug", "準備新增"); WifiConfiguration wifiConfig = new WifiConfiguration(); wifiConfig.SSID = "\"" + wifi.SSID + "\""; //需要用雙引號括起來 //加入了密碼 wifiConfig.hiddenSSID = false; wifiConfig.status = WifiConfiguration. Status.ENABLED; wifiConfig.preSharedKey = null; wifiConfig.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE); wifiId = wifiManager.addNetwork(wifiConfig); Log.e("D1ebug", String.valueOf(wifiId)); if (wifiId != -1) { Log.e("Debug", "新增成功"+wifiId); return wifiId; } } } return wifiId; } private static class Permissions { public static void checkPermission(Activity activity , String[] permission){ String[] noPermission = new String[permission.length]; int j = 0 ; for (int i = 0; i < permission.length; i++) { if (activity.checkSelfPermission(permission[i]) == PackageManager.PERMISSION_DENIED){ if (permission[i] != null){ requestPermisson(new String[]{permission[i]} , activity ); } } } } private static void requestPermisson(String[] s , Activity activity) { ActivityCompat.requestPermissions(activity , s , 100); } } private String intToIp(int i) { return (i & 0xFF ) + "." + ((i >> 8 ) & 0xFF) + "." + ((i >> 16 ) & 0xFF) + "." + ( i >> 24 & 0xFF) ; } }
activity_main
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity" android:orientation="vertical"> <Button android:layout_height="wrap_content" android:layout_width="match_parent" android:text="連線" android:onClick="get" tools:ignore="OnClick"/> <Button android:layout_height="wrap_content" android:layout_width="match_parent" android:text="登出" android:onClick="no" tools:ignore="OnClick"/> </LinearLayout>
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.http"> <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:networkSecurityConfig="@xml/net_sc" android:theme="@style/Theme.Http"> <meta-data android:name="com.google.android.actions" android:resource="@xml/net_sc" /> <activity android:name=".MainActivity" android:exported="true"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
net_sc.xml
<?xml version="1.0" encoding="utf-8"?> <network-security-config> <base-config cleartextTrafficPermitted="true" /> </network-security-config>
核心程式碼如上,其餘的如匯入包啥的不贅述了。
注意由於需要掃描wifi需要開啟手機定位功能,並且給該程式位置許可權。
演示視訊:https://www.bilibili.com/video/BV1iT4y1Y7KS