0

我写了一个类来处理网络连接。我需要,因为我的应用程序只能在特定环境中运行,所以我想检查 wifi SSID。

我用这个connectivity包来检查我是否连接到 WIFI。

我想使用network_info_plus包来读取wifi SSID名称,但是它抛出了这个异常:

MissingPluginException(MissingPluginException(在通道 dev.fluttercommunity.plus/network_info 上找不到方法 getLocationServiceAuthorization 的实现))

我的代码如下:

import 'dart:async';

import 'package:network_info_plus/network_info_plus.dart' as info;
import 'package:connectivity/connectivity.dart';
import 'package:flutter/services.dart';

enum ConnectivityStatus { Connected, NotConnected }

class ConnectivityService {
  // Create our public controller
  StreamController<ConnectivityStatus> connectionStatusController =
      StreamController<ConnectivityStatus>();

  ConnectivityService() {
    // Subscribe to the connectivity Chanaged Steam
    Connectivity().onConnectivityChanged.listen((ConnectivityResult result) {
      // Use Connectivity() here to gather more info if you need t

      connectionStatusController.add(_getStatusFromResult(result));
    });
  }

  // Convert from the third part enum to our own enum
  ConnectivityStatus _getStatusFromResult(ConnectivityResult result) {
    switch (result) {
      case ConnectivityResult.mobile:
        return ConnectivityStatus.NotConnected;
      case ConnectivityResult.wifi:
        _initNetworkInfo();
        return ConnectivityStatus.Connected;
      case ConnectivityResult.none:
        return ConnectivityStatus.NotConnected;
      default:
        return ConnectivityStatus.NotConnected;
    }
  }
}

Future<String?> _initNetworkInfo() async {
  String? wifiName;
  final _networkInfo = info.NetworkInfo();

  try {
    var status = await _networkInfo.getLocationServiceAuthorization();
    if (status == info.LocationAuthorizationStatus.notDetermined) {
      status = await _networkInfo.requestLocationServiceAuthorization();
    }
    if (status == info.LocationAuthorizationStatus.authorizedAlways ||
        status == info.LocationAuthorizationStatus.authorizedWhenInUse) {
      wifiName = await _networkInfo.getWifiName();
    } else {
      wifiName = await _networkInfo.getWifiName();
    }
  } on PlatformException catch (e) {
    print(e.toString());
    wifiName = 'Failed to get Wifi Name';
  }

  return wifiName;
}

编辑:我决定创建一个类来处理 wifi 名称的检索:

...
      case ConnectivityResult.wifi:
        if (NetworkInfo().wifiName == 'WIFI_SSID_NAME') // !!! HANDLE ASYNC
          return ConnectivityStatus.Connected;
        else
          return ConnectivityStatus.NotConnected;
...

class NetworkInfo {
  String? wifiName;
  NetworkInfo() {
    _initNetworkInfo();
  }

  Future<void> _initNetworkInfo() async {
    String? wifiName;
    final _networkInfo = info.NetworkInfo();

    try {
      var status = await _networkInfo.getLocationServiceAuthorization();
      if (status == info.LocationAuthorizationStatus.notDetermined) {
        status = await _networkInfo.requestLocationServiceAuthorization();
      }
      if (status == info.LocationAuthorizationStatus.authorizedAlways ||
          status == info.LocationAuthorizationStatus.authorizedWhenInUse) {
        wifiName = await _networkInfo.getWifiName();
      } else {
        wifiName = await _networkInfo.getWifiName();
      }
    } on PlatformException catch (e) {
      print(e.toString());
      wifiName = 'Failed to get Wifi Name';
    }

    this.wifiName = wifiName;
  }
}
4

1 回答 1

0

getLocationServiceAuthorization仅适用于 iOS,因此如果您也在为 Android 编码,您应该将它们分成单独的块:

final _networkInfo = info.NetworkInfo();

try {
  //may throw on non-iOS platforms
  var status = await _networkInfo.getLocationServiceAuthorization();
  if (status == info.LocationAuthorizationStatus.notDetermined) {
    status = await _networkInfo.requestLocationServiceAuthorization();
  }
} on PlatformException catch (e) {
  print(e.toString());
  wifiName = 'Failed to verify authorization';
}

try {
  wifiName = await _networkInfo.getWifiName();
} on PlatformException catch (e) {
  print(e.toString());
  wifiName = 'Failed to get Wifi Name';
}

同样在里面/android/app/build.gradle你应该插入:

shrinkResources false
minifyEnabled false

buildTypes/release块中:

buildTypes {
    release {
        shrinkResources false
        minifyEnabled false
于 2022-01-15T03:29:37.630 回答