Flutter-geolocator: Kesalahan setelah menyetujui di iOS: PlatformException (PERMISSION_DENIED, Akses ke data lokasi ditolak, null)

Dibuat pada 30 Apr 2019  ·  12Komentar  ·  Sumber: Baseflow/flutter-geolocator

🐛 Laporan Bug

  1. Kode meminta posisi, pengguna menyetujui, kode melontarkan kesalahan:
    PlatformException (PERMISSION_DENIED, Akses ke data lokasi ditolak, null)

  2. Tetapi setelah meminta posisi untuk kedua kalinya, posisi yang benar langsung dikembalikan tanpa dialog atau kesalahan.

Perilaku yang diharapkan

Posisi dikembalikan dan tidak ada kesalahan yang terjadi saat meminta posisi dan persetujuan pengguna.

Langkah reproduksi

import 'package:geolocator/geolocator.dart';
try{
   position = await Geolocator().getCurrentPosition(desiredAccuracy: LocationAccuracy.high);
}
catch(error)
{
  print("error in geolocation: $error"); //error in geolocation: PlatformException(PERMISSION_DENIED, Access to location data denied, null)
  print("position: $position"); // position: null
  print("retrying");  // retrying
  try{
    position = await Geolocator().getCurrentPosition(desiredAccuracy: LocationAccuracy.high);
  }
  catch(error)
  {
    await printGeoStatus(5);
    print("2nd error in geolocation $error");
  }
  print("final position: $position"); //flutter: final position: Lat: 59.xyz, Long: 17.xyz

}

Konfigurasi

Versi Flutter: "Channel dev, v1.5.8"
Versi Geolocator: ^ 4.0.2

Peron:

  • [x]: iphone: iOS
  • []: robot: Android
ios triage bug

Komentar yang paling membantu

