Flutter-geolocator: dapatkan `LocationServiceDisabledException` ketika `Geolocator.isLocationServiceEnabled() mengembalikan true

Dibuat pada 6 Nov 2020  ·  20Komentar  ·  Sumber: Baseflow/flutter-geolocator

Laporan Bug

Perilaku yang diharapkan

coba dapatkan lokasi saat ini setelah izin lokasi diberikan, dan layanan lokasi juga diaktifkan, tetapi saya mendapat LocationServiceDisabledException ketika getCurrentPosition dipanggil

Langkah-langkah reproduksi

try {
      final enabled = await Geolocator.isLocationServiceEnabled();

      print("enabled $enabled"); // true

      final permission = await Geolocator.checkPermission();

      print("permission $permission"); // whileInUse

      final position = await Geolocator.getCurrentPosition(
        desiredAccuracy: LocationAccuracy.medium,
      ); // throw exception here

    } catch (e) {
        // i got `LocationServiceDisabledException` here
    }

Konfigurasi

semua izin terkait diberikan, dan semua konfigurasi di Android selesai.

Versi: 6.1.5

Platform:

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

Komentar yang paling membantu

Saya baru saja merilis versi 6.1.10 dari plugin geolocator yang seharusnya menyelesaikan masalah ini.

Ternyata di Android metode callback onLocationAvailability sering melaporkan bahwa lokasi tidak tersedia dan tidak hanya ketika layanan lokasi dinonaktifkan. Saya telah menyempurnakan penanganan metode ini dan Anda seharusnya tidak lagi mengalami pengecualian LocationServiceDisabledException palsu lagi.

Terima kasih semuanya telah melaporkan, mengklarifikasi, dan membantu mereproduksi masalah ini.

Semua 20 komentar

Saya memiliki kesalahan yang sama tetapi hanya ketika mengubah LocationAccuracy dari default ke yang lain

StreamSubscription _streamSubscription = Geolocator.getPositionStream( // desiredAccuracy: LocationAccuracy.medium, <-- LocationServiceDisabledException error if I use a different accuracy distanceFilter: 500 ).listen(_listenData)..onError((e, stk) => print(e));

Saya sedang menyelidiki masalah ini tetapi mengalami kesulitan untuk mereproduksinya. Mungkin Anda dapat menjawab pertanyaan berikut dan membantu saya men-debug masalah ini:

  1. Apakah Anda melihat ini di emulator atau juga di perangkat nyata?
  2. Apakah Anda telah menginstal Layanan Google Play (bergantung pada ini, geolocator akan menggunakan FusedLocationProvider SDK atau LocationManager SDK, ini dapat membantu saya mempersempit di mana mencari masalah)?

Kami menantikan umpan balik sehingga kami dapat mengatasi hal ini.

Saya mendapatkan Unhandled Exception: The location service on the device is disabled. ketika saya melakukannya

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

bahkan jika layanan lokasi untuk aplikasi itu diaktifkan.

  1. Perangkat nyata di Android 10
  2. Layanan Google Play diinstal

Saya mencobanya dan bekerja dengan akurasi sedang. Tetapi tidak dengan pengaturan lain.

  1. Emulator.
  2. Mencoba keduanya.

Mendapat kesalahan yang sama dan juga tidak berfungsi dengan pengaturan apa pun. Diuji pada emulator dan perangkat nyata dengan lokasi selalu aktif.

Sepertinya saya hanya bekerja pada akurasi terbaik. Tapi itu tidak untuk orang lain.

  1. Emulator.
  2. Layanan Google Play terpasang

Terima kasih semua untuk memberikan lebih banyak umpan balik. Kami sedang menyelidikinya tetapi masih belum dapat mereproduksinya. Ini mungkin ada hubungannya dengan pengaturan tertentu yang diaktifkan/dinonaktifkan.

Ketika kami mengetahuinya, kami tentu akan memberi tahu Anda. Sementara itu kami terbuka untuk informasi tambahan (yaitu apakah ini terjadi pada semua API Android atau hanya Android 10).

Saya memiliki kesalahan yang sama. https://prnt.sc/vr3glj

Saya mendapatkan masalah yang sama hanya ketika perangkat tidak terhubung ke jaringan (WIFI atau MOBILE) dan saya berada di dalam gedung (yaitu: koneksi GPS yang buruk)

pengaturan aliran saat ini:
StreamSubscription<Position> positionStream = Geolocator.getPositionStream( desiredAccuracy: LocationAccuracy.best, distanceFilter: 0) .listen((Position position) {}

AndroidManifest.xml: <!--Location--> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />

Pengaturan lokasi perangkat: Akurasi Tinggi (Gunakan GPS, Wi-Fi, Bluetooth, dan jaringan seluler untuk menentukan lokasi)
edit: Menggunakan perangkat fisik

Terima kasih @seb3n ini informasi yang sangat membantu. Saya yakin ini akan memberi saya sesuatu untuk dilanjutkan.

Terima kasih semua untuk memberikan lebih banyak umpan balik. Kami sedang menyelidikinya tetapi masih belum dapat mereproduksinya. Ini mungkin ada hubungannya dengan pengaturan tertentu yang diaktifkan/dinonaktifkan.

Ketika kami mengetahuinya, kami tentu akan memberi tahu Anda. Sementara itu kami terbuka untuk informasi tambahan (yaitu apakah ini terjadi pada semua API Android atau hanya Android 10).

@mvanbeusekom Saya memiliki masalah yang sama di Android 9

E/flutter (31570): [ERROR:flutter/lib/ui/ui_dart_state.cc(177)] Unhandled Exception: The location service on the device is disabled.
E/flutter (31570): #0      MethodChannelGeolocator._handlePlatformException (package:geolocator_platform_interface/src/implementations/method_channel_geolocator.dart:192:9)
E/flutter (31570): #1      MethodChannelGeolocator.getCurrentPosition (package:geolocator_platform_interface/src/implementations/method_channel_geolocator.dart:121:7)
E/flutter (31570): <asynchronous suspension>
E/flutter (31570): #2      Geolocator.getCurrentPosition (package:geolocator/geolocator.dart:258:35)

isLocationServiceEnabled benar
kode

      bool isLocationServiceEnabled =
          await Geolocator.isLocationServiceEnabled();
      AppLog.d(isLocationServiceEnabled);
      if (isLocationServiceEnabled) {
        Position position = await Geolocator.getCurrentPosition(
            desiredAccuracy: LocationAccuracy.high);
        return {"position": position.toString()};
      }

position = await Geolocator.getCurrentPosition( desiredAccuracy: LocationAccuracy.medium, forceAndroidLocationManager: true) .timeout(Duration(seconds: 10));

Sepotong kode ini bekerja untuk saya.

Ini adalah upaya saya untuk membuat kesalahan minimal yang dapat direproduksi

import 'package:flutter/material.dart';
import 'package:geolocator/geolocator.dart';
import 'dart:async';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  <strong i="6">@override</strong>
  Widget build(BuildContext context) {
    return MaterialApp(
        debugShowCheckedModeBanner: false,
        title: 'Flutter Demo',
        home: SafeArea(
          child: Scaffold(body: GeoLocatorWidget()),
        ));
  }
}

class GeoLocatorWidget extends StatefulWidget {
  const GeoLocatorWidget({
    Key key,
  }) : super(key: key);

  <strong i="7">@override</strong>
  _GeoLocatorWidgetState createState() => _GeoLocatorWidgetState();
}

class _GeoLocatorWidgetState extends State<GeoLocatorWidget> {
  StreamSubscription<Position> _streamSubscription;
  String message = 'empty';

  <strong i="8">@override</strong>
  void initState() {
    super.initState();
    _streamSubscription = Geolocator.getPositionStream(
            //desiredAccuracy: LocationAccuracy.medium,
            distanceFilter: 500)
        .listen(_onData, onError: _onError);
  }

  void _onData(Position position) {
    ScaffoldState _scaffoldKey = Scaffold.of(context, nullOk: true);
    if ((_scaffoldKey?.mounted ?? false)) _scaffoldKey.hideCurrentSnackBar();
    setState(() {
      message = 'latitude: ${position.latitude}, longitude: ${position.longitude}';
    });
  }

  void _onError(dynamic error) {
    bool geoService = error is LocationServiceDisabledException ||
        error is PermissionDeniedException;
    ScaffoldState _scaffoldKey = Scaffold.of(context, nullOk: true);
    if (!(_scaffoldKey?.mounted ?? false)) return;
    _scaffoldKey.hideCurrentSnackBar();
    _scaffoldKey.showSnackBar(SnackBar(
      content: Text('$error'),
      duration: const Duration(minutes: 2),
      action: geoService
          ? SnackBarAction(
              label: 'Change',
              onPressed: () async {
                if (error is LocationServiceDisabledException) {
                  bool locationEnabled =
                      await Geolocator.isLocationServiceEnabled();
                  if (!locationEnabled) await Geolocator.openLocationSettings();
                  else setState(() {
                    message = '''
                      locationService is enabled but the error says 
                      its of type LocationServiceDisabledException anyway :(
                    ''';
                  });
                } else await Geolocator.openAppSettings();
              },
            )
          : null,
    ));
  }

  <strong i="9">@override</strong>
  void dispose() {
    _streamSubscription?.cancel();
    super.dispose();
  }

  <strong i="10">@override</strong>
  Widget build(BuildContext context) {
    return Center(
      child: Text(message),
    );
  }
}

Menambahkan semua izin di AndroidManifest

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />

LANGKAH-LANGKAH REPRODUKSI

  1. streamSubscription akan menginisialisasi dan meminta izin dan layanan lokasi, kami memberikan keduanya dan itu menunjukkan dengan benar garis lintang dan bujur di layar
  2. Matikan layar dengan aplikasi terbuka (simulasikan pengguna terganggu dan kemudian kembali setelah satu menit)
  3. Nyalakan / Buka kunci layar dan aplikasi sekarang akan menampilkan snackbar dengan kesalahan ( LocationServiceDisabledException ) dan tombol snackBarAction "Ubah"
  4. Jika tombol diketuk, ia akan memeriksa secara tidak sinkron jika layanan lokasi benar-benar dinonaktifkan, jika dinonaktifkan ia akan mencoba membuka Geolocator.openLocationSettings(); , jika diaktifkan meskipun kesalahannya bertipe LocationServiceDisabledException ( masalah utas ini) lalu ubah saja teks layar yang memberi tahu Anda bahwa itu diaktifkan dan itu tidak dapat melakukan apa-apa

Pertimbangan

  • Diuji dengan perangkat nyata menggunakan Android 8.1.0 dan Android 10, semuanya bekerja dengan baik di Android 8.1.0 (matikan dan hidupkan, kembali ke aplikasi setelah beberapa saat dan tidak menunjukkan kesalahan) tetapi masalah tetap ada dengan Android 10
  • Tidak dapat membuat kesalahan terjadi di emulator (mungkin ini ada hubungannya dengan mode Istirahatkan atau hemat baterai)
  • Saya mengerti plugin tidak mengizinkan lokasi latar belakang, tetapi seharusnya tidak mengirim kesalahan ini ketika lokasi diaktifkan dengan jelas dan hanya melanjutkan aliran ketika aplikasi berada di latar depan lagi (atau mungkin mengirim pesan yang berbeda untuk mengetahui apakah itu benar-benar a masalah layanan lokasi)
  • Ini juga terkait dengan #568 di mana izin/layanan dinonaktifkan dan kemudian diaktifkan, salah satu caranya adalah menggunakan WidgetsBindingObserver untuk membuat ulang aliran saat keluar dari aplikasi (Saat membuka pengaturan untuk mengubah lokasi atau izin aplikasi aplikasi)
<strong i="5">@override</strong>
  void didChangeAppLifecycleState(AppLifecycleState state) {
    switch (state) {
      case AppLifecycleState.paused:
        if (_streamSubscription != null) {
          _streamSubscription.cancel();
          _streamSubscription = null;
        }
        break;
      case AppLifecycleState.resumed:
        _streamSubscription ??= Geolocator.getPositionStream(
            //desiredAccuracy: LocationAccuracy.medium,
            distanceFilter: 500).listen(_onData, onError: _onError);
        break;
      default:
        break;
    }
  }

Yang berfungsi dengan baik jika pengguna mengetuk tombol "Ubah", dialihkan ke Pengaturan Layanan Lokasi, nyalakan dan kembali ke aplikasi, tetapi itu tidak akan berfungsi jika pengguna hanya mengaktifkannya dari bilah status (aliran hanya berhenti mengembalikan nilai setelah itu).

Ide lain adalah menggunakan metode cancelOnError: true dan HandleError untuk mencegat beberapa kesalahan aliran dan mencegah menutupnya ketika itu tidak terlalu penting (sesuatu yang tidak dapat ditangani) tetapi karena mengembalikan LocationServiceDisabledException meskipun bukan itu masalahnya membuat sulit untuk memilih kapan dan kapan tidak menggunakan HandleError

Saya melakukan tes lain pada perangkat fisik dengan Android 8.0.0 yang baru diinstal

Panggilan API

Position position = await Geolocator.getCurrentPosition(
      desiredAccuracy: LocationAccuracy.$accuracy$,
    ).timeout(Duration(seconds: 10));

Hasil untuk setiap nilai $accuracy$:
| $akurasi$ | Hasil |
|-------------------|----------------------------- -----|
| terendah | TimeoutException |
| rendah | LocationServiceDisabledException |
| sedang | LocationServiceDisabledException |
| tinggi | TimeoutException |
| terbaik | LocationServiceDisabledException |
| Navigasi terbaik | TimeTimeoutException |

AndroidManifest.xml

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />

Pengaturan alat

Pengaturan lokasi perangkat: Akurasi Tinggi (Gunakan GPS, Wi-Fi, dan jaringan seluler)
Wi-Fi: Terhubung
VPN: Tidak ada
Kekuatan Sinyal GPS: Tetap kuat
Informasi lokasi: On
Permintaan lokasi terbaru: Menampilkan aplikasi yang disebut API geolokasi

Saya baru saja merilis versi 6.1.10 dari plugin geolocator yang seharusnya menyelesaikan masalah ini.

Ternyata di Android metode callback onLocationAvailability sering melaporkan bahwa lokasi tidak tersedia dan tidak hanya ketika layanan lokasi dinonaktifkan. Saya telah menyempurnakan penanganan metode ini dan Anda seharusnya tidak lagi mengalami pengecualian LocationServiceDisabledException palsu lagi.

Terima kasih semuanya telah melaporkan, mengklarifikasi, dan membantu mereproduksi masalah ini.

Saya memiliki kesalahan yang sama, saya telah mereproduksinya di xiaomi Redmi Note 8, sedangkan pada huawei p20 lite berfungsi dengan baik.
Saya perhatikan bahwa metode berikut mengembalikan true ketika layanan dinonaktifkan pada xiaomi, itu harus mengembalikan false, seperti yang terjadi pada huawei.
Versi pluginnya adalah: geolocator: ^6.1.13
menunggu Geolocator.isLocationServiceEnabled ()

Seperti @sejr1996 saya telah mendeteksi masalah yang sama dengan versi 6.1.13 di Nokia 3.1 (android 9), Galaxy A10s (android 10)

The location service on the device is disabled.
       at MethodChannelGeolocator._handlePlatformException(MethodChannelGeolocator.java:192)
       at MethodChannelGeolocator.<fn>(MethodChannelGeolocator.java:171)

Seperti @sejr1996 saya telah mendeteksi masalah yang sama dengan versi 6.1.13 di Nokia 3.1 (android 9), Galaxy A10s (android 10)

The location service on the device is disabled.
       at MethodChannelGeolocator._handlePlatformException(MethodChannelGeolocator.java:192)
       at MethodChannelGeolocator.<fn>(MethodChannelGeolocator.java:171)

Saya mendapatkan yang sama

Saya percaya itu sudah diperbaiki. Pilihan terakhir saya untuk memperbaiki lokasi layanan adalah menggunakan paket lokasi. tapi sekarang dengan versi baru dari paket geolocator. izin lokasi didahulukan, kemudian lokasi layanan mengikuti.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat