首页 > 解决方案 > Agora React-Native No Video Feed (Audio Only) 在较新的 Android 设备上部署的应用程序(是 S10,Pixel 3)

问题描述

我们一直在使用 react-native-agora https://github.com/syanbo/react-native-agora在我们的 react native 移动应用程序中提供视频聊天。它在 iPhone 和较旧的 Android 设备(即 Galaxy S8)上完美运行,但是当使用较新的 Android 设备(即 Galaxy S10 或 Pixel 3)的用户加入频道时,只有他们的音频通过(即他们的视频源仅显示黑色筛选给他们和他们的渠道合作伙伴)。

视频源适用于模拟版本,但不适用于提交到 PlayStore 的 APK。当我们在较新的 Android 设备(即 Galaxy S10)上构建最终的 APK 文件进行测试时,调用工作正常。但是,当我们在它获得批准并从 Google Play 商店下载到构建成功的 APK 测试版本的同一个 S10 后安装它时,我们得到了相同的纯音频(即没有视频源/黑屏)错误。

我们认为这不是代码问题,因为它可以在所有旧手机上构建和运行。但是这里有一些关于我们的代码的细节

componentDidMount () {
    RtcEngine.getSdkVersion((version) => {
      console.log('[RtcEngine] getSdkVersion', version);
    })

    console.log('[joinChannel] ' + this.props.channelName);
    RtcEngine.joinChannel(this.props.channelName, this.props.uid);
    RtcEngine.enableAudioVolumeIndication(500, 3);
  }

和:

export default function AgoraRTCViewContainer(props) {

  const { navigation } = props;
  const channelProfile = navigation.getParam('channelProfile', 1);
  const clientRole = navigation.getParam('clientRole', Host);
  const channelName = navigation.getParam('channelName', 'agoratest');
  const uid = navigation.getParam('uid', Math.floor(Math.random() * 100));
  const onCancel = navigation.getParam('onCancel');

  return (<AgoraRTCView
    channelProfile={channelProfile}
    channelName={channelName}
    clientRole={clientRole}
    uid={uid}
    onCancel={onCancel}
    {...props}
  ></AgoraRTCView>);
}

和:

RtcEngine.on('userJoined', (data) => {
        console.log('[RtcEngine] onUserJoined', data);
        const {peerIds} = this.state;
        if (peerIds.indexOf(data.uid) === -1) {
          this.setState({
            peerIds: [...peerIds, data.uid],

            // when peer joins chat, set selectedUid to their id and visible to true to make their video pop up as AudioProfileDefault
            selectedUid: data.uid,
            visible: true,
          })
        }
      });
    RtcEngine.on('userOffline', (data) => {
        console.log('[RtcEngine] onUserOffline', data);
        this.setState({
            peerIds: this.state.peerIds.filter(uid => uid !== data.uid)
        })
        console.log('peerIds', this.state.peerIds, 'data.uid ', data.uid)
      });
    RtcEngine.on('joinChannelSuccess', (data) => {
        console.log('[RtcEngine] onJoinChannelSuccess', data);
        RtcEngine.startPreview();
        this.setState({
          joinSucceed: true,
          animating: false
        })
    });

我们最初认为这是某种类型的权限错误,但我们在 AndroidManifest.XML 中这样请求它们:

    <uses-permission android:name="android.permission.READ_PHONE_STATE" />    
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.RECORD_AUDIO" />
    <uses-permission android:name="android.permission.CAMERA" />
    <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <!-- The Agora SDK requires Bluetooth permissions in case users are using Bluetooth devices.-->
    <uses-permission android:name="android.permission.BLUETOOTH" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />

并在应用程序中使用 PermissionsAndroid 请求他们。

你认为什么可以解决这个问题?

标签: androidreact-nativevideochatagora.io

解决方案


推荐阅读