即使在 ios 中允许权限,也获取[错误:缺少相机或相机胶卷权限]

问题描述 投票:0回答:1

我正在构建一个博览会反应本机应用程序。该手机是预先构建的,因此有 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",

有什么建议如何解决这个问题吗?

ios react-native expo camera-roll expo-image-picker
1个回答
0
投票

我强烈建议使用 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
© www.soinside.com 2019 - 2024. All rights reserved.