linkv_rtm 0.0.4 copy "linkv_rtm: ^0.0.4" to clipboard
linkv_rtm: ^0.0.4 copied to clipboard

outdated

linkv_rtm Audio/Video/IM Flutter SDK is a flutter plugin wrapper based on LinkV LVIMSDK native Android/iOS SDK

example/lib/main.dart

import 'dart:math';

import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:fluttertoast/fluttertoast.dart';
import 'package:linkv_rtm/linkv_api_defines.dart';
import 'dart:async';
import 'package:linkv_rtm/rtm_flutter_plugin.dart';
import 'package:rtm_flutter_plugin_example/live_page.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'linkv_ui.dart';
import 'package:linkv_rtm/linkv_error_code.dart';
import 'package:permission_handler/permission_handler.dart';
import 'package:linkv_rtm/linkv_rtm_callback.dart';
import 'help.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Welcome to Flutter',
      debugShowCheckedModeBanner: false,
      home: MainView(),
    );
  }
}

class MainView extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MainView> implements LVIMEventCallback {
  final _roomIdFieldController = TextEditingController();
  final _msgInputTextEdit = TextEditingController();
  final _msgTargetIdTextEdit = TextEditingController();
  final _msgListTextEdit = TextEditingController();
  bool _isSDKInit = false;
  String _version;
  String userId;
  var TAG = "main [Wing] ";
  bool isTokenRequesting = false;
  bool isIMAuthed = false;

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

    initSDK();
    RtmFlutterPlugin.getSdkVersion().then((value) => {
          this.setState(() {
            _version = value;
          })
        });
    RtmFlutterPlugin.setIMEventCallback(this);

    _roomIdFieldController.text = "1352";

    getUid().then((value) {
      userId = value;
      print("D/Wing own userId = " + userId);
      RtmFlutterPlugin.loginUser(userId).then((value) {
        print(value);
        String loginResult = "";
        if (value == 0) {
          loginResult = "登录成功";
        } else {
          loginResult = "登录失败 code : " + value.toString();
        }

        Fluttertoast.showToast(
            msg: loginResult,
            toastLength: Toast.LENGTH_SHORT,
            gravity: ToastGravity.CENTER);
      });
    });
  }

  Future<String> getUid() async {
    SharedPreferences prefs = await SharedPreferences.getInstance();
    String uid = prefs.getString("uid");
    if (uid == null || uid.length == 0) {
      uid = Random().nextInt(10000).toString();
      prefs.setString("uid", uid);
    }
    return uid;
  }

  void initSDK() {
    RtmFlutterPlugin.initSDK(Your_App_Id, Your_App_Sign, false, true)
        .then((result) {
      print('initSDK result:$result');
      if (result == LVErrorCode.SUCCESS) {
        _isSDKInit = true;
      }
    });
  }

  void onClickSend() {
    print("[Wing] sendPrivateMessage start to = ${_msgTargetIdTextEdit.text}, content = ${_msgInputTextEdit.text}");
    RtmFlutterPlugin.sendPrivateMessage(MessageSubType.IM_SUBTYPE_TEXT,
        _msgTargetIdTextEdit.text, "msgType", _msgInputTextEdit.text).then((value) {
          print('[Wing] sendPrivateMessage end errorCode = $value');
          if (value == 0) {
            Fluttertoast.showToast(msg: "Send Msg Success");
          }
    });
  }

  void onClickWatchLive() async {
    print("onClickWatchLive");

    bool isCan = await canLive();
    if (!isCan) return;

    Navigator.push(
        context,
        MaterialPageRoute(
            builder: (context) =>
                LivePage(false, _roomIdFieldController.text, userId)));
  }

  void onClickStartLive() async {
    print("onClickStartLive");
    bool isCan = await canLive();
    if (!isCan) return;

    Navigator.push(
        context,
        MaterialPageRoute(
            builder: (context) =>
                LivePage(true, _roomIdFieldController.text, userId)));
  }

  Future<bool> canLive() async {
    // 1. 相机权限
    bool canLive = await checkPermission();
    print("canlive = $canLive");
    if (!canLive) return canLive;

    // 2. 是否输入了房间id
    if (_roomIdFieldController.text.length == 0) {
      LinkvUi.showAlert(context, "Please enter your room number!");
      return false;
    }

    // 3. SDK是否已经初始化成功了
    if (!_isSDKInit) {
      initSDK();
      return false;
    }

    // 4. IM是否鉴权通过
    if (!isIMAuthed) {
      Fluttertoast.showToast(
      msg: "请等待鉴权成功后进入房间",
      toastLength: Toast.LENGTH_SHORT,
      gravity: ToastGravity.CENTER);
      return false;
    }

    return true;
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        resizeToAvoidBottomPadding: false,
        appBar: AppBar(
          title: Text("uid :$userId"),
        ),
        body: SafeArea(
          child: GestureDetector(
            behavior: HitTestBehavior.translucent,
            onTap: () => FocusScope.of(context).requestFocus(new FocusNode()),
            child: Container(
              padding: const EdgeInsets.only(left: 20, top: 20, right: 20),
              child: ListView(
                children: <Widget>[
                  Row(
                    children: <Widget>[
                      Text("Version: "),
                      Expanded(
                        child: Text("$_version"),
                      )
                    ],
                  ),
                  Padding(
                    padding: const EdgeInsets.only(top: 20),
                  ),
                  TextField(
                    controller: _msgInputTextEdit,
                    decoration: InputDecoration(
                        contentPadding: const EdgeInsets.only(
                            left: 10, top: 12, bottom: 12),
                        hintText: "Please enter message Content",
                        enabledBorder: OutlineInputBorder(
                            borderSide: BorderSide(color: Colors.grey)),
                        focusedBorder: OutlineInputBorder(
                            borderSide: BorderSide(color: Colors.cyan))),
                  ),
                  Padding(
                    padding: const EdgeInsets.only(top: 20),
                  ),
                  TextField(
                    controller: _msgTargetIdTextEdit,
                    decoration: InputDecoration(
                        contentPadding: const EdgeInsets.only(
                            left: 10, top: 12, bottom: 12),
                        hintText: "Please enter target user id",
                        enabledBorder: OutlineInputBorder(
                            borderSide: BorderSide(color: Colors.grey)),
                        focusedBorder: OutlineInputBorder(
                            borderSide: BorderSide(color: Colors.cyan))),
                  ),
                  Padding(
                    padding: const EdgeInsets.only(top: 20),
                  ),
                  TextField(
                    controller: _msgListTextEdit,
                    decoration: InputDecoration(
                        contentPadding: const EdgeInsets.only(
                            left: 10, top: 12, bottom: 12),
                        hintText: "received message",
                        enabledBorder: OutlineInputBorder(
                            borderSide: BorderSide(color: Colors.cyan)),
                        focusedBorder: OutlineInputBorder(
                            borderSide: BorderSide(color: Colors.cyan))),
                  ),
                  Padding(
                    padding: const EdgeInsets.only(top: 20),
                  ),
                  Container(
                    height: 50,
                    width: MediaQuery.of(context).size.width - 20,
                    color: Colors.cyan,
                    child: CupertinoButton(
                      child: Text(
                        "Send Private Message",
                        style: TextStyle(color: Colors.white),
                      ),
                      onPressed: onClickSend,
                    ),
                  ),
                  Padding(
                    padding: const EdgeInsets.only(top: 50),
                  ),
                  TextField(
                    controller: _roomIdFieldController,
                    decoration: InputDecoration(
                        contentPadding: const EdgeInsets.only(
                            left: 10, top: 12, bottom: 12),
                        hintText: "Please enter room_id",
                        enabledBorder: OutlineInputBorder(
                            borderSide: BorderSide(color: Colors.grey)),
                        focusedBorder: OutlineInputBorder(
                            borderSide: BorderSide(color: Colors.cyan))),
                  ),
                  Padding(
                    padding: const EdgeInsets.only(top: 20),
                  ),
                  Container(
                    height: 50,
                    width: MediaQuery.of(context).size.width - 20,
                    color: Colors.cyan,
                    child: CupertinoButton(
                      child: Text(
                        "Start Live",
                        style: TextStyle(color: Colors.white),
                      ),
                      onPressed: onClickStartLive,
                    ),
                  ),
                  Padding(
                    padding: const EdgeInsets.only(top: 20),
                  ),
                  Container(
                    height: 50,
                    width: MediaQuery.of(context).size.width - 20,
                    color: Colors.cyan,
                    child: CupertinoButton(
                      child: Text(
                        "Watch Live",
                        style: TextStyle(color: Colors.white),
                      ),
                      onPressed: onClickWatchLive,
                    ),
                  ),
                ],
              ),
            ),
          ),
        ),
      ),
    );
  }

