coba dapatkan lokasi saat ini setelah izin lokasi diberikan, dan layanan lokasi juga diaktifkan, tetapi saya mendapat LocationServiceDisabledException
ketika getCurrentPosition
dipanggil
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
}
semua izin terkait diberikan, dan semua konfigurasi di Android selesai.
Versi: 6.1.5
Platform:
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:
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.
Saya mencobanya dan bekerja dengan akurasi sedang. Tetapi tidak dengan pengaturan lain.
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.
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" />
LocationServiceDisabledException
) dan tombol snackBarAction "Ubah"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<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
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 |
<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 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.
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 pengecualianLocationServiceDisabledException
palsu lagi.Terima kasih semuanya telah melaporkan, mengklarifikasi, dan membantu mereproduksi masalah ini.