react-native-image-picker在android 10中不起作用

问题描述

我正在处理一个项目,需要使用相机或从“资源库”中选择图像,因此使用了React Native Image Picker,它在开发模式下工作正常,在生产环境中,它在Android 10中不起作用,只有我尝试了很多来自github的解决方案,例如权限 我在清单中添加了android:requestLegacyExternalStorage =“ true”,但它导致了我,并且在我要在开发以及生产环境中构建时都找不到错误android:requestLegacyExternalStorage

我将sdk目标更新为29个相同的问题

我的图像选择器代码

const options = {
  cancelButtonTitle: strings.cancel,takePhotoButtonTitle: strings.takePicture,chooseFromLibraryButtonTitle: strings.chooseFromLibrary,title: strings.selectPhoto,quality: 0.1,noData: true,storageOptions: {
    skipBackup: true,path: 'images',cameraRoll: true,waitUntilSaved: true,},};

const pickImage = () => {
  const promise = new Promise(async (resolve,reject) => {
    if (Platform.OS === 'android') {
      try {
        await PermissionsAndroid.requestMultiple([
          PermissionsAndroid.PERMISSIONS.CAMERA,PermissionsAndroid.PERMISSIONS.WRITE_EXTERNAL_STORAGE,]);

        const permissionCamera = await PermissionsAndroid.check(
          'android.permission.CAMERA',);
        const permissionWriteStorage = await PermissionsAndroid.check(
          'android.permission.WRITE_EXTERNAL_STORAGE',);

        if (!permissionCamera || !permissionWriteStorage) {
          console.log('Failed to get the required permissions.');
        }

        const source = await openPicker();

        resolve(source);
      } catch (error) {
        reject(error);
        console.log('Failed to get the required permissions.');
      }
    } else {
      try {
        const source = await openPicker();
        resolve(source);
      } catch (error) {
        reject(error);
        console.log('Failed to get the required permissions.');
      }
    }
  });
  return promise;
};

const openPicker = () => {
  const promise = new Promise((resolve,reject) => {
    ImagePicker.showImagePicker(options,response => {
      if (response.didCancel) {
        console.log('User cancelled image picker');
      } else if (response.error) {
        console.log('ImagePicker Error: ',response.error);
        reject(response.error);
      } else if (response.customButton) {
        console.log('User tapped custom button: ',response.customButton);
      } else {
        const source = {
          uri: response.path ? `file://${response.path}` : response.uri,name: response.fileName ? response.fileName : 'picture_0.jpg',filename: response.fileName ? response.fileName : 'picture_0.jpg',type: response.type,};

        resolve(source);
      }
    });
  });

  return promise;
};

const openCamera = () => {
  const promise = new Promise((resolve,reject) => {
    ImagePicker.launchCamera(options,};

        resolve(source);
      }
    });
  });

  return promise;
};

const openGallery = () => {
  const promise = new Promise((resolve,reject) => {
    ImagePicker.launchImageLibrary(options,};

        resolve(source);
      }
    });
  });

  return promise;
};

export {pickImage,openCamera,openGallery};

我的清单权限

<uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
    <uses-permission android:name="android.permission.CAMERA" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

一些Android信息

 buildToolsVersion = "28.0.3"
        minSdkVersion = 16
        compileSdkVersion = 28
        targetSdkVersion = 29

那么有人有解决方案吗?

解决方法

在AndroidMenifest.xml文件中添加android:requestLegacyExternalStorage="true"适用于Android10。将其添加为Application标签的属性。

使用目标版本为29。这是有关build.gradle文件的一些信息。

  buildToolsVersion = "29.0.2"
  minSdkVersion = 16
  compileSdkVersion = 29
  targetSdkVersion = 29
  supportLibVersion = "29.0.0"

但是,该解决方案不适用于Android11。这是目前的最新版本。

,

作为参考:GitHub上有一个针对此问题的线程,其中包含更多信息:https://github.com/react-native-image-picker/react-native-image-picker/issues/1393#issuecomment-690312980

另一种建议的解决方案是将targetSDK降至版本28(android / build.gradle):

    buildToolsVersion = "28.0.3"
    minSdkVersion = 16
    compileSdkVersion = 28
    targetSdkVersion = 28

另一注:如果您仅使用相机而不是从图库中选择功能,并且如果您不希望照片出现在图库中,则也可以设置此选项而无需更改SDK版本或设置任何旧选项:

storageOptions={{ privateDirectory: true  }}
,

如果图像选择器仍然无法正常工作,那么您可以使用 react-native-image-crop-picker

之后,您必须选择图片按钮和选择相机按钮并执行由图像图片代码组成的功能

ImagePicker.openPicker({
    multiple: true,}).then(images => {})

和相机

ImagePicker.openCamera({
    width: 300,height: 400,cropping: false,}).then(images => {})

其中 images 是您的图像文件,获取该文件的路径并将其显示在 uri:

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...