feat: use Capacitor Geolocation to prompt and get native location on Android
This commit is contained in:
@@ -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;
|
||||
}
|
||||
Reference in New Issue
Block a user