'i'm trying to join a channel but i get PlatformException(-17, request to join channel is rejected, null, null)

I'm creating a channel from agora web demo as host and trying to join the channel from the flutter app as an audience i made sure both use the same channel name, app id, and I'm generating tokens through a server and Fech them to the app.

here's my code:


import 'package:agora_rtc_engine/rtc_engine.dart';
import 'package:agora_rtc_engine/rtc_remote_view.dart' as rtc_remote_view;
import 'package:agora_rtm/agora_rtm.dart';
import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;

import '../../utilities/agora_app_id.dart';

class StreamScreen extends StatefulWidget {
  static const routeName = '/stream';
  final String channelName;
  final String userName;
  final int userID;

  const StreamScreen({
    Key? key,
    required this.channelName,
    required this.userName,
    required this.userID,
  }) : super(key: key);

  @override
  State<StreamScreen> createState() => _StreamScreenState();
}

class _StreamScreenState extends State<StreamScreen> {
  final List<int> _audience = [];
  late RtcEngine _rtcEngine;
  AgoraRtmClient? _rtmClient;
  AgoraRtmChannel? _rtmChannel;
  String? _rtmToken;
  String? _rtcToken;

  Future<void> initAgora() async {
    _rtcEngine =
        await RtcEngine.createWithContext(RtcEngineContext(agoraAppID));
    _rtmClient = await AgoraRtmClient.createInstance(agoraAppID);

    await getRTMToken();

    await _rtcEngine.enableVideo();
    await _rtcEngine.startPreview();
    await _rtcEngine.setChannelProfile(ChannelProfile.LiveBroadcasting);
    await _rtcEngine.setClientRole(ClientRole.Audience);
    await getRTCToken();

    //join the RTC & RTM Channels

    await _rtcEngine.joinChannel(
      _rtcToken,
      widget.channelName,
      null,
      0,
    );

    //event handlers for RTC Engine
    _rtcEngine.setEventHandler(RtcEngineEventHandler(
      joinChannelSuccess: (channel, uid, elapsed) {
        //TODO: add joinChannel logic
        print('joinChannelSuccess $channel $uid');
      },
      userJoined: (uid, elapsed) {
        print('User $uid joined');
      },
      leaveChannel: (rtcStats) {
        setState(() {
          _audience.clear();
        });
      },
      tokenPrivilegeWillExpire: (rtcToken) async {
        await getRTCToken();
        await _rtcEngine.renewToken(rtcToken);
      },
    ));

    //event handlers for RTM Client
    _rtmClient?.onConnectionStateChanged = (state, reason) {
      print('Connection State changed: ' +
          state.toString() +
          ', reason: ' +
          reason.toString());
      if (state == 5) {
        _rtmChannel?.leave();
        _rtmClient?.logout();
        _rtmClient?.destroy();
        print('logged out.');
      }
    };

    //event handlers for RTM Channel
    _rtmChannel?.onMemberJoined = (member) {
      print('member joined: ' + member.userId + 'channel: ' + member.channelId);
    };

    _rtmChannel?.onMemberLeft = (member) {
      print('member left: ' + member.userId + 'channel: ' + member.channelId);
    };
  }

  @override
  void initState() {
    super.initState();
    initAgora();
  }

  @override
  void dispose() {
    _audience.clear();
    _rtcEngine.leaveChannel();
    _rtcEngine.destroy();
    _rtmChannel?.leave();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: rtc_remote_view.SurfaceView(
          channelId: widget.channelName,
          uid: widget.userID,
          zOrderOnTop: true,
          zOrderMediaOverlay: true,
        ),
        // const Toolbar(),
      ),
    );
  }

  Future<void> getRTMToken() async {
    final response = await http.get(
      Uri.parse(
          'https://*********************.com/rtm/${widget.userID}/?expiry=7000'),
    );

    if (response.statusCode == 200) {
      setState(() {
        _rtmToken = response.body;
        _rtmToken = jsonDecode(_rtmToken!)['rtmToken'];
      });
      print('rtm: ' + _rtmToken!);
    } else {
      print('Failed to fetch the token');
    }
  }

  Future<void> getRTCToken() async {
    final response = await http.get(
      Uri.parse(
          'https://******************.com/rtc/${widget.channelName}/audience/uid/${0}/?expiry=7000/'),
    );

    if (response.statusCode == 200) {
      setState(() {
        _rtcToken = response.body;
        _rtcToken = jsonDecode(_rtcToken!)['rtcToken'];
      });
      print('rtc: ' + _rtcToken!);
    } else {
      print('Failed to fetch the token');
    }
  }
}

i get this error:

#0      StandardMethodCodec.decodeEnvelope (package:flutter/src/services/message_codecs.dart:607:7)
#1      MethodChannel._invokeMethod (package:flutter/src/services/platform_channel.dart:177:18)
<asynchronous suspension>
#2      _StreamScreenState.initAgora (package:malhamti_app/screens/stream/stream_screen.dart:58:5)
<asynchronous suspension>
  • what am i doing wrong?
  • do i need to set up the RTM channel/client, when I'm just wanting video streaming?
  • What does the number -17 in the error mean?


Solution 1:[1]

Error code 17 occurs when a user is already in the channel and you try to join the channel again. Make sure that you call leaveChannel() method before leaving the channel.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 meherdeep thakur