DocumentPicker в React-Native не работает должным образом для устройств Android

#react-native #upload #document #picker

#react-native #загрузка #документ #средство выбора

Вопрос:

Я внедрил средство выбора документов в своем приложении react native, и оно отлично работает для iOS. Однако в Android у меня странная проблема

Когда я открываю средство выбора документов, и навигация переходит в проводник файлов (раздел загрузок) на телефоне Android, хотя я могу выбрать файл pdf, но, когда дело доходит до приложения, оно прилипает к странице, а файла там нет. Я прикрепил скриншот с таким же поведением, когда проводник переходит к последним файлам. Только когда из последних файлов я выбираю Google Диск и пытаюсь выбрать оттуда PDF-файл, он работает должным образом, и я вижу файл в своем приложении, и приложение не зависает.

Вот что я написал для средства выбора документов PDF

 selectPDF = async ()=>{

      
        var imageList = [...this.state.files];


        try {
            const results = await DocumentPicker.pickMultiple({
            type: [DocumentPicker.types.pdf],
            });
            for (const res of results) {

                    console.log(
                        res.uri,
                        res.type, // mime type
                        res.name,
                        res.size
                    );

                    const fileName = res.uri.replace("file://","");
                    let data1 = ''
                    RnFetchBlob.fs.readStream(
                        fileName,
                        'base64',
                        4095
                    )
                    .then((ifstream)=>{
                        //let data1 = ''
                        ifstream.open()
                        ifstream.onData((data)=>{
                            data1  = data;


                        })

                        ifstream.onEnd(() => {
                           
                            let base64 = data1
                   
                                                     
                            imageList.push({
                                imageName:res.name,
                                image:base64,
                                mime:res.type,
                                size:res.size
                            })

                            this.setState({
                                ...this.state,
                                openCamera:false,
                                lastFileName:imageList[imageList.length - 1].imageName,
                                files:imageList
                            })

                        })
                    })



            }
        } catch (err) {
            if (DocumentPicker.isCancel(err)) {
                    this.closeModal();
            } else {
            throw err;
            }
        }
    }
  

введите описание изображения здесь
Может кто-нибудь рассказать о том, чего мне может не хватать. Необходимо установить некоторую конфигурацию на уровне устройства или любую другую вещь.

Ответ №1:

вы можете использовать что-то вроде этого,

 const [file, setFile] = useState(null);
  
 const selectFile = async () => {
    try {
      const results = await DocumentPicker.pickMultiple({
        type: [DocumentPicker.types.allFiles],
      });
      setFile(results);
    } catch (err) {
      if (DocumentPicker.isCancel(err)) {
        alert('Canceled');
      } else {
        alert('Unknown Error: '   JSON.stringify(err));
        throw err;
      }
    }
  };
  

теперь вы можете вызвать file в своей функции
и использовать его, вы можете сделать так

 <TouchableOpacity
            activeOpacity={0.5}
            onPress={selectFile}>
            <Text>Select File</Text>
</TouchableOpacity>