APICloud开发者进阶之路 | UIPickerView 模块示例demo
本文出自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的更多相关文章
- APICloud开发者进阶之路 | txLive模块(直播类)试用分享
本文出自APICloud官方论坛,感谢论坛版主uoaccw的分享 txLive 模块封装了腾讯云直播服务 https://docs.apicloud.com/Client-API/Open-SDK/t ...
- APICloud开发者进阶之路 |audioRecorder录音模块Demo
本文出自APICloud官方论坛 audioRecorder 模块通过封装系统的录音接口,能够快速的为开发者提供一个完整的录音功能. 该模块提供Android和iOS版本,录音方式及录制的音频格式 ...
- APICloud开发者进阶之路 |iOS修改entitlements文件
本文出自APICloud官方论坛, 感谢论坛版主 技术咨询-Kenny 的分享. 一.概述iOS原生开发中若要实现某些特殊功能,如使用HealthKit.实现Universal Links等.需要 ...
- APICloud开发者进阶之路 |纯手工编写日程表功能
本文出自APICloud官方论坛, 感谢论坛版主 赵永亮 的分享. 最近看论坛内关于极光推送的问题有很多, 本想写一个关于极光的详细教程的,无奈已经有很多大牛分享过了,所以只得纯手工写了一个日程表,可 ...
- UIPickerView 模块示例demo
本文出自APICloud官方论坛 UIPickerView 此模块封装了一个可以从屏幕底部向上弹出的 action 选择器(3D滚轮效果).开发者可自定义选择器的样式,包括:导航条颜色.高度,导航条上 ...
- UIChatBox模块示例demo
感谢论坛版主 马浩川 的分享. UIChatBox 模块是一个聊天输入框模块,开发者可自定义该输入框的功能.通过 open 接口可在当前 window 底部打开一个输入框,该输入框的生命属于当前 wi ...
- acmPush模块示例demo
感谢论坛版主 马浩川 的分享. 模块介绍: 阿里移动推送(Alibaba Cloud Mobile Push)是基于大数据的移动智能推送服务,帮助App快速集成移动推送的功能,在实现高效.精确.实时 ...
- Scala进阶之路-统计商家id的标签数以及TopN示例案例分析
Scala进阶之路-统计商家id的标签数以及TopN示例案例分析 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.项目需求 将“temptags.txt”中的数据进行分析,统计出 ...
- 树莓派进阶之路 (029) - 语音识别模块 LD3320(原创)
近几天听朋友有说到LD3320 语音模块,刚好身边有块树莓派3,就在某宝上买了块自带mcu的LD3320 . 准备: 树莓派一个(配置了wiringPi开发环境的详情见本人博客:树莓派进阶之路 (00 ...
随机推荐
- 2018-8-10-win10-uwp-调试软件启动
title author date CreateTime categories win10 uwp 调试软件启动 lindexi 2018-08-10 19:16:51 +0800 2018-03-0 ...
- VMware 注册码
VMware 12 Pro 永久许可证激活密钥 5A02H-AU243-TZJ49-GTC7K-3C61NVF5XA-FNDDJ-085GZ-4NXZ9-N20E6UC5MR-8NE16-H81WY- ...
- 浅谈集合框架二 List、Set常用方法
最近刚学完集合框架,想把自己的一些学习笔记与想法整理一下,所以本篇博客或许会有一些内容写的不严谨或者不正确,还请大神指出.初学者对于本篇博客只建议作为参考,欢迎留言共同学习. 之前有介绍集合框架的体系 ...
- java 一个类加载器的高级问题分析
编写一个能打印出自己的类加载器名称和当前类加载器的父子结构关系链的MyServlet,正常发布后,看到打印结果为WebAppClassloader. 把MyServlet.class文件打jar包,放 ...
- 高并发WEB服务的演变
一.越来越多的并发连接数 现在的Web系统面对的并发连接数在近几年呈现指数增长,高并发成为了一种常态,给Web系统带来不小的挑战.以最简单粗暴的方式解决,就是增加 Web系统的机器和升级硬件配置.虽然 ...
- linux 内核定时器的实现
为了使用它们, 尽管你不会需要知道内核定时器如何实现, 这个实现是有趣的, 并且值得 看一下它们的内部. 定时器的实现被设计来符合下列要求和假设: 定时器管理必须尽可能简化. 设计应当随着激活的定时器 ...
- POJ 3311 Hie with the Pie 兼 Codevs 2800 送外卖(动态规划->TSP问题)
Description The Pizazz Pizzeria prides itself in delivering pizzas to its customers as fast as possi ...
- dotnet 使用 lz4net 压缩 Stream 或文件
在 dotnet 可以使用 LZ4 这个无损的压缩算法,这个压缩算法的压缩率不高但是速度很快.这个库支持在 .NET Standard 1.6 .NET Core .NET Framework Mon ...
- dotnet 通过 WMI 拿到显卡信息
本文告诉大家如何通过 WMI 拿到显卡信息 如果使用的是 dotnet core 请先引用 Microsoft.Windows.Compatibility 才可以使用 WMI 代码 通过下面的代码可以 ...
- FreeSql取多表数据
该篇内容由个人博客点击跳转同步更新!转载请注明出处! 以文章随笔与分类为例. 表结构 部分字段如下,其他省略,为了展示一对多关联,一个分类下可以有多个文章.一个文章属于一个分类. blog_artic ...