本文出自APICloud官方论坛

rongCloud2  3.2.8 版本更新后添加了发送小视频接口,发送文件接口。

rongCloud2  概述

融云是国内首家专业的即时通讯云服务提供商,专注为互联网、移动互联网开发者提供即时通讯基础能力和云端服务。通过融云平台,开发者不必搭建服务端硬件环境,就可以将即时通讯、实时网络能力快速集成至应用中。
rongCloud2 封装了融云即时通讯能力库 IMLib SDK 的 API,对融云的相关接口做了一一对应的封装,功能详情可参考目录。
使用 rongCloud2 模块之前,请先 注册 融云的开发者帐号并申请创建 App,创建 App 后,可以在 开发者后台 获取 App Key 和 App Secret 用于开发。开发前请先认真阅读相关的 融云开发文档和视频。(请在PC端打开)
由于 (Android )融云sdk 不支持中文路径,需要处理一下,用fs 模块 调用rename接口重命名一下,为了不影响原文件需要先复制一下再进行处理。方法不唯一,提供参考
所用 模块  rongcloud2、fs 模块、fileBrowser 模块以下是页面源码 包括简易登陆获取token页面主功能页面。
一、

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"> <meta name="viewport" content="maximum-scale=1.0,minimum-scale=1.0,user-scalable=0,width=device-width,initial-scale=1.0"/> <title>title</title> <link rel="stylesheet" type="text/css" href="../css/api.css"/> <style> body{ } .form{ width: %; height: 200px; margin-top: 100px; text-align: center; } input{ width: %; height: 60px; text-align: center; font-size: 35px; border-radius: 5px; border: 1px solid #b23; } button{ width: 100px; height: 50px; margin-left: 100px; background-color: green; color: #fff; }
</style> </head> <body> <div class="form"> id:<input id="uid" type="text" name="" value=""> name:<input id="uname" type="text" name="" value=""> </div> <button type="button" name="button">登陆</button> <button type="button" name="button">发送</button> </body> <script type="text/javascript" src="../script/api.js"></script> <script type="text/javascript" src="../script/sha1.js"></script> <script type="text/javascript"> var rong = ''; apiready = function(){ rong = api.require("rongCloud2"); }; function login() { var uid = $api.byId('uid').value; var uname = $api.byId('uname').value; var portraitUri = 'lll'; //会员头像 var appKey = "*********"; var appSecret = "***********"; var nonce = Math.floor(Math.random() * );//随机数 var timestamp = Date.now(); //时间戳 var signature = SHA1("" + appSecret + nonce + timestamp);//数据签名(通过哈希加密计算) api.ajax({ url : "http://api.cn.ronghub.com/user/getToken.json", method : "post", headers : { "RC-App-Key" : appKey, "RC-Nonce" : "" + nonce, "RC-Timestamp" : "" + timestamp, "RC-Signature" : "" + signature, "Content-Type" : "application/x-www-form-urlencoded" }, data : { values : { userId : uid, name : uname, portraitUri : portraitUri } } }, function(ret, err) { if (ret) { $api.setStorage('token', ret.token);//将token存储到本地 api.alert({ title: 'testtitle', msg: '以获取token', }, function(ret, err){ if( ret ){ api.openWin({ name: 'rong2', url: './rong2.html', pageParam: { name: 'test' } }); }else{ alert( JSON.stringify( err ) ); } }); } else { alert("获取token失败") } }); } function sendEv() { api.sendEvent({ name: 'myEvent', extra: { key1: 'value1', key2: 'value2' } }); api.openWin({ name: 'page1', url: 'widget://index.html', pageParam: { name: 'test' } }); }
</script> </html> 复制代码

<!DOCTYPE html>

<html>

<head>

    <meta charset="utf-8">

    <meta name="viewport" content="maximum-scale=1.0,minimum-scale=1.0,user-scalable=0,width=device-width,initial-scale=1.0" />

    <title>title</title>

    <link rel="stylesheet" type="text/css" href="../css/api.css" />

    <style>

        body {}

        .main {

            position: absolute;

            bottom: ;

            width: %;

            height: 200px;

            text-align: center;

            border-top: 1px solid #b23;

        }

        button {

            margin-top: 5px;

            margin-left: 10px;

            width: 90px;

            height: 50px;

        }

        .msg {

            width: %;

            height: 300px;

            margin-top: 100px;

        }

        input {

            width: %;

            height: 50px;

            border: 1px solid #b33;

            text-align: center;

        }

        .msg button {

            width: 100px;

            height: 50px;

            background-color: green;

            color: #fff;

            border-radius: 5px;

        }
</style> </head> <body> <div class="msg"> <input id="sendtxt" type="text" name="" value="" placeholder="发送文本内容"> <input id="uid" type="text" name="" value="" placeholder="接收者id"> <button type="button" name="button">发送</button> <button type="button" name="button">发文件</button> <button type="button" name="button">发视频</button> </div> <div id="evbtn"> </div> </body> <script type="text/javascript" src="../script/api.js"></script> <script type="text/javascript"> var token = ''; var oldPath = ''; var fileName = ''; var type = ''; //按钮 //初始化模块 var rong = null; var fs = null; var fileBrowser = null; apiready = function() { //初始化模块 rong = api.require('rongCloud2'); fs = api.require('fs'); fileBrowser = api.require('fileBrowser'); //登陆 setTimeout(function() { getToken(); msglisten(); addlistenSta(); toCon(); }, ); }; //获取缓存token function getToken() { token = $api.getStorage('token'); if (token) { toInit(); } else { api.openWin({ name: 'page1', url: './token.html', pageParam: { name: 'test' } }); } } //初始化融云 function toInit() { rong.init(function(ret, err) { if (ret) { console.log('init---ok'); } }); } //添加状态监听 function addlistenSta() { rong.setConnectionStatusListener(function(ret, err) { if (ret) { console.log('监听开启---'); } }); } //连接融云 function toCon() { rong.connect({ token: token }, function(ret, err) { alert(JSON.stringify(ret) + '---连接成功'); }); } function send ( type ) { type = type; getFilePath(); } function fnEvent( path ) { if (type == 'file') { sendFileMessageR( path ); }else { sendSightMessageR( path ); } } //选取文件 function getFilePath() { fileBrowser.open(function(ret) { if (ret) { alert(JSON.stringify(ret)); oldPath = ret.url; fileName = ret.name; //判断路径是否包含中文 if (escape(oldPath).indexOf( "%u" )<){ alert( "没有包含中文" ); fnEvent( oldPath ); } else { existIsOk(); } } }); } //判断文件夹是否存在 function existIsOk() { fs.exist({ path: 'fs://rongcloudfilecopy' }, function(ret, err) { alert(JSON.stringify(ret)); if (ret.exist) { alert('有这个路径'); copyToRong(); } else { alert('没有这个路径'); createDirF(); } }); } //创建路径 function createDirF() { fs.createDir({ path: 'fs://rongcloudfilecopy' }, function(ret, err) { if (ret.status) { alert(JSON.stringify(ret)); copyToRong(); } else { alert(JSON.stringify(err)); } }); } //复制到融云文件夹 function copyToRong( ) { fs.copyTo({ oldPath: oldPath, newPath: 'fs://rongcloudfilecopy' }, function(ret, err) { if (ret.status) { alert(JSON.stringify(ret)); renameRong(); } else { alert(JSON.stringify(err)); } }); } //重命名文件 function renameRong( ) { var timestamp = (new Date()).getTime(); var srtPath1 = fileName.split('.')[]; var srtPath2 = fileName.split('.')[]; var copyOldPath = 'fs://rongcloudfilecopy/' + fileName ; var newPath = 'fs://rongcloudfilecopy/' + timestamp + '.' + srtPath2 fs.rename({ oldPath: copyOldPath, newPath: newPath }, function(ret, err) { if (ret.status) { alert(JSON.stringify(ret)); fnEvent( newPath ); } else { alert(JSON.stringify(err)); } }); } //发短视频 function sendSightMessageR( videoPath ) { console.log(videoPath); var txt = $api.byId('sendtxt').value; var uid = $api.byId('uid').value; console.log(uid); rong.sendSightMessage({ conversationType: 'PRIVATE', targetId: uid, thumbPath: 'fs://picture/dog1.png', sightPath: videoPath, //videoPath, //sightPath: 'fs://picture/666.mp4', //videoPath, duration: , extra: '' }, function(ret, err) { if (ret.status == 'prepare') console.log(JSON.stringify(ret.result.message)); else if (ret.status == 'progress') console.log(ret.result.progress ); else if (ret.status == 'success') console.log(ret.result.message.messageId); else if (ret.status == 'error') console.log(err.code); }); } //发送文件 function sendFileMessageR( filePath ) { var uid = $api.byId('uid').value; console.log(filePath); rong.sendFileMessage({ conversationType: 'PRIVATE', targetId: uid, filePath: filePath, extra: '' }, function(ret, err) { if (ret.status == 'prepare') console.log(JSON.stringify(ret.result.message)); else if (ret.status == 'progress') console.log(ret.result.progress ); else if (ret.status == 'success') console.log(ret.result.message.messageId); else if (ret.status == 'error') console.log(err.code); }); } //发送信息 function sendmsg() { var txt = $api.byId('sendtxt').value; var uid = $api.byId('uid').value; rong.sendTextMessage({ conversationType: 'PRIVATE', targetId: uid, text: txt, extra: '' }, function(ret, err) { if (ret.status == 'prepare') api.alert({ msg: JSON.stringify(ret.result.message) }); else if (ret.status == 'success') api.alert({ msg: ret.result.message.messageId }); else if (ret.status == 'error') api.alert({ msg: err.code }); }); } //消息监听 function msglisten() { rong.setOnReceiveMessageListener(function(ret, err) { // api.alert({ msg: JSON.stringify(ret.result.message) }); alert('收到了消息'); console.log(JSON.stringify(ret.result)); // setInterval(function () { // rong.getConnectionStatus(function(ret, err) { // console.log( ret.result.connectionStatus ); // }) // }, 2000); // var receivetxtSTR = ret.result.message.content.text; // tid = ret.result.message.targetId // console.log(tid); // $api.byId('receivetxt').value = receivetxtSTR; // rong.sendReadReceiptMessage({ // targetId: tid // }, function(ret) { // api.alert({ // msg: JSON.stringify(ret) + '我已读了' // }); // }); }) }
</script> </html> 复制代码

APICloud开发者进阶之路 | UIPickerView 模块示例demo的更多相关文章

  1. APICloud开发者进阶之路 | txLive模块(直播类)试用分享

    本文出自APICloud官方论坛,感谢论坛版主uoaccw的分享 txLive 模块封装了腾讯云直播服务 https://docs.apicloud.com/Client-API/Open-SDK/t ...

  2. APICloud开发者进阶之路 |audioRecorder录音模块Demo

    本文出自APICloud官方论坛   audioRecorder 模块通过封装系统的录音接口,能够快速的为开发者提供一个完整的录音功能. 该模块提供Android和iOS版本,录音方式及录制的音频格式 ...

  3. APICloud开发者进阶之路 |iOS修改entitlements文件

    本文出自APICloud官方论坛, 感谢论坛版主 技术咨询-Kenny 的分享.   一.概述iOS原生开发中若要实现某些特殊功能,如使用HealthKit.实现Universal Links等.需要 ...

  4. APICloud开发者进阶之路 |纯手工编写日程表功能

    本文出自APICloud官方论坛, 感谢论坛版主 赵永亮 的分享. 最近看论坛内关于极光推送的问题有很多, 本想写一个关于极光的详细教程的,无奈已经有很多大牛分享过了,所以只得纯手工写了一个日程表,可 ...

  5. UIPickerView 模块示例demo

    本文出自APICloud官方论坛 UIPickerView 此模块封装了一个可以从屏幕底部向上弹出的 action 选择器(3D滚轮效果).开发者可自定义选择器的样式,包括:导航条颜色.高度,导航条上 ...

  6. UIChatBox模块示例demo

    感谢论坛版主 马浩川 的分享. UIChatBox 模块是一个聊天输入框模块,开发者可自定义该输入框的功能.通过 open 接口可在当前 window 底部打开一个输入框,该输入框的生命属于当前 wi ...

  7. acmPush模块示例demo

    感谢论坛版主 马浩川 的分享. 模块介绍:  阿里移动推送(Alibaba Cloud Mobile Push)是基于大数据的移动智能推送服务,帮助App快速集成移动推送的功能,在实现高效.精确.实时 ...

  8. Scala进阶之路-统计商家id的标签数以及TopN示例案例分析

    Scala进阶之路-统计商家id的标签数以及TopN示例案例分析 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.项目需求 将“temptags.txt”中的数据进行分析,统计出 ...

  9. 树莓派进阶之路 (029) - 语音识别模块 LD3320(原创)

    近几天听朋友有说到LD3320 语音模块,刚好身边有块树莓派3,就在某宝上买了块自带mcu的LD3320 . 准备: 树莓派一个(配置了wiringPi开发环境的详情见本人博客:树莓派进阶之路 (00 ...

随机推荐

  1. java DOM 操作xml

    1 代码如下: package dom.pasing; import java.io.IOException; import java.io.StringWriter; import javax.xm ...

  2. java final域

    public final class ThreeStooges { /* * stooges是Set<String>类型的引用,final限定该引用成员属性stooges被赋初值后,就不能 ...

  3. Html5 @media + css3 媒体查询

    css3 media媒体查询器用法总结   随着响应式设计模型的诞生,Web网站又要发生翻天腹地的改革浪潮,可能有些人会觉得在国内IE6用户居高不下的情况下,这些新的技术还不会广泛的蔓延下去,那你就错 ...

  4. 【p083】传球游戏

    Time Limit: 1 second Memory Limit: 50 MB [问题描述] 上体育课的时候,小蛮的老师经常带着同学们一起做游戏.这次,老师带着同学们一起做传球游戏. 游戏规则是这样 ...

  5. 2018-8-10-win10-uwp-x_Bind-无法获得资源

    title author date CreateTime categories win10 uwp x:Bind 无法获得资源 lindexi 2018-08-10 19:17:19 +0800 20 ...

  6. H3C FTP主动数据传输方式

  7. HDU 1087 Super Jumping....(动态规划之最大递增子序列和)

    Super Jumping! Jumping! Jumping! Problem Description Nowadays, a kind of chess game called “Super Ju ...

  8. vue-learning:7-template-v-bind-with-class-and-style

    绑定元素样式的指令v-bind:class 和v-bind:style 在HTML元素结构中,class和style特性(attribute)是非常突出的,可以为元素添加样式属性(property). ...

  9. 2019浙江ACM省赛——部分题目

    有一些题目过了我还没有重新写,先放一些我重新写好了的吧 签到题拿到了信心吧,9分钟写完两题,我们贼开心,我大哥说签到题有什么好开心的,如果不是我有一些地方卡了下,可能还是更快吧,还有就是测试案例多试了 ...

  10. CAS5.3 单点登录/登出/springboot/springmvc

    环境: jdk:1.8 cas server:5.3.14 + tomcat 8.5 cas client:3.5.1 客户端1:springmvc 传统web项目(使用web.xml) 客户端2:s ...