我有以下问题:我有一个 flutter 应用程序,它使用 Geolocator 来确定用户位置。该应用程序与精确位置配合得很好,但是当选择近似位置时,它会导致错误:“java.lang.SecurityException:用户 10166 和当前进程都没有 android.permission.ACCESS_FINE_LOCATION。”然后应用程序会自行关闭。
当我进入 Android 模拟器设备设置并将位置权限从“每次询问”更改为“仅在使用应用程序时允许”时,问题不会重现,但这不是我希望用户体验的行为 - 我想要他们会看到 Android 对话框,询问他们是否允许使用他们的位置,并在精确位置和近似位置之间进行选择。
你有什么想法吗?我使用 flutter 3.19.6 和 geolocator 12.0.0
我尝试了几件事,例如将 android.permission.ACCESS_FINE_LOCATION 和 android.permission.ACCESS_COARSE_LOCATION 添加到 AndroidManifest 文件中,但这没有帮助。 此外,我在运行时请求了权限,但这并没有解决问题。这是代码:
Future<void> getCurrrentUserLocation() async {
bool serviceEnabled;
LocationPermission permission;
// Check if location services are enabled.
serviceEnabled = await Geolocator.isLocationServiceEnabled();
if (!serviceEnabled) {
print('Location services are disabled.');
return;
}
// Check the current permission status.
//permission = await Geolocator.requestPermission();
permission = await Geolocator.checkPermission();
print('Initial permission status: $permission');
if (permission == LocationPermission.denied) {
permission = await Geolocator.requestPermission();
print('Permission after request: $permission');
if (permission == LocationPermission.denied) {
print('Location permissions are denied.');
return;
}
}
if (permission == LocationPermission.deniedForever) {
print('Location permissions are permanently denied, we cannot request permissions.');
return;
}
if (permission == LocationPermission.whileInUse || permission == LocationPermission.always) {
try {
Position position = await Geolocator.getCurrentPosition(timeLimit: const Duration(seconds: 15));
print('Latitude: ${position.latitude}, Longitude: ${position.longitude}');
} catch (e) {
print('Error occurred while trying to get location: $e');
}
} else {
print('Location permissions are not granted.');
}
在你的 android/app/build.gradle 文件中,确保compileVersion等于
编译SdkVersion 34.
另外,将以下权限添加到您的 AndroidManifest.xml 中:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />