Skip to content

Instantly share code, notes, and snippets.

@theraot
Created March 20, 2025 11:59
Show Gist options
  • Select an option

  • Save theraot/54403b55793354e47a3a3966108d34b3 to your computer and use it in GitHub Desktop.

Select an option

Save theraot/54403b55793354e47a3a3966108d34b3 to your computer and use it in GitHub Desktop.
Godot GPS example
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
@theraot
Copy link
Author

theraot commented Mar 20, 2025

IMPORTANT: set the location permission in export settings. Otherwise requesting the permissions from code does not work.

image

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment