在我的 flutter 应用程序中使用 Agora rtc 引擎时出现问题

2023-12-07

我在使用 agora rtc 引擎时遇到问题。每次启动项目时我都会收到此错误消息

https://pastebin.com/DuniUQYd

我不知道问题是什么,因为错误消息对我来说不是很清楚。在代码中,我还发布了我正在使用的频道名称应用程序 ID 和令牌,也是我生成的

这也是代码

import 'package:agora_rtc_engine/agora_rtc_engine.dart';
import 'package:flutter/material.dart';
import 'package:permission_handler/permission_handler.dart';

class LiveStreaming extends StatefulWidget {
 const LiveStreaming({Key? key}) : super(key: key);

 @override
 _LiveStreamingState createState() => _LiveStreamingState();
}

class _LiveStreamingState extends State<LiveStreaming> {
 String appId = '4235f9d46dd349e0b9df3ad2ea011b7d';
 String channelName = "ajanba";
 String token = "007eJxTYHCe9kzt0Gtu0ZfqVv99H1YoVC06Yltmoth98HnQfaFEEX4FBhMjY9M0yxQTs5QUYxPLVIMky5Q048QUo9REA0PDJPOUtXmJyQ2BjAxxB+cyMzJAIIjPxpCYlZiXlMjAAABaqB+p";

 int uid = 0; // uid of the local user

 int? _remoteUid; // uid of the remote user
 bool _isJoined = false; // Indicates if the local user has joined the channel
 bool _isHost =
     true; // Indicates whether the user has joined as a host or audience
 late RtcEngine agoraEngine; // Agora engine instance

 final GlobalKey<ScaffoldMessengerState> scaffoldMessengerKey =
     GlobalKey<ScaffoldMessengerState>(); // Global key to access the scaffold

 showMessage(String message) {
   scaffoldMessengerKey.currentState?.showSnackBar(SnackBar(
     content: Text(message),
   ));
 }

 @override
 void initState() {
   super.initState();
   // Set up an instance of Agora engine
   setupVideoSDKEngine();
 }

 Future<void> setupVideoSDKEngine() async {
   // retrieve or request camera and microphone permissions
   await [Permission.microphone, Permission.camera].request();

   //create an instance of the Agora engine
   agoraEngine = createAgoraRtcEngine();
   await agoraEngine.initialize(RtcEngineContext(appId: appId));

   await agoraEngine.enableVideo();

   // Register the event handler
   agoraEngine.registerEventHandler(
     RtcEngineEventHandler(
       onJoinChannelSuccess: (RtcConnection connection, int elapsed) {
         showMessage(
             "Local user uid:${connection.localUid} joined the channel");
         setState(() {
           _isJoined = true;
         });
       },
       onUserJoined: (RtcConnection connection, int remoteUid, int elapsed) {
         showMessage("Remote user uid:$remoteUid joined the channel");
         setState(() {
           _remoteUid = remoteUid;
         });
       },
       onUserOffline: (RtcConnection connection, int remoteUid,
           UserOfflineReasonType reason) {
         showMessage("Remote user uid:$remoteUid left the channel");
         setState(() {
           _remoteUid = null;
         });
       },
     ),
   );
 }

 void join() async {
   // Set channel options
   ChannelMediaOptions options;

   // Set channel profile and client role
   if (_isHost) {
     options = const ChannelMediaOptions(
       clientRoleType: ClientRoleType.clientRoleBroadcaster,
       channelProfile: ChannelProfileType.channelProfileLiveBroadcasting,
     );
     await agoraEngine.startPreview();
   } else {
     options = const ChannelMediaOptions(
       clientRoleType: ClientRoleType.clientRoleAudience,
       channelProfile: ChannelProfileType.channelProfileLiveBroadcasting,
     );
   }

   await agoraEngine.joinChannel(
     token: token,
     channelId: channelName,
     options: options,
     uid: uid,
   );
 }

 @override
 void dispose() async {
   await agoraEngine.leaveChannel();
   super.dispose();
 }

 void leave() {
   setState(() {
     _isJoined = false;
     _remoteUid = null;
   });
   agoraEngine.leaveChannel();
 }

 @override
 Widget build(BuildContext context) {
   return MaterialApp(
     scaffoldMessengerKey: scaffoldMessengerKey,
     home: Scaffold(
         appBar: AppBar(
           title: const Text('Get started with Interactive Live Streaming'),
         ),
         body: ListView(
           padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 4),
           children: [
             // Container for the local video
             Container(
               height: 240,
               decoration: BoxDecoration(border: Border.all()),
               child: Center(child: _videoPanel()),
             ),
             // Radio Buttons
             Row(children: <Widget>[
               Radio<bool>(
                 value: true,
                 groupValue: _isHost,
                 onChanged: (value) => _handleRadioValueChange(value),
               ),
               const Text('Host'),
               Radio<bool>(
                 value: false,
                 groupValue: _isHost,
                 onChanged: (value) => _handleRadioValueChange(value),
               ),
               const Text('Audience'),
             ]),
             // Button Row
             Row(
               children: <Widget>[
                 Expanded(
                   child: ElevatedButton(
                     child: const Text("Join"),
                     onPressed: () => {join()},
                   ),
                 ),
                 const SizedBox(width: 10),
                 Expanded(
                   child: ElevatedButton(
                     child: const Text("Leave"),
                     onPressed: () => {leave()},
                   ),
                 ),
               ],
             ),
             // Button Row ends
           ],
         )),
   );
 }

 Widget _videoPanel() {
   if (!_isJoined) {
     return const Text(
       'Join a channel',
       textAlign: TextAlign.center,
     );
   } else if (_isHost) {
     // Local user joined as a host
     return AgoraVideoView(
       controller: VideoViewController(
         rtcEngine: agoraEngine,
         canvas: VideoCanvas(uid: uid),
       ),
     );
   } else {
     // Local user joined as audience
     if (_remoteUid != null) {
       return AgoraVideoView(
         controller: VideoViewController.remote(
           rtcEngine: agoraEngine,
           canvas: VideoCanvas(uid: _remoteUid),
           connection: RtcConnection(channelId: channelName),
         ),
       );
     } else {
       return const Text(
         'Waiting for a host to join',
         textAlign: TextAlign.center,
       );
     }
   }
 }

// Set the client role when a radio button is selected
 void _handleRadioValueChange(bool? value) async {
   setState(() {
     _isHost = (value == true);
   });
   if (_isJoined) leave();
 }
}

我刚刚用 agora 完成了我的项目,所以也许我可以帮助你,但你粘贴的上述问题的错误消息链接不起作用, 请尽快更新以便快速解决

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在我的 flutter 应用程序中使用 Agora rtc 引擎时出现问题 的相关文章

随机推荐

  • Java 中 == 和 .equals 之间的区别。

    我知道这已经被涵盖了 但我在这里看到了不一致的论点 所以如果我有 String a apple2e String b apple2e System out println a b a b I get FALSE 据我了解 这是因为a and
  • 将工件添加到标准 Maven 部署

    我希望有人可以帮助我进行 Maven 部署 通常通过发布插件运行 我想在发布时将除了打包的 jar 之外的文件部署到存储库 例如特定的说明文档和生成的 SQL 文件 如果我不必使用就好了deploy deploy file为每一个 如果我可
  • 如何控制 PyYAML 对我的数据使用哪种标量形式?

    我有一个具有短字符串属性和长多行字符串属性的对象 我想将短字符串写为 YAML 带引号的标量 将多行字符串写为文字标量 my obj short Hello my obj long Line1 nLine2 nLine3 我希望 YAML
  • 用户身份验证后重定向回页面选项卡?

    在用户验证我的应用程序后 我应该如何将用户重定向回我的页面选项卡 我无法输入一个特定的网址进行重定向 因为我的应用程序将驻留在多个页面上 所以我需要以某种方式获取页面的 id 并将其放入 url 中 我尝试过使用会话变量 但它似乎对我不起作
  • PHP 四舍五入不起作用

    我有这个代码 我想将两位小数四舍五入到一半 我期望值为 0 58 但上面的代码打印 0 57 我怎样才能做到这一点 如果您期望 0 58 则不必使用 半轮 而是使用 ceil 函数 v 0 575 echo ceil v 100 100 s
  • SQLAlchemy 中的编译扩展:索引中使用的函数

    我想在 SQLAlchemy 中创建一个不区分大小写的唯一约束 它可以与 Postgres 和 SQLite 一起使用 在Postgres中是这样实现的 SQL CREATE UNIQUE INDEX my index ON my tabl
  • 删除前面没有 NULL 的换行符

    我有一串数据 在我需要删除的行中插入了随机 CRLF 并以正确的 CRLF 结束了我需要保留的数据 我尝试使用 Notepad 正则表达式尝试将以下内容替换为空 NULL r n 但是 它不会删除插入的 CRLF 关于如何在 Notepad
  • 使用用户输入创建新对象 [JAVA]

    您好 我正在尝试创建一个程序 每当用户输入某个对象的新信息时就创建一个新对象 目前我有这个 import java util Scanner public class Main public static void main String
  • 无法销毁使用 Core Data 和 SQLite 创建的持久存储

    我有一个 iOS 应用程序 我想在每次启动时都从一个新的核心数据数据库开始 存储类型是 SQLite 但是 当我调用 persistenceStoreCoordinator destroyPersistentStore 时 100 都会收到
  • 通过 preg_replace 使用文本中的电话号码

    我可以使用 preg replace 在文本中查找电话号码 text preg replace d s 8 25 0 9 d strong 1 strong text 但是 我正在开发一个小功能 其中电话号码将被混淆 因此我需要实际的电话号
  • 是否有适用于 iphone sdk 的谷歌日历 api?

    有没有适用于 iphone sdk 的谷歌日历 api 目前我开发了一个 iphone 日历本机应用程序 在此应用程序中 我想从两侧与谷歌日历同步 所以我想知道是否有任何谷歌日历 API 可以完成这项工作 I found iphone gc
  • 上下文菜单的 SwiftUI 自定义视图

    我想在视图上长按手势时实现相同的自定义弹出视图 如照片 来自 Tweeter 应用程序 所示 这样我就可以同时显示自定义视图和上下文菜单 您需要进行定制ContextMenu using UIContextMenu from UIKit s
  • 我的 getJSON 调用随机返回结果,而不是它们被调用的顺序

    我需要制作多个getJSON请求将数据写入 HTML 文件 此示例显示了 3 个请求 但我将以相同的格式添加最多 6 个请求 可能更多 我的问题是结果以随机顺序返回 而不是按调用顺序返回 我怀疑它们是按照请求完成的顺序返回的 我每次都必须以
  • SQL 中的空字符文字是什么?

    我想知道 a 的字面意思是什么空字符 例如 0 在 SQL 中 Note 不是 NULL 字段值 而是空字符 see link 我有一列混合了典型字符和空字符 我正在尝试用不同的值替换空字符 我本以为以下内容会起作用 但没有成功 selec
  • 如何在 Swift 中按长度反向/降序对字符串数组进行排序?

    我想根据长度按降序排列字符串集合 首先 我不确定是否应该使用集合或数组 因为集合是无序事物的集合 并且我不需要集合中的元素必须位于有序集合中 我遇到了sorted 方法和sorted by 方法 但无法弄清楚如何按长度降序排列 仅按字母顺序
  • 使 WPF 数据网格中的行不可聚焦

    我试图弄清楚如何使以下 WPF DataGrid 中的行不可聚焦 正如你所看到的 我尝试添加一个
  • Unity C#,如何从另一个脚本调用函数来启动动画?

    using UnityEngine using System Collections public class ClickToMoveScript MonoBehaviour public string Chopping Chopping
  • 加载图像时出现内存不足异常

    我使用以下代码将图像作为缩略图加载到 FlowLayoutPanel 控件 不幸的是我遇到了 OutOfMemory 异常 正如您已经猜测的那样 内存泄漏是在该行发现的 Pedit Image System Drawing Image Fr
  • 使用流畅的 nhibernate 自动映射 IDictionary

    我有一个简单的类 如下所示 public class Item some properties public virtual IDictionary
  • 在我的 flutter 应用程序中使用 Agora rtc 引擎时出现问题

    我在使用 agora rtc 引擎时遇到问题 每次启动项目时我都会收到此错误消息 https pastebin com DuniUQYd 我不知道问题是什么 因为错误消息对我来说不是很清楚 在代码中 我还发布了我正在使用的频道名称应用程序