// MARK: - Permission
  Future<bool> checkPermission() async {
    Permission _camera = Permission.camera;
    Permission _microphone = Permission.microphone;

    PermissionStatus status;
    status = await _camera.request();
    if (status != PermissionStatus.granted) return false;
    status = await _microphone.request();
    if (status != PermissionStatus.granted) return false;

    return true;
  }

  @override
  void onIMMessageReceive(LVIMMsg msg) {
    var msgContent = msg.msgContent.toString();
    print(TAG + " onRoomMessageReceive" + msg.toString());
    _msgListTextEdit.text = msg.fromID + " : " + msgContent;
  }

  @override
  void onIMTokenExpired(String uid, String token, String emsg) {
    isIMAuthed = false;
    print(TAG + "onIMTokenExpired uid = " + uid);
  }

  @override
  void onIMAuthSucceed(String uid, String token, int unReadMsgSize) {
    isIMAuthed = true;
    print(TAG + "onIMAuthSucceed uid = " + uid + " token = " + token);
    Fluttertoast.showToast(
        msg: "IM 鉴权成功",
        toastLength: Toast.LENGTH_LONG,
        gravity: ToastGravity.CENTER);
  }

  @override
  void onIMAuthFailed(int ecode, int rcode, String uid, bool isTokenExpired) {
    isIMAuthed = false;
    print(TAG + "onIMAuthFailed uid = " + uid + " ecode =$ecode ");
  }

  @override
  void onQueryIMToken() {
    requestReleaseIMToken();
//    requestDebugIMToken();
  }

  void requestDebugIMToken() {
    if (isTokenRequesting) return;

    print(TAG + "requestDebugToken start");
    isTokenRequesting = true;
    RtmFlutterPlugin.requestDebugToken(userId, "Test").then((result) {
      isTokenRequesting = false;
      int code = result["code"];
      String resultMsg = result["result"];
      print(TAG + "requestDebugToken end msg  = " + resultMsg + " code = $code");

      /// 获取debug token 成功
      if (code == 0) {
        RtmFlutterPlugin.setIMToken(userId, resultMsg);
      }
    });
  }

  void requestReleaseIMToken() {
    if (isTokenRequesting) return;

    print(TAG + "requestDebugToken start");
    isTokenRequesting = true;
    Help.requestReleaseIMToken(userId).then((value) {
      isTokenRequesting = true;
      if (value["code"] == "200") {
        print(TAG + "setIMToken token = ${value["token"]}");
        RtmFlutterPlugin.setIMToken(userId, value["token"]);
      }
      print(TAG + "requestDebugToken end data = $value");
    });
  }
}
4
likes
0
pub points
0%
popularity

Publisher

unverified uploader

linkv_rtm Audio/Video/IM Flutter SDK is a flutter plugin wrapper based on LinkV LVIMSDK native Android/iOS SDK

Homepage

License

unknown (LICENSE)

Dependencies

flutter

More

Packages that depend on linkv_rtm