feat: use Capacitor Geolocation to prompt and get native location on Android

This commit is contained in:
2026-06-27 22:15:18 +07:00
parent 7f426c8e46
commit 964a72514f
5 changed files with 68 additions and 38 deletions
+54
View File
@@ -0,0 +1,54 @@
import { Geolocation } from '@capacitor/geolocation';
export interface DeviceLocation {
latitude: number;
longitude: number;
}
export async function getDeviceLocation(): Promise<DeviceLocation | null> {
try {
// Request permission at native level (essential for Android app packaging)
const permissionStatus = await Geolocation.requestPermissions();
if (permissionStatus.location === 'granted' || permissionStatus.coarseLocation === 'granted') {
const position = await Geolocation.getCurrentPosition({
enableHighAccuracy: true,
timeout: 5000
});
if (position && position.coords) {
console.log('[Geolocation] Acquired coordinates via Capacitor Geolocation:', position.coords.latitude, position.coords.longitude);
return {
latitude: position.coords.latitude,
longitude: position.coords.longitude
};
}
}
} catch (error) {
console.warn('[Geolocation] Capacitor plugin failed/unavailable, falling back to browser Geolocation:', error);
}
// Fallback to standard web browser Geolocation API
try {
const position = await new Promise<GeolocationPosition | null>((resolve) => {
if (!navigator.geolocation) {
resolve(null);
} else {
navigator.geolocation.getCurrentPosition(
(p) => resolve(p),
() => resolve(null),
{ timeout: 4000, enableHighAccuracy: true }
);
}
});
if (position && position.coords) {
console.log('[Geolocation] Acquired coordinates via Web Geolocation:', position.coords.latitude, position.coords.longitude);
return {
latitude: position.coords.latitude,
longitude: position.coords.longitude
};
}
} catch (e) {
console.error('[Geolocation] Browser Geolocation failed:', e);
}
return null;
}