1. 程式人生 > 其它 >基於安卓9的wifi自動連線和校園網自動連線程式

基於安卓9的wifi自動連線和校園網自動連線程式

實現目的,我校校園網需要先開啟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