Почему реагирует родная камера перестает записывать рано? - PullRequest
0 голосов
/ 22 января 2019

Когда я звоню const data = await cam.recordAsync(options);, обещание сразу же разрешается и уходит очень рано, прежде чем я явно позвоню cam.stopRecording().

Я пытался передать экземпляр камеры как свойство, но у него проблемы с чтением функций этого свойства, таких как recordAsync. Операторы console.warn вызываются только один раз, поэтому функция не вызывается дважды.

/ CameraContainer.tsx

public render() {
    return (
      <Camera
        onRecord={this.onRecord}
        onCameraTouch={this.onCameraTouch}
        isRecording={this.state.isRecording}
        cameraType={this.state.cameraType} />
    )
  }

  private onRecord = (cam: RNCamera) => {
    this.setState(
      {
        isRecording: !this.state.isRecording
      },
      async () => {
        console.warn(`recordingStatus changed to ${this.state.isRecording}`)
        if (this.state.isRecording) {
          const options: RecordOptions = {
            quality: RNCamera.Constants.VideoQuality['480p'],
            maxDuration: 15
          };
          console.warn(options);
          try {
            const data = await cam.recordAsync(options);
            console.warn('recording finished navigating away');
            this.props.navigation.navigate('RecordingReview', {
              videoUri: data.uri
            });
          } catch {
            console.warn('error');
          }
        } else {
          console.warn('Stopping video recording');
          // cam.stopRecording();
        }
      }
    );
  }

/ Camera.tsx

interface IProps {
  cameraType: any,
  isRecording: boolean,
  onCameraTouch: () => void,
  onRecord: (cam: RNCamera) => void,
}

export default class Camera extends PureComponent<IProps> {
  private camera!: RNCamera;

  public render() {
    return (
      <RNCamera
        ref={(cam: RNCamera) => {
          this.camera = cam;
        }}
        style={Styles.camera}
        type={this.props.cameraType}
        permissionDialogTitle={I18n.t('RECORDING_permissionTitle')}
        permissionDialogMessage={I18n.t('RECORDING_permissionMessage')}
        defaultVideoQuality={RNCamera.Constants.VideoQuality['480p']}
      >
        <RecordingControlsContainer
          defaultCameraType={this.props.cameraType}
          onCameraTouch={this.props.onCameraTouch}
          onRecord={() => { this.props.onRecord(this.camera) }}
          isRecording={this.props.isRecording} />
      </RNCamera>
    )
  }
}

/ RecordingIconContainer.tsx

interface IProps {
  style?: ViewStyle,
  onRecord: () => void
}

interface IState {
  isRecording: boolean
}

export default class RecordingIconContainer extends Component<IProps> {
  public readonly state: IState = {
    isRecording: false
  };

  public render() {
    return (
      <View style={this.props.style}>
        <RecordingIcon onPress={this.flipIcon} isRecording={this.state.isRecording} />
      </View>
    )
  }

  private flipIcon = () => {
    this.setState({ isRecording: !this.state.isRecording });
    this.props.onRecord();
  };
}

Я ожидаю, что await cam.recordAsync(options) будет ждать до тех пор, пока не будет достигнут maxDuration или maxFileSize, или я явно позвоню cam.stopRecording(), но он сразу исчезнет после того, как я начну запись.

...