linkv_rtm 0.0.2 linkv_rtm: ^0.0.2 copied to clipboard
linkv_rtm Audio/Video/IM Flutter SDK is a flutter plugin wrapper based on LinkV LVIMSDK native Android/iOS SDK
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");
});
}
}