Работает в отладке, но не в выпуске | экспо-ав | реагирует-нативный-unimodules - PullRequest
0 голосов
/ 21 апреля 2020

Среда

Expo CLI 3.11.1 информация о среде: Система: ОС: Windows 10 Двоичные файлы: Пряжа: 1.22.4 - C: \ Users \ user \ AppData \ Roaming \ npm \ yarn .CMD npm: 6.12.0 - C: \ Program Files \ nodejs \ npm .CMD IDE: Android Studio: версия 3.6.0.0 AI-192.7142.36.36.6308749

React-native android на устройстве

Шаг к воспроизведению:

1.

npx react-native init ReactRelease --version 0.62.2
npm install react-native-unimodules@0.9.0 --save 
expo install expo-av

2.

Настройте свой файлы в соответствии с do c в каждой библиотеке

3.

Редактировать Приложение. js

import React, { Component } from 'react';
import { Text, StyleSheet, View, Button, Alert } from 'react-native';
import { Audio } from 'expo-av';
import * as Permissions from 'expo-permissions';

var audioObjectActions = new Audio.Sound();

export default class App extends Component {
    constructor(props) {
        super(props);

        this.state = {};
    }

    async componentDidMount() {
        await Permissions.askAsync(Permissions.AUDIO_RECORDING);
        await Audio.setAudioModeAsync({
            staysActiveInBackground: true,
            allowsRecordingIOS: false,
            interruptionModeIOS: Audio.INTERRUPTION_MODE_IOS_DUCK_OTHERS,
            playsInSilentModeIOS: true,
            playThroughEarpieceAndroid: false,
            interruptionModeAndroid: Audio.INTERRUPTION_MODE_ANDROID_DUCK_OTHERS,
            shouldDuckAndroid: true
        });
    }

    async _playRandomAction() {
        try {
            audioObjectActions.setOnPlaybackStatusUpdate(this._onPlaybackStatusUpdateAction);
            await audioObjectActions.loadAsync(require('./assets/song_sound.m4a'));
            await audioObjectActions.playAsync();
        } catch (error) {
            Alert.alert('ERROR : ', '' + JSON.stringify(error));
        }
    }

    _onPlaybackStatusUpdateAction = async (playbackStatus) => {
        if (!playbackStatus.isLoaded) {
            // Update your UI for the unloaded state
            if (playbackStatus.error) {
                console.log(`Encountered a fatal error during playback: ${playbackStatus.error}`);
                // Send Expo team the error on Slack or the forums so we can help you debug!
            }
        } else {
            if (playbackStatus.didJustFinish && !playbackStatus.isLooping) {
                await audioObjectActions.stopAsync();
                await audioObjectActions.unloadAsync();
            }
        }
    };

    render() {
        return (
            <View style={styles.container}>
                <Text> Test Audio </Text>
                <Button title="On joue le morceau" onPress={async () => this._playRandomAction()} />
            </View>
        );
    }
}

const styles = StyleSheet.create({
    container: {
        flex: 1,
        justifyContent: 'center',
        alignItems: 'center',
        backgroundColor: '#555555'
    }
});

4.

Создайте папку активов и добавьте song_sound.m4a следующим образом: bug

5

Подключите устройство android через USB

Тестирование в Отладка :

//POWERSHELL 1
npx react-native run-android   

//POWERSHELL 2
npm start 

Поведение

Работает отлично: звук загружается и воспроизводится

Тест в выпуск

cd android 
./gradlew assembleRelease
./gradlew installRelease

Поведение

Звук не загружается, и отображается сообщение об ошибке:

{
    "nativeStackAndroid":[],
    "userInfo":null,
    "message":"com.google.android.exoplayer2.upstream.FileDataSource$FileDataSourceException: java.io.FileNotFoundException: assets_song_sound: open fialed: ENOENT (No such file or directory)",
    "code":"E_LOAD_ERROR",
    "line": 18,
    "column": 1111,
    "sourceURL":"index.android.bundle"
}

Что я хочу?

Просто загрузите и воспроизведите аудио в выпуске juste, как при отладке.

1 Ответ

0 голосов
/ 21 апреля 2020

Я наконец-то нашел ответ.

Как это работает

require()

плохо работает в релизе.


Не знаю почему require () хорошо работает в версии с Image , но не с Audio

Так что вам нужно использовать

{ uri: 'asset:/my_sound.m4a' }

и поместите ваш звуковой файл (например, my_sound.m4a) в android / app / src / main / assets: FOLDER STRUCTURE

И это будет работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...