Saya sedang mengerjakan perbaikan untuk ini dan daftar masalah lainnya (lihat # 430, untuk lebih jelasnya). Ini akan menjadi pembaruan besar.

Saat ini sisi iOS sudah siap dan akan berfungsi di sisi Android sekarang.

Semua 12 komentar

@FlashJonas baru-baru ini kami telah menyempurnakan sepenuhnya plugin geolocator (versi 5.0.0) dan saya ingin tahu apakah Anda masih mengalami masalah ini di versi terbaru?

@mvanbeusekom Saya mengonfirmasi bahwa masalahnya masih ada di 5.0.0
baru saja menemukan paket Anda melalui kursus AppBrewery.

Saya memutuskan untuk mengikuti dokumen paket dan menambahkan ke file plist saya 3 kunci:

<key>NSLocationWhenInUseUsageDescription</key>
    <string>This app needs access to location when open.</string>
    <key>NSLocationAlwaysUsageDescription</key>
    <string>This app needs access to location when in the background.</string>
    <key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
    <string>This app needs access to location when open and in the background.</string>

Panggilan pertama ke

Position position = await Geolocator().getCurrentPosition(desiredAccuracy: LocationAccuracy.low);

minta izin dari pengguna (dengan 3 pilihan):
image

Jika saya menekan "hanya saat menggunakan aplikasi", terminal mencatat berikut ini:

[VERBOSE-2: ui_dart_state.cc (148)] Pengecualian Tidak Tertangani: PlatformException (PERMISSION_DENIED, Akses ke data lokasi ditolak, null)

0 Geolocator._handleInvalidPermissions (paket: geolocator / geolocator.dart: 191: 7)

1 Geolocator.getCurrentPosition (paket: geolocator / geolocator.dart: 102: 7)

2 _LoadingScreenState.getLocation (paket: clima / screens / loading_screen.dart: 13: 10)

3 _LoadingScreenState.build.(paket: clima / screens / loading_screen.dart: 23: 13)

4 _InkResponseState._handleTap (paket: flutter / src / material / ink_well.dart: 511: 14)

5 _InkResponseState.build.(paket: flutter / src / material / ink_well.dart: 566: 30)

6 GestureRecognizer.invokeCallback (paket: flutter / src / isyarat / pengenal.dart: 166: 24)

7 TapGestureRecognizer._checkUp (paket: flutter / src / gestures / tap.dart: 240: 9)

8 TapGestureRecognizer.handlePrimaryPointer (paket: flutter / src / gestures / tap.dart: 177: 9)

9 <…>

Pers kedua tidak apa-apa dan posisi dicatat tanpa masalah:

flutter: Lat: 37.785834, Panjang: -122.406417

Kode:
image

Masih memiliki masalah yang sama di iPhone 5s saya, 12.2, menggunakan geolocator 5.1.2.
* edit (Flutter Channel dev, v1.8.4)

// Called after closing welcome alert
Future getFirstLocation() async {
    Position position;
    try {
      position = await Geolocator()
          .getCurrentPosition(desiredAccuracy: LocationAccuracy.high);
    } catch (error) {
      print("getfirstlocation error 1");
      try {
        position = await Geolocator()
            .getCurrentPosition(desiredAccuracy: LocationAccuracy.high);
      } catch (error) {
        print("error in geolocation $error");
      }
    }

    print("getfirstlocation position: $position");

    if (position != null) {
     // send to database
    }
  }

Log dari menjalankan kode di atas:
flutter: getfirstlocation error 1
flutter: getfirstlocation position: Lat: 59.xxxx, Long: 17.yyyy

Saya menghadapi kesalahan yang sama:
Android (Oneplus 2) - Android 8.1.0 - Geolocator 5.1.2
(Izin lokasi diberikan)

2019-08-15 16:54:22.606 926-1110/system_process E/InputDispatcher: channel '569829a de.paschke.coffeebreak/de.paschke.coffeebreak.MainActivity (server)' ~ Channel is unrecoverably broken and will be disposed!
2019-08-15 16:54:56.808 14735-14766/? E/flutter: [ERROR:flutter/lib/ui/ui_dart_state.cc(148)] Unhandled Exception: PlatformException(PERMISSION_DENIED, Access to location data denied, null)
    #0      Geolocator._handleInvalidPermissions (package:geolocator/geolocator.dart:207:7)
    #1      Geolocator.getLastKnownPosition (package:geolocator/geolocator.dart:146:7)
    <asynchronous suspension>
    #2      LocationService.getLastKnownLocation (package:coffee_break/services/location_service.dart:24:51)
    <asynchronous suspension>
    #3      UserStoreBase.checkLastLocation (package:coffee_break/stores/user_store.dart:125:36)

Saya mendapat kesalahan yang sama saat menggunakan ketiga string izin. Jika saya hanya menggunakan NSLocationWhenInUseUsageDescription, aplikasi berfungsi kembali. Tebakan terbaik saya adalah ketika menggunakan ketiga izin tersebut, aplikasi dimulai dan menanyakan lokasi sebelum pengguna diminta untuk mengonfirmasinya. Perilaku ui sepertinya menegaskannya, tapi itu hanya tebakan. Bagaimanapun, jika Anda bisa hidup hanya dengan NSLocationWhenInUseUsageDescription, hapus dua lainnya.

masalah yang sama :( pada saluran stabil versi terakhir dari flutter.

paket ini menyebalkan ...

Kesalahan yang sama, versi flutter terakhir di Android 10.

Saya memiliki masalah yang sama!

Saya bertanya-tanya apakah masalah ini akan ditangani, saya melihat sudah lebih dari satu tahun dan orang-orang masih menghadapinya. Baru-baru ini saya mulai mempelajari Flutter dan menemukan masalah yang sama, dengan langkah yang persis sama untuk mereproduksi.

Ketika saya memilih opsi "Hanya saat menggunakan aplikasi" dari perintah iOS, saya mendapatkan pengecualian di konsol flutter bahkan untuk kedua kalinya saya meminta lokasi dari aplikasi, saya mendapatkan data lokasi yang benar.

PS menggunakan versi 5.3.2+2 terbaru

Saya sedang mengerjakan perbaikan untuk ini dan daftar masalah lainnya (lihat # 430, untuk lebih jelasnya). Ini akan menjadi pembaruan besar.

Saat ini sisi iOS sudah siap dan akan berfungsi di sisi Android sekarang.

Ini harus diperbaiki pada versi 6.0.0

Mungkin terlambat untuk membalas tetapi saya juga menghadapi masalah yang sama di mana aplikasi tidak meminta izin di iOS dan berfungsi dengan baik di android.

Karena tidak dimintai izin itulah sebabnya kode izin tidak berfungsi untuk iOS. Saya menemukan paket bernama "location_permissions" yang dapat digunakan untuk meminta izin secara manual.

Langkah-langkah yang harus dilakukan adalah sebagai berikut

  1. Tambahkan "location_permissions: 3.0.0 + 1" dependencies ini di "pubspec.yaml". Harap dicatat bahwa saya melakukannya untuk flutter 1.22.0 jadi untuk flutter 2.0 ini mungkin menjadi masalah.
  2. Impor paket ke dalam file

    impor ' paket: location_permissions / location_permissions.dart ';

  3. Tambahkan kode berikut di halaman tempat Anda ingin meminta izin. (Lebih baik menambahkannya di halaman pertama aplikasi Anda.)

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

    }

  4. Tambahkan dua metode berikut di file yang sama

    void location_permission () async {
    izin PermissionStatus terakhir = menunggu _getLocationPermission ();
    jika (izin == PermissionStatus.granted) {
    posisi akhir = menunggu geolocator.getCurrentPosition (
    diinginkanAccuracy: LocationAccuracy.best);

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

    }

    Masa depan_getLocationPermission () async {
    izin akhir PermissionStatus = menunggu LocationPermissions ()
    .checkPermissionStatus (level: LocationPermissionLevel.location);

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

    }

Itu saja sekarang Anda harus mendapatkan popup di aplikasi iOS yang akan meminta izin lokasi.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat