maps: [ANDROID] Mapbox.UserLocation crashes my app!

Describe the bug I wanted to give a try to the latest release candidate (want to upgrade to the new Mapbox pricing model). My app uses the new <UserLocation /> inside a <MapView />. My app crashes on launch. It does not crash if I remove the <UserLocation />.

I added and removed the permissions and features and it still crashes.

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

<uses-feature android:name="android.hardware.location.gps"/>

To Reproduce Create and render that component (simplified code):

function Map() {
  return (
    <MapView>
      <UserLocation />
    </MapView>
  )
}

Expected behavior I would expected my app to run properly.

Versions:

  • Platfrom: Android
  • Device: ONE A2005
  • OS: 3.6.1
  • SDK Version: 28
  • React Native Version: 0.59.9

Additional context

Here is the log: 07-10 15:09:37.634 30607 30649 E AndroidRuntime: FATAL EXCEPTION: mqt_native_modules 07-10 15:09:37.634 30607 30649 E AndroidRuntime: Process: com.avcan, PID: 30607 07-10 15:09:37.634 30607 30649 E AndroidRuntime: java.lang.SecurityException: “passive” location provider requires ACCESS_FINE_LOCATION permission. 07-10 15:09:37.634 30607 30649 E AndroidRuntime: at android.os.Parcel.readException(Parcel.java:1620) 07-10 15:09:37.634 30607 30649 E AndroidRuntime: at android.os.Parcel.readException(Parcel.java:1573) 07-10 15:09:37.634 30607 30649 E AndroidRuntime: at android.location.ILocationManager$Stub$Proxy.getLastLocation(ILocationManager.java:738) 07-10 15:09:37.634 30607 30649 E AndroidRuntime: at android.location.LocationManager.getLastKnownLocation(LocationManager.java:1240) 07-10 15:09:37.634 30607 30649 E AndroidRuntime: at com.mapbox.android.core.location.AndroidLocationEngineImpl.getLastLocationFor(AndroidLocationEngineImpl.java:58) 07-10 15:09:37.634 30607 30649 E AndroidRuntime: at com.mapbox.android.core.location.MapboxFusedLocationEngineImpl.getBestLastLocation(MapboxFusedLocationEngineImpl.java:81) 07-10 15:09:37.634 30607 30649 E AndroidRuntime: at com.mapbox.android.core.location.MapboxFusedLocationEngineImpl.getLastLocation(MapboxFusedLocationEngineImpl.java:36) 07-10 15:09:37.634 30607 30649 E AndroidRuntime: at com.mapbox.android.core.location.LocationEngineProxy.getLastLocation(LocationEngineProxy.java:25) 07-10 15:09:37.634 30607 30649 E AndroidRuntime: at com.mapbox.rctmgl.location.LocationManager.getLastKnownLocation(LocationManager.java:125) 07-10 15:09:37.634 30607 30649 E AndroidRuntime: at com.mapbox.rctmgl.modules.RCTMGLLocationModule.getLastKnownLocation(RCTMGLLocationModule.java:88) 07-10 15:09:37.634 30607 30649 E AndroidRuntime: at java.lang.reflect.Method.invoke(Native Method) 07-10 15:09:37.634 30607 30649 E AndroidRuntime: at com.facebook.react.bridge.JavaMethodWrapper.invoke(JavaMethodWrapper.java:372) 07-10 15:09:37.634 30607 30649 E AndroidRuntime: at com.facebook.react.bridge.JavaModuleWrapper.invoke(JavaModuleWrapper.java:158) 07-10 15:09:37.634 30607 30649 E AndroidRuntime: at com.facebook.react.bridge.queue.NativeRunnable.run(Native Method) 07-10 15:09:37.634 30607 30649 E AndroidRuntime: at android.os.Handler.handleCallback(Handler.java:739) 07-10 15:09:37.634 30607 30649 E AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:95) 07-10 15:09:37.634 30607 30649 E AndroidRuntime: at com.facebook.react.bridge.queue.MessageQueueThreadHandler.dispatchMessage(MessageQueueThreadHandler.java:29) 07-10 15:09:37.634 30607 30649 E AndroidRuntime: at android.os.Looper.loop(Looper.java:152) 07-10 15:09:37.634 30607 30649 E AndroidRuntime: at com.facebook.react.bridge.queue.MessageQueueThreadImpl$4.run(MessageQueueThreadImpl.java:232) 07-10 15:09:37.634 30607 30649 E AndroidRuntime: at java.lang.Thread.run(Thread.java:818)

About this issue

  • Original URL
  • State: closed
  • Created 5 years ago
  • Reactions: 1
  • Comments: 19 (6 by maintainers)

Most upvoted comments

Some code snippets. Thanks @karlguillotte 😃

import { Platform } from 'react-native'
import Mapbox from '@react-native-mapbox-gl/maps'

export async function hasLocationPermission() {
  if (
    Platform.OS === 'web' ||
    Platform.OS === 'ios' ||
    (Platform.OS === 'android' && Platform.Version < 23)
  ) {
    return true
  }
  const isGranted = await Mapbox.requestAndroidLocationPermissions()

  console.log('isGranted', isGranted)
  return isGranted
}

const [permission, setPermission] = useState(false)
  useEffect(() => {
    const task = async () => {
      const per = await hasLocationPermission()
      setPermission(per)
    }
    task()
  }, [false])

This issue has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs. Thank you for your contributions.

I just gave it a try and using requestAndroidLocationPermissions fixed the problem.

Leaving it open because I think that difference between platforms should be documented.

@brandonreavis @ciphled, can you please make sure, that you’re on current master instead of 7.0.9?

make sure to use this in your package.json

    "@react-native-mapbox-gl/maps": "git+https://github.com/react-native-mapbox-gl/maps.git#master",