Explorar el Código

增加wifi连接和断开的通知

JianXin hace 1 año
padre
commit
b9c20bf6cc

+ 2 - 0
android/app/build.gradle

@@ -27,6 +27,7 @@ apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"
 
 android {
     compileSdkVersion flutter.compileSdkVersion
+//    compileSdkVersion 28
     ndkVersion flutter.ndkVersion
 
     compileOptions {
@@ -41,6 +42,7 @@ android {
         // For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration.
         minSdkVersion flutter.minSdkVersion
         targetSdkVersion flutter.targetSdkVersion
+//        targetSdkVersion 28
         versionCode flutterVersionCode.toInteger()
         versionName flutterVersionName
     }

+ 2 - 0
android/app/src/main/AndroidManifest.xml

@@ -5,6 +5,8 @@
     <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
     <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
     <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"/>
+    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
+    <uses-permission android:name="android.permission.WRITE_SETTINGS" />
 
     <application
         android:label="FX430 WIFI测试"

+ 53 - 15
android/app/src/main/java/com/example/smartledz_wifi_test/MainActivity.java

@@ -6,6 +6,8 @@ import android.content.Context;
 import android.content.Intent;
 import android.content.IntentFilter;
 import android.content.pm.PackageManager;
+import android.net.ConnectivityManager;
+import android.net.NetworkInfo;
 import android.net.wifi.ScanResult;
 import android.net.wifi.WifiManager;
 import android.os.Build;
@@ -36,17 +38,22 @@ public class MainActivity extends FlutterActivity {
 
 
     public static WifiManager wifiManager;
+    public static ConnectivityManager connectivityManager;
 
     private static final int PERMISSIONS_REQUEST_CODE = 1;
     private BroadcastReceiver wifiScanReceiver;
 
+    private BroadcastReceiver netWorkChangeReceiver;
+
     @Override
     protected void onCreate(@Nullable Bundle savedInstanceState) {
         wifiManager = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE);
+        connectivityManager = (ConnectivityManager) getApplicationContext().getSystemService(Context.CONNECTIVITY_SERVICE);
         // 检查并请求定位权限
         checkAndRequestPermissions();
         // 注册Wi-Fi扫描广播接收器
         registerWifiScanReceiver();
+        registerNetWorkChangeReceiver();
         // 检查并启用Wi-Fi
         if (!wifiManager.isWifiEnabled()) {
             wifiManager.setWifiEnabled(true);
@@ -54,18 +61,12 @@ public class MainActivity extends FlutterActivity {
         super.onCreate(savedInstanceState);
     }
 
-    private BroadcastReceiver mReceiver =new BroadcastReceiver() {
-        @Override
-        public void onReceive(Context context, Intent intent) {
-            if (intent.getAction().equals(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)) {
-                List<ScanResult> results = wifiManager.getScanResults();
-                if (results !=null) {
-                    System.out.println("results size");
-                    System.out.println(results.size());
-                }
-            }
-        }
-    };
+    @Override
+    protected void onDestroy() {
+        super.onDestroy();
+        unregisterReceiver(wifiScanReceiver);
+        unregisterReceiver(netWorkChangeReceiver);
+    }
 
     @Override
     public void configureFlutterEngine(@NonNull FlutterEngine flutterEngine) {
@@ -86,9 +87,9 @@ public class MainActivity extends FlutterActivity {
 //        List<Map<String,String>> wifiList = new ArrayList<>();
         JSONObject response = new JSONObject();
         for (ScanResult scanResult : scanResults) {
-            if(!scanResult.SSID.equals("endo-lighting")){
-                continue;
-            }
+             if(!scanResult.SSID.equals("endo-lighting")){
+                 continue;
+             }
             try {
                 response.put("cmd","scanResult");
                 response.put("ssid",scanResult.SSID);
@@ -130,4 +131,41 @@ public class MainActivity extends FlutterActivity {
         registerReceiver(wifiScanReceiver, intentFilter);
     }
 
+    private void registerNetWorkChangeReceiver(){
+        netWorkChangeReceiver = new BroadcastReceiver() {
+            @Override
+            public void onReceive(Context context, Intent intent) {
+                if (intent.getAction().equals(WifiManager.NETWORK_STATE_CHANGED_ACTION)) {
+                    NetworkInfo networkInfo = intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO);
+                    if (networkInfo != null && networkInfo.isConnected()) {
+                        if(networkInfo.isConnected()){
+                            System.out.println("wifi成功连接");
+                            // Wi-Fi连接成功
+                            JSONObject response = new JSONObject();
+                            try {
+                                response.put("cmd","connected");
+                            } catch (JSONException e) {
+                                throw new RuntimeException(e);
+                            }
+                            EventChannelPlugin.getInstance().sendEventData(response.toString());
+                        } else if (!networkInfo.isConnected()) {
+                            System.out.println("wifi断开");
+                            // Wi-Fi连接成功
+                            JSONObject response = new JSONObject();
+                            try {
+                                response.put("cmd","disconnect");
+                            } catch (JSONException e) {
+                                throw new RuntimeException(e);
+                            }
+                            EventChannelPlugin.getInstance().sendEventData(response.toString());
+                        }
+                    }
+                }
+            }
+        };
+        IntentFilter intentFilter = new IntentFilter();
+        intentFilter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);
+        registerReceiver(netWorkChangeReceiver, intentFilter);
+    }
+
 }

+ 72 - 7
android/app/src/main/java/com/example/smartledz_wifi_test/plugin/WifiPlugin.java

@@ -1,13 +1,25 @@
 package com.example.smartledz_wifi_test.plugin;
 
 
+import android.net.ConnectivityManager;
+import android.net.MacAddress;
+import android.net.Network;
+import android.net.NetworkCapabilities;
+import android.net.NetworkRequest;
 import android.net.wifi.WifiConfiguration;
+import android.net.wifi.WifiNetworkSpecifier;
+import android.net.wifi.WifiNetworkSuggestion;
+import android.os.Build;
 
 import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
 
 
 import com.example.smartledz_wifi_test.MainActivity;
 
+import java.util.ArrayList;
+import java.util.List;
+
 import io.flutter.embedding.engine.plugins.FlutterPlugin;
 import io.flutter.plugin.common.MethodChannel;
 
@@ -61,14 +73,67 @@ public class WifiPlugin implements FlutterPlugin {
 
     // 连接wifi
     private void connect(String ssid, String bssid, String pwd) {
-        WifiConfiguration wifiConfig = new WifiConfiguration();
-        wifiConfig.SSID = "\"" + ssid + "\"";
-        wifiConfig.BSSID = bssid;
-        wifiConfig.preSharedKey = "\"" + pwd + "\"";
-        int networkId = MainActivity.wifiManager.addNetwork(wifiConfig);
+
+//        System.out.printf("ssid  = %s",ssid);
+//        System.out.printf("pwd  = %s",pwd);
+//        WifiConfiguration wifiConfig = new WifiConfiguration();
+//        wifiConfig.SSID = "\"" + ssid + "\"";
+////        wifiConfig.BSSID = bssid;
+//        wifiConfig.preSharedKey = "\"" + pwd + "\"";
+//        int networkId = MainActivity.wifiManager.addNetwork(wifiConfig);
+//        MainActivity.wifiManager.disconnect();
+//        boolean b = MainActivity.wifiManager.enableNetwork(networkId, true);
+//        System.out.println("连接结果");
+//        System.out.println(b);
+//        MainActivity.wifiManager.reconnect();
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
+            connectByNewVer(ssid, bssid, pwd);
+        } else {
+            connectByOldVer(ssid, bssid, pwd);
+        }
+    }
+
+    /**
+     * Android 10 以上使用
+     *
+     **/
+    @RequiresApi(api = Build.VERSION_CODES.Q)
+    private void connectByNewVer(String ssid, String bssid, String pwd) {
+        WifiNetworkSpecifier wifiNetworkSpecifier = new WifiNetworkSpecifier.Builder()
+                .setSsid(ssid)
+                .setBssid(MacAddress.fromString(bssid))
+                .setWpa2Passphrase(pwd)
+                .build();
+        NetworkRequest networkRequest = new NetworkRequest.Builder()
+                .addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
+                .setNetworkSpecifier(wifiNetworkSpecifier)
+                .build();
+            // step3-连接wifi
+        MainActivity.connectivityManager.requestNetwork(networkRequest, new ConnectivityManager.NetworkCallback());
+    }
+
+    /**
+    * Android 10 以下使用
+    *
+    **/
+    private void connectByOldVer(String ssid, String bssid, String pwd){
+        WifiConfiguration config = new WifiConfiguration();
+        config.SSID = "\"" + ssid + "\"";
+//        config.BSSID = bssid;
+        config.preSharedKey = "\"" + pwd + "\"";
+        config.hiddenSSID = true;
+        config.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN);
+        config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);
+        config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
+        config.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP);
+        config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
+        config.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);
+        config.status = WifiConfiguration.Status.ENABLED;
+        int netId =  MainActivity.wifiManager.addNetwork(config);
         MainActivity.wifiManager.disconnect();
-        MainActivity.wifiManager.enableNetwork(networkId, true);
-        MainActivity.wifiManager.reconnect();
+        boolean isSuccess = MainActivity.wifiManager.enableNetwork(netId, true);
+        System.out.println("Android 10 以下连接 ----> ");
+        System.out.println(isSuccess);
     }
 
 }

