Flutter-geolocator: 許可のクラッシュが拒否されました

作成日 2018年12月13日  ·  7コメント  ·  ソース: Baseflow/flutter-geolocator

🐛バグレポート

ロケーション権限を許可している間は正常に機能していますが、ロケーション権限を拒否している間、次のエラーが発生します。

Dartエラー:未処理の例外:
PlatformException(PERMISSION_DENIED、位置データへのアクセスが拒否されました、null)

0 Geolocator._handleInvalidPermissions(package:geolocator / geolocator.dart:197:7)

1 Geolocator.getCurrentPosition(package:geolocator / geolocator.dart:106:7)

2 SignupScreenPageState._submitAction(package:locum_mate / Screens / signup.dart:126:10)

3SignupScreenPageState.buildWidget。(package:locum_mate / Screens / signup.dart:261:31)

4 _InkResponseState._handleTap(package:flutter / src / material / ink_well.dart:507:14)

5_InkResponseState.build。(package:flutter / src / material / ink_well.dart:562:30)

6 GestureRecognizer.invokeCallback(package:flutter / src / gestures / recognizer.dart:102:24)

7 TapGestureRecognizer._checkUp(package:flutter / src / gestures / tap.dart:242:9)

8 TapGestureRecognizer.handlePrimaryPointer( package:flutter <…>

予想される行動

期待動作は私にnull応答を与えるはずです。そうすれば、さらに先に進むことができます。

複製手順

pubspec.yamlにpubをインポートします

ボタンタップイベントに次のコードを書き込む
試す {
位置position = await Geolocator()
.getCurrentPosition(desiredAccuracy:LocationAccuracy.high);
} catch(e){
print(e);
}

エラーが発生します。

構成

バージョン: 1.0.1

[✓]フラッター(チャンネルマスター、v1.0.1-pre.2、Mac OS X 10.14 18A384a、ロケールen-GB)
[✓] Androidツールチェーン-Androidデバイス用に開発(Android SDK 28.0.3)
[✓] iOSツールチェーン-iOSデバイス用に開発(Xcode 10.1)
[✓] Android Studio(バージョン3.2)
[✓] VS Code(バージョン1.29.1)
[✓]接続されたデバイス(1つ利用可能)

•問題は見つかりませんでした。

プラットホーム:

  • [x]:iphone:iOS
  • []:robot:Android

最も参考になるコメント

@ YogeshLegendkiller@ kaumudpa@ jaumardが提供する

別のアプローチは、 checkGeolocationPermissionStatusメソッドを使用し、 getCurrentPositiongetLastKnownPositionまたはgetPositionStream呼び出す前に、ステータスがPermissionStatus.grantedに設定されていることを確認することです。 getPositionStreamメソッド。 ただし、これは、自分でアクセス許可を要求するように注意する必要があることを意味します。 例えば:

Geolocator geolocator = Geolocator();
GeolocationStatus status = await geolocator.checkGeolocationPermissionStatus();
if (status == GeolocationStatus.granted) {
    Position position = await geolocator.getCurrentPosition();
}

全てのコメント7件

これを処理する方法を解決しましたか

これに対する回避策はありますか?

@YogeshLegendkiller @kaumudpa回避策が必要な場合は、呼び出しをキャッチして、PlatformExceptionでnullを返します。

@ YogeshLegendkiller@ kaumudpa@ jaumardが提供する

別のアプローチは、 checkGeolocationPermissionStatusメソッドを使用し、 getCurrentPositiongetLastKnownPositionまたはgetPositionStream呼び出す前に、ステータスがPermissionStatus.grantedに設定されていることを確認することです。 getPositionStreamメソッド。 ただし、これは、自分でアクセス許可を要求するように注意する必要があることを意味します。 例えば:

Geolocator geolocator = Geolocator();
GeolocationStatus status = await geolocator.checkGeolocationPermissionStatus();
if (status == GeolocationStatus.granted) {
    Position position = await geolocator.getCurrentPosition();
}

許可を求める方法は?

@ abdullah4oneあなたはpermission_handlerを使用し

import 'package:permission_handler/permission_handler.dart';

Map<PermissionGroup, PermissionStatus> permissions = await PermissionHandler().requestPermissions([PermissionGroup.location]);

返信が遅れる可能性がありますが、アプリがiOSで許可を求めておらず、Androidでも完全に正常に機能しているという同じ問題に直面していました。

許可を求められなかったため、許可コードがiOSで機能しませんでした。 手動で許可を求めるために使用できる「location_permissions」という名前のパッケージを見つけました。

手順は次のとおりです

  1. この依存関係を「pubspec.yaml」に「location_permissions:3.0.0 +1」を追加します。 私はフラッター1.22.0でそれを行ったので、フラッター2.0ではこれが問題になる可能性があることに注意してください。
  2. パッケージをファイルにインポートします

    import'package :location_permissions / location_permissions.dart ';

  3. 許可を求めるページに次のコードを追加します。 (アプリの最初のページに追加することをお勧めします。)

     <strong i="16">@override</strong>
      void initState() {
       ....
      if (Platform.isIOS) {
        location_permission();
      }
      ....
    

    }

  4. 同じファイルに次の2つのメソッドを追加します

    void location_permission()async {
    最終的なPermissionStatusパーミッション= await _getLocationPermission();
    if(permission == PermissionStatus.granted){
    最終位置= geolocator.getCurrentPosition(を待つ
    DesiredAccuracy:LocationAccuracy.best);

      // Use the position to do whatever...
    }
    

    }

    未来_getLocationPermission()async {
    最終的なPermissionStatusパーミッション= LocationPermissions()を待つ
    .checkPermissionStatus(level:LocationPermissionLevel.location);

    if (permission != PermissionStatus.granted) {
      final PermissionStatus permissionStatus = await LocationPermissions()
          .requestPermissions(
              permissionLevel: LocationPermissionLevel.location);
    
      return permissionStatus;
    } else {
      return permission;
    }
    

    }

これで、iOSアプリに場所の許可を求めるポップアップが表示されるはずです。

このページは役に立ちましたか?
0 / 5 - 0 評価