![](/img/trans.png)
[英]React Native: Android app crash after location permission is denied by user
[英]React Native Map crash app when getting location
我的項目顯示一個 react native map 並詢問用戶位置。 在開發過程中,當我構建應用程序並在應用程序崩潰時安裝它時,應用程序運行時沒有錯誤或錯誤或減速。
Demo1: developpement npx expo 中的 DEMO gif 應用程序開始:工作正常Demo2:使用 apk 安裝的 DEMO gif 應用程序:崩潰
我用:
"react-native": "0.70.5", "expo": "~47.0.12" "expo-location": "~15.0.1", "@react-native-community/geolocation": "^3.0. 4", "react-native-maps": "^1.3.2",
我的文件包含我的 map:
import React, { useEffect, useRef, useState } from "react";
import {
...
} from "react-native";
import { StatusBar } from "expo-status-bar";
import * as Location from "expo-location";
import MapView, { Marker } from "react-native-maps";
import { Alert } from "react-native";
const Planisphere = () => {
const [location, setLocation] = useState(null);
const [errorMsg, setErrorMsg] = useState(null);
const [mapRef, setMapRef] = useState(null);
const [locationAccepted, setLocationAccepted] = useState(false);
useEffect(() => {
(async () => {
let { status } = await Location.requestForegroundPermissionsAsync();
if (status !== "granted") {
setErrorMsg("Permission to access location was denied");
Alert.alert(
"Location Permission Denied",
"Please go to settings and enable location permission for this app to continue.",
[
{
text: "Go to Settings",
onPress: () => Linking.openSettings(),
},
]
);
return;
}
let subscription = await Location.watchPositionAsync(
{ accuracy: Location.Accuracy.BestForNavigation },
(location) => {
setLocation(location);
setLocationAccepted(true);
}
);
return () => subscription.remove();
})();
}, []);
const handleFindMyLocation = () => {
...
};
const handleUnzoom = () => {
...
};
let text = "Waiting..";
if (errorMsg) {
text = errorMsg;
} else if (location) {
text = JSON.stringify(location);
}
return (
<View style={styles.container}>
<StatusBar style="auto" />
{location && (
<MapView
ref={(ref) => setMapRef(ref)}
style={styles.map}
minZoomLevel={8}
maxZoomLevel={18}
initialRegion={{
latitude: location.coords.latitude,
longitude: location.coords.longitude,
latitudeDelta: 0.0922,
longitudeDelta: 0.0421,
}}
>
<Marker
coordinate={{
latitude: location.coords.latitude,
longitude: location.coords.longitude,
}}
title={"Your location"}
/>
</MapView>
)}
<Text style={styles.paragraph}>{text}</Text>
{locationAccepted && (
<View>
<Button title="Find my location" onPress={handleFindMyLocation} />
<Button title="Unzoom" onPress={handleUnzoom} />
</View>
)}
</View>
);
};
const styles = StyleSheet.create({
...
});
export default Planisphere;
我的文件詢問位置,當它被授權時,map 出現。
更新:
useEffect(() => {
const fetchPermission = async () => {
try {
const { status } = await Location.requestForegroundPermissionsAsync();
setPermissions(status);
if (status !== "granted") {
setErrorMsg("Permission to access location was denied");
}
} catch (err) {
setErrorMsg(err.message);
}
};
fetchPermission();
}, []);
useEffect(() => {
const fetchLocation = async () => {
if (permissions === "granted") {
const watcher = await Location.watchPositionAsync(
{ accuracy: Location.Accuracy.BestForNavigation },
(location) => {
setLocation(location);
setLocationAccepted(true);
}
);
setSubscription(watcher);
}
};
fetchLocation();
return () => {
if (subscription) {
subscription.remove();
}
};
}, [permissions]);
Android清單
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.flokitoto.mapauthentificate">
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
<uses-permission android:name="android.permission.VIBRATE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<queries>
<intent>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.BROWSABLE"/>
<data android:scheme="https"/>
</intent>
</queries>
<application android:name=".MainApplication" android:label="@string/app_name" android:icon="@mipmap/ic_launcher" android:roundIcon="@mipmap/ic_launcher_round" android:allowBackup="true" android:theme="@style/AppTheme" android:usesCleartextTraffic="true">
<meta-data android:name="expo.modules.updates.ENABLED" android:value="true"/>
<meta-data android:name="expo.modules.updates.EXPO_SDK_VERSION" android:value="47.0.0"/>
<meta-data android:name="expo.modules.updates.EXPO_UPDATES_CHECK_ON_LAUNCH" android:value="ALWAYS"/>
<meta-data android:name="expo.modules.updates.EXPO_UPDATES_LAUNCH_WAIT_MS" android:value="0"/>
<meta-data android:name="expo.modules.updates.EXPO_UPDATE_URL" android:value="https://exp.host/@flokitoto/mapauthentificate"/>
<activity android:name=".MainActivity" android:label="@string/app_name" android:configChanges="keyboard|keyboardHidden|orientation|screenSize|uiMode" android:launchMode="singleTask" android:windowSoftInputMode="adjustResize" android:theme="@style/Theme.App.SplashScreen" android:exported="true" android:screenOrientation="portrait">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.BROWSABLE"/>
<data android:scheme="com.flokitoto.mapauthentificate"/>
<data android:scheme="com.flokitoto.mapauthentificate"/>
</intent-filter>
</activity>
<activity android:name="com.facebook.react.devsupport.DevSettingsActivity" android:exported="false"/>
</application>
</manifest>
更新:
來自日志的錯誤:
FATAL EXCEPTION: expo-updates-error-recovery
java.lang.RuntimeException: API key not found. Check that <meta-data android:name="com.google.android.geo.API_KEY" android:value="your API key"/> is in the <application> element of AndroidManifest.xml
FATAL EXCEPTION: expo-updates-error-recovery
Process: com.flokitoto.mapauthentificate, PID: 14044
java.lang.RuntimeException: API key not found. Check that <meta-data android:name="com.google.android.geo.API_KEY" android:value="your API key"/> is in the <application> element of AndroidManifest.xml
從錯誤
FATAL EXCEPTION: expo-updates-error-recovery
java.lang.RuntimeException: API key not found. Check that <meta-data android:name="com.google.android.geo.API_KEY" android:value="your API key"/> is in the <application> element of AndroidManifest.xml
FATAL EXCEPTION: expo-updates-error-recovery
Process: com.flokitoto.mapauthentificate, PID: 14044
java.lang.RuntimeException: API key not found. Check that <meta-data android:name="com.google.android.geo.API_KEY" android:value="your API key"/> is in the <application> element of AndroidManifest.xml
我看到問題出在谷歌地圖的 API 鍵中
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.