我们一直在使用 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 请求他们。
你认为什么可以解决这个问题?