Live Streaming Video Call Chat Audio Call Chatbot Call SDK Video Call SDK
You will get our chat API for free if you subscribe to one of our Live APIs above. You can easily implement various features in your apps such as groups with multiple topics, media attachments, secret messages, self-destructing messages, acknowledgments, and many others.
Get StartedWelcome to Live Chat
Please fill the details below before chatting with us
Customer Support
to start live chat.
is now online.
Your chat has ended
Ask more question by starting a new chat
Confirmation Message
Have your sent messages manually acknowledged by the receiver to ensure the recipient actually read the message.
Anonymous Message
Post your messages anonymously.
Confidential Message
Set a timer for particular text-messages, files, and messages to self-destruct after they have been read.
Simply Practical
Call our API in a single line. We have been working hard to ensure the utmost practicality and ease.
import 'package:flutter/material.dart'; import 'package:nusa/newuniverse.dart'; class Home extends StatefulWidget { @override StatecreateState() { return new HomeState(); } } class HomeState extends State { final _channelController = TextEditingController(); bool _validateError = false; @override void initState() { super.initState(); _initialize(); } Future _initialize() async { _initNusa(); _addNusaEvent(); } Future _initNusa() async { // Change initiation with your credential here.. await Nusa.init('abcd_1234', 'tesa'); Nusa.bind(); } Future _addNusaEvent() async { Nusa.onAudioCallReceiver = (String originator, int state, String message) { Navigator.push( context, MaterialPageRoute( builder: (context) => SmartAudioCall(destination: originator, isInitiator: false))); }; Nusa.onVideoCallReceiver = (String originator, int state, String message) { Navigator.push( context, MaterialPageRoute(builder: (context) => VideoCall())); }; Nusa.onMessageCallback = (int messageId, int contentType, int status) { print( 'onMessageCallback -> messageId: $messageId, contentType: $contentType, status: $status'); Nusa.getMessage(messageId).then((f) { print('getMessage: $f'); }); }; Nusa.onMessageReceiver = (int messageId) { print('onMessageReceiver -> messageId: $messageId'); Nusa.getMessage(18109917689132).then((f) { print('getMessage: $f'); }); }; Nusa.onForumCallback = (String name, String message) { print('onForumCallback: $name/$message'); }; } @override void dispose() { _channelController.dispose(); super.dispose(); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text('Nusa Example'), ), floatingActionButton: new Builder(builder: (BuildContext context) { return new FloatingActionButton( onPressed: () { Nusa.getForumDetail('5YfqTiDbKVQu').then((f) { print('f: $f'); }); }, child: new Icon(Icons.info), ); }), body: Center( child: Container( padding: EdgeInsets.symmetric(horizontal: 8), height: 400, child: Column( children: [ Row(children: []), Row(children: [ Expanded( child: TextField( controller: _channelController, decoration: InputDecoration( errorText: _validateError ? 'Destination is mandatory' : null, border: UnderlineInputBorder( borderSide: BorderSide(width: 1)), hintText: 'Destination'), )) ]), Padding( padding: EdgeInsets.symmetric(vertical: 8), child: Row( children: [ Expanded( child: RaisedButton( onPressed: () => _onInitiate(true), child: Text('Initiate'), color: Colors.blueAccent, textColor: Colors.white, ), ) ], )), Padding( padding: EdgeInsets.symmetric(vertical: 8), child: Row( children: [ Expanded( child: RaisedButton( onPressed: () => _onInitiate(false), child: Text('Join'), color: Colors.blueAccent, textColor: Colors.white, ), ) ], )) ], )), )); } _onInitiate(bool isInitiator) async { setState(() { _channelController.text.isEmpty ? _validateError = true : _validateError = false; }); if (_channelController.text.isNotEmpty) { Navigator.push(context, MaterialPageRoute( builder: (context) => UnifiedMessaging(destination: _channelController.text))); } } void _showToast(BuildContext context, String status) { final scaffold = Scaffold.of(context); scaffold.showSnackBar( SnackBar( content: Text('User Status : ' + status), action: SnackBarAction( label: 'Close', onPressed: scaffold.hideCurrentSnackBar), ), ); } }
import 'dart:math'; import 'package:file_picker/file_picker.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:image_picker/image_picker.dart'; import 'package:nusa/newuniverse.dart'; class UnifiedMessaging extends StatefulWidget { final String destination; UnifiedMessaging({Key key, this.destination}) : super(key: key); @override StatecreateState() => _UnifiedMessagingState(); } class _UnifiedMessagingState extends State { var typingStatus = TextEditingController(); static final originator = 'cure'; static final destination = 'smiths'; static var me = ""; List
class MessageStatus { static const CALLBACK_MESSAGE = 0; static const CALLBACK_UPLOAD = 1; static const CALLBACK_DELETE = 2; static const DELETE_FOR_ME = 1; static const DELETE_FOR_EVERYONE = 2; static const MESSAGE_TYPE_PERSONAL = 0; static const MESSAGE_TYPE_GROUP = 1; static const FAILED = -1; static const PENDING = 0; static const SENT = 1; static const DELIVERED = 2; static const READ = 3; static const ACKNOWLEDGED = 4; static const CONTENT_TYPE_DEFAULT = 0; static const CONTENT_TYPE_IMAGE = 1; static const CONTENT_TYPE_DOCUMENT = 2; static const CONTENT_TYPE_AUDIO = 3; static const CONTENT_TYPE_VIDEO = 4; static const CONTENT_TYPE_FILE = 5; static const CONTENT_TYPE_CONTACT = 6; static const CONTENT_TYPE_STICKER = 7; static const CONTENT_TYPE_MAIL = 8; static const CONTENT_TYPE_NEED_ACKNOWLEDGEMENT = 9; static const CONTENT_TYPE_LOCATION = 10; }
FLUTTER 4
//repository repositories { google() jcenter() maven { url "http://192.168.0.6:8040/artifactory/libs-release-local" credentials { username = "${artifactory_username}" password = "${artifactory_password}" } } } //dependencies dependencies { implementation 'io.newuniverse:api:1.0.0' }
# Project-wide Gradle settings. # IDE (e.g. Android Studio) users: # Gradle settings configured through the IDE *will override* # any settings specified in this file. # For more details on how to configure your build environment visit # http://www.gradle.org/docs/current/userguide/build_environment.html # Specifies the JVM arguments used for the daemon process. # The setting is particularly useful for tweaking memory settings. org.gradle.jvmargs=-Xmx1536m # When configured, Gradle will run in incubating parallel mode. # This option should only be used with decoupled projects. More details, visit # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects # org.gradle.parallel=true # AndroidX package structure to make it clearer which packages are bundled with the # Android operating system, and which are packaged with your app's APK # https://developer.android.com/topic/libraries/support-library/androidx-rn android.useAndroidX=true # Automatically convert third-party libraries to use AndroidX android.enableJetifier=true # Kotlin code style for this project: "official" or "obsolete": kotlin.code.style=official artifactory_username=universe artifactory_password=AP6yjFzMDSCUqAX2f2inpXoTUog
package io.newuniverse.luna import android.Manifest import android.content.Intent import android.content.pm.PackageManager import android.os.Bundle import androidx.appcompat.app.AppCompatActivity import androidx.core.app.ActivityCompat import androidx.core.content.ContextCompat import io.newuniverse.nusdk.core.NuSDK import io.newuniverse.nusdk.um.EditorActivity import kotlinx.android.synthetic.main.audio_call_example.* class UnifiedMessagingExample : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.unified_messaging_example) NuSDK.init("abcd_1234", "yayandw") bind() start.setOnClickListener { val intent = Intent(this, EditorActivity::class.java) .putExtra("Destination", "tesa") startActivity(intent) } } private var permissions = arrayOf( Manifest.permission.READ_PHONE_STATE, Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.MODIFY_AUDIO_SETTINGS ) private fun isAllowPermission(): Boolean { for (permission in permissions) { if (ContextCompat.checkSelfPermission( this, permission ) != PackageManager.PERMISSION_GRANTED ) { ActivityCompat.requestPermissions(this, permissions, 1) return false } } return true } override fun onRequestPermissionsResult( requestCode: Int, permissions: Array, grantResults: IntArray ) { super.onRequestPermissionsResult(requestCode, permissions, grantResults) if (!isAllowPermission()) { finish() return } bind() } private fun bind() { if (ActivityCompat.checkSelfPermission( this, Manifest.permission.READ_PHONE_STATE ) != PackageManager.PERMISSION_GRANTED || ActivityCompat.checkSelfPermission( this, Manifest.permission.WRITE_EXTERNAL_STORAGE ) != PackageManager.PERMISSION_GRANTED ) { ActivityCompat.requestPermissions(this, permissions, 1) return } NuSDK.bind(this, object : NuSDK.BindListener { override fun failed(var1: String?) { } override fun success() { } }) } }
NATIVE 4