Created
March 20, 2025 11:59
-
-
Save theraot/54403b55793354e47a3a3966108d34b3 to your computer and use it in GitHub Desktop.
Godot GPS example
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| extends VBoxContainer | |
| const FONT_SIZE = 40 | |
| var android_runtime: Object | |
| var location_manager: JavaObject | |
| var output_label: Label | |
| var normal_label_settings:LabelSettings | |
| var error_label_settings:LabelSettings | |
| func _ready() -> void: | |
| set_anchors_and_offsets_preset(Control.PRESET_FULL_RECT) | |
| normal_label_settings = LabelSettings.new() | |
| normal_label_settings.font_size = FONT_SIZE | |
| normal_label_settings.outline_color = Color.BLACK | |
| normal_label_settings.outline_size = 1 | |
| normal_label_settings.font_color = Color.WHITE | |
| error_label_settings = LabelSettings.new() | |
| error_label_settings.font_size = FONT_SIZE | |
| error_label_settings.outline_color = Color.WHITE | |
| error_label_settings.outline_size = 1 | |
| error_label_settings.font_color = Color.RED | |
| output_label = Label.new() | |
| output_label.text = "Press the button to get location." | |
| output_label.label_settings = normal_label_settings | |
| add_child(output_label) | |
| if not Engine.has_singleton("AndroidRuntime"): | |
| _error("AndroidRuntime singleton not found! Run on an Android device.") | |
| return | |
| var location_button := Button.new() | |
| location_button.text = "Get Location" | |
| location_button.add_theme_font_size_override("font_size", FONT_SIZE) | |
| @warning_ignore("return_value_discarded") | |
| location_button.pressed.connect(request_location) | |
| add_child(location_button) | |
| android_runtime = Engine.get_singleton("AndroidRuntime") | |
| check_and_request_permissions() | |
| func _error(msg:String) -> void: | |
| if is_instance_valid(output_label): | |
| output_label.label_settings = error_label_settings | |
| output_label.text = msg | |
| printerr(msg) | |
| func _output(msg:String) -> void: | |
| if is_instance_valid(output_label): | |
| output_label.label_settings = normal_label_settings | |
| output_label.text = msg | |
| print(msg) | |
| #region Java | |
| @warning_ignore_start("unsafe_method_access") | |
| @warning_ignore_start("unsafe_property_access") | |
| func check_and_request_permissions() -> void: | |
| var activity:JavaObject = android_runtime.getActivity() | |
| var PackageManager := JavaClassWrapper.wrap("android.content.pm.PackageManager") | |
| var ContextCompat := JavaClassWrapper.wrap("androidx.core.content.ContextCompat") | |
| var ActivityCompat := JavaClassWrapper.wrap("androidx.core.app.ActivityCompat") | |
| var granted := true | |
| var permissions:Array[String] = [ | |
| "android.permission.ACCESS_FINE_LOCATION", | |
| "android.permission.ACCESS_COARSE_LOCATION" | |
| ] | |
| for permission in permissions: | |
| if ContextCompat.checkSelfPermission(activity, permission) != PackageManager.PERMISSION_GRANTED: | |
| granted = false | |
| break | |
| if not granted: | |
| _output("Requesting permissions...") | |
| ActivityCompat.requestPermissions(activity, permissions, 1) | |
| _output("Requested permissions.") | |
| return | |
| _output("Permissions already granted.") | |
| @warning_ignore("return_value_discarded") | |
| initialize_location_manager() | |
| func initialize_location_manager() -> bool: | |
| if location_manager != null: | |
| return true | |
| var Context := JavaClassWrapper.wrap("android.content.Context") | |
| location_manager = android_runtime.getActivity().getSystemService(Context.LOCATION_SERVICE) | |
| if location_manager == null: | |
| _error("Failed to initialize LocationManager.") | |
| return false | |
| _output("LocationManager initialized.") | |
| return true | |
| func request_location() -> void: | |
| if not initialize_location_manager(): | |
| return | |
| var LocationManager := JavaClassWrapper.wrap("android.location.LocationManager") | |
| var location:JavaObject = location_manager.getLastKnownLocation(LocationManager.GPS_PROVIDER) | |
| if not location: | |
| location = location_manager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER) | |
| if location: | |
| var latitude:float = location.getLatitude() | |
| var longitude:float = location.getLongitude() | |
| var location_text := "Latitude: %s, Longitude: %s" % [latitude, longitude] | |
| _output(location_text) | |
| else: | |
| _error("Failed to get location.") | |
| #endregion |
Author
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
IMPORTANT: set the location permission in export settings. Otherwise requesting the permissions from code does not work.