【问题标题】:MissingPluginException in my flutter code - NetworkInfo().getLocationServiceAuthorization()我的颤动代码中的 MissingPluginException - NetworkInfo().getLocationServiceAuthorization()
【发布时间】:2021-08-30 16:43:59
【问题描述】:

我写了一个类来处理网络连接。 我需要,因为我的应用只能在特定环境中运行,所以我想检查 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;
  }
}

【问题讨论】:

    标签: flutter android-wifi connectivity flutter-packages missing-features


    【解决方案1】:

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-11
      • 1970-01-01
      • 2018-10-30
      • 2020-08-18
      • 2021-07-19
      • 1970-01-01
      • 1970-01-01
      • 2021-11-19
      相关资源
      最近更新 更多