装置

yarn add react-native-amap-geolocation

应用

  const {coords} = useLocation()  console.log('ccc', coords) // 以后地位,非实时   const {location} = useLocation('watch')  console.log('l333', location.city) // 实时定位

useLocation.ts

import React, {useCallback, useEffect, useState} from "react"import { PermissionsAndroid } from "react-native"import { init, Geolocation } from "react-native-amap-geolocation"import {AMAP_ANDROID_KEY} from '@/constants/constants'interface Position {  coords: {    /** 精度 米 */    accuracy: number    altitude?: number    heading: number    latitude: number    longitude: number    speed: number  }  location?: any}interface PositionWatch {  coords: {    /** 精度 米 */    accuracy: number    altitude?: number    heading: number    latitude: number    longitude: number    speed: number  }  location: {    accuracy: number    adCode: string     address: string               //  "重庆市九龙坡区科城支路85号凑近重庆市九龙坡区人力资源和社会保障综合服务中心",     altitude: number    city: string                  //  "重庆市",     cityCode: string              //  "023",     coordinateType: string        //  "GCJ02",     country: string               //  "中国",     description: string           //  "在重庆市九龙坡区人力资源和社会保障综合服务中心左近",     district: string              //  "九龙坡区",     errorCode: number             //  0,    errorInfo: string             //  "success",     gpsAccuracy: number           //  -1,    heading: number               //   0,     latitude: number              //   29.512879,     locationType: number          //   2,     longitude: number             //  106.458555,    poiName: string               //  "重庆市九龙坡区人力资源和社会保障综合服务中心",     province: string              //  "重庆市",     speed: number                 //  0,     street: string                //  "科城支路",     streetNumber: string          //  "85号",     timestamp: number             //  1651214072119,     trustedLevel: number          // 1  }  timestamp: number }type TLocType = 'watch'function useLocation (): Positionfunction useLocation (locType: TLocType): PositionWatchfunction useLocation (locType?: TLocType): Position | PositionWatch {  const [position, setPosition] = useState<Position>({    coords: {      latitude: 0,      longitude: 0,      accuracy: 0,      heading: 0,      speed: 0,    },    location: {}  })  /** 初始化 */  const initAMap = useCallback(async () => {    await PermissionsAndroid.requestMultiple([      PermissionsAndroid.PERMISSIONS.ACCESS_FINE_LOCATION,      PermissionsAndroid.PERMISSIONS.ACCESS_COARSE_LOCATION,    ]);        await init({      ios: '',      android: AMAP_ANDROID_KEY    })  }, [])  /** 获取以后地位 */  const getPosition = useCallback<() => Promise<Position>>(() => {    return new Promise((resolve, reject) => {      Geolocation.getCurrentPosition(({ coords }) => {        resolve({coords: coords})      }, err => {        reject(err)      })    })  }, [])  useEffect(() => {    let wid    async function init() {      await initAMap()      if(locType === 'watch'){        wid = Geolocation.watchPosition((curPosition) => {          setPosition({...curPosition})        }, (err) => {          console.log('实时定位出错:', err)          Geolocation.clearWatch(wid)        })      }else{        const curPos = await getPosition()        setPosition({...curPos, location: {}})      }    }    init()    return () => {      locType === 'watch' && Geolocation.clearWatch(wid)    }  }, [initAMap, getPosition, locType])  return position}export default useLocation