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:
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)
I've got the same issue on Android Only
Honor 8X
Android 9
RN 0.59.10
Same here with <MapboxGL.UserLocation />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> exists.
SDK Version: 28
React Native Version: 0.59.9
Device: Android 8.0
You need to explicitly ask access to permissions now
@RichardLindhout yes since Android 4.4
But it's crashing before asking access to the permissions
Do not render before you know it has a permission
{hasPermission &&
Yes, it's the fix I'm using actually, but it's not supposed to make my app crash
@tinmar33 are you receiving the same errors as @karlguillotte mentioned above? Do you have any similar details about what you're seeing? (environment details, logs, etc)
@karlguillotte have you tried this recommendation of enforcing location permission before rendering the Mapbox.UserLocation context?
@segheysens I have not, I will. It is a different behavior then previous version and it should probably be documented. Thanks! I will keep you posted.
@segheysens Yes, i get the same errors as him (same logs / environment)
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.
This fix seems better than mine (using React NativePermissionAndroid feature)
Thanks @karlguillotte
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.
Same problem here!
Same issue, despite explicitly requesting permissions with const isGranted = await Mapbox.requestAndroidLocationPermissions();, and adding permissions to the android manifest. I followed the above example to a tee as well. Any advice or hints would be greatly appreciated!
@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",
@ferdicus I can confirm that I'm using 7.0.9 and not the current master. I'll change the version to the current master and get back to you -- I'm adamant the instability is due to this. Thanks!
@ferdicus It's generating gradle build errors, so I'll have to do a full rebuild from scratch tomorrow. Thanks again -- hopefully the latest update resolves the instability :).
@ferdicus @brandonreavis I had stability issues with the latest build as well. What ultimately worked was downgrading to 7.0.8. I'll upgrade to 8.0.0^ once it's proven to be stable. Cheers for the effort.
Most helpful comment
Some code snippets. Thanks @karlguillotte :-)