+ 0 - 8
lib/plugin/wifi_plugin.dart

@@ -1,18 +1,10 @@
 
 import 'package:flutter/services.dart';
-import 'package:permission_handler/permission_handler.dart';
 
 class WiFiPlugin {
 
     static const MethodChannel _channel = MethodChannel("com.vanstone.WifiPlugin");
 
-    static Future<bool> requestPermissions() async {
-      bool locationGranted = await Permission.location.request().isGranted;
-      bool wifiGranted = await Permission.manageExternalStorage.request().isGranted;
-      bool storeGranted = await Permission.storage.request().isGranted;
-      return locationGranted && wifiGranted && storeGranted;
-    }
-
 
     // 扫描wifi
     static Future<void> startScan() async {

+ 0 - 49
pubspec.lock

@@ -131,54 +131,6 @@ packages:
       url: "https://pub.flutter-io.cn"
     source: hosted
     version: "1.8.2"
-  permission_handler:
-    dependency: "direct main"
-    description:
-      name: permission_handler
-      sha256: "1b6b3e73f0bcbc856548bbdfb1c33084a401c4f143e220629a9055233d76c331"
-      url: "https://pub.flutter-io.cn"
-    source: hosted
-    version: "10.3.0"
-  permission_handler_android:
-    dependency: transitive
-    description:
-      name: permission_handler_android
-      sha256: "8f6a95ccbca13766882f95d32684d7c9bfe6c45650c32bedba948ef1c6a4ddf7"
-      url: "https://pub.flutter-io.cn"
-    source: hosted
-    version: "10.2.3"
-  permission_handler_apple:
-    dependency: transitive
-    description:
-      name: permission_handler_apple
-      sha256: "08dcb6ce628ac0b257e429944b4c652c2a4e6af725bdf12b498daa2c6b2b1edb"
-      url: "https://pub.flutter-io.cn"
-    source: hosted
-    version: "9.1.0"
-  permission_handler_platform_interface:
-    dependency: transitive
-    description:
-      name: permission_handler_platform_interface
-      sha256: de20a5c3269229c1ae2e5a6b822f6cb59578b23e8255c93fbeebfc82116e6b11
-      url: "https://pub.flutter-io.cn"
-    source: hosted
-    version: "3.10.0"
-  permission_handler_windows:
-    dependency: transitive
-    description:
-      name: permission_handler_windows
-      sha256: f67cab14b4328574938ecea2db3475dad7af7ead6afab6338772c5f88963e38b
-      url: "https://pub.flutter-io.cn"
-    source: hosted
-    version: "0.1.2"
-  plugin_platform_interface:
-    dependency: transitive
-    description:
-      name: plugin_platform_interface
-      sha256: "6a2128648c854906c53fa8e33986fc0247a1116122f9534dd20e3ab9e16a32bc"
-      url: "https://pub.flutter-io.cn"
-    source: hosted
-    version: "2.1.4"
   sky_engine:
     dependency: transitive
     description: flutter
@@ -242,4 +194,3 @@ packages:
     version: "2.1.4"
 sdks:
   dart: ">=2.19.5 <3.0.0"
-  flutter: ">=2.8.0"

+ 0 - 1
pubspec.yaml

@@ -35,7 +35,6 @@ dependencies:
   # The following adds the Cupertino Icons font to your application.
   # Use with the CupertinoIcons class for iOS style icons.
   cupertino_icons: ^1.0.2
-  permission_handler: ^10.3.0
   flutter_screenutil: ^5.7.0
 
 dev_dependencies: