我正在构建一个博览会反应本机应用程序。该手机是预先构建的,因此有 IOS 和 Android 文件夹分开。我将权限添加到 Info.plist 文件,如 https://github.com/expo/expo/tree/sdk-50/packages/expo-image-picker 中所述。然后启动相机的代码如下,
async captureImageFromCamera(): Promise<ImagePicker.ImagePickerAsset[] | null> {
const permissionStatus = await ImagePicker.requestCameraPermissionsAsync();
console.log(permissionStatus)
if (permissionStatus.granted) {
const response = await ImagePicker.launchCameraAsync({ mediaTypes: ImagePicker.MediaTypeOptions.Images });
if (response.canceled) {
throw new OperationCancelledError('Operation was cancelled by the user');
}
return response?.assets;
}
console.log(permissionStatus)
throw new PermissionDeniedError('Camera Permissions are denied');
}
但是即使我允许我的 ios 设备中的权限,我也会收到此错误 [错误:缺少相机或相机胶卷权限]
即使我接受了相机权限,当我使用
{"canAskAgain": false, "expires": "never", "granted": false, "status": "denied"}
查询权限状态时,我仍然得到
getCameraPermissionsAsync()
这些是我的依赖版本
"expo": "50.0.6",
"react-native": "0.73.2",
"expo-image-picker": "14.7.1",
有什么建议如何解决这个问题吗?
我强烈建议使用 useCameraPermissions hook 来获取用户的权限并相应地使用 UI 进行操作。
import * as ImagePicker from 'expo-image-picker'
import * as Linking from 'expo-linking'
const [cameraStatus, requestCameraPermission] = ImagePicker.useCameraPermissions()
const handleCameraPermission = useCallback(async () => {
if (cameraStatus) {
if (
cameraStatus.status === ImagePicker.PermissionStatus.UNDETERMINED ||
(cameraStatus.status === ImagePicker.PermissionStatus.DENIED && cameraStatus.canAskAgain))
{
const permission = await requestCameraPermission()
if (permission.granted) {
await handleLaunchCamera()
}
} else if (cameraStatus.status === ImagePicker.PermissionStatus.DENIED) {
await Linking.openSettings()
} else {
await handleLaunchCamera()
}
}
}, [cameraStatus, handleLaunchCamera, requestCameraPermission])
const handleLaunchCamera = useCallback(async () => {
const result = await ImagePicker.launchCameraAsync({
mediaTypes: ImagePicker.MediaTypeOptions.Images,
allowsEditing: true,
quality: 1,
aspect: [3, 4],
})
if (!result.canceled) {
// your success logic using result.assets
}
}, [])
return (//any UI element as Button, Pressable or dialog
that triggers handleCameraPermission() function)enter code here