2024年1月20日发(作者:)
用Rexsee开发百度网盘应用
前言
Rexsee是一个Android移动应用开发平台,其特点是通过html、javascript、css及rexsee
API开发出Android应用。开发者仅仅需要熟悉Web编程语法即可进行Android应用的开发。
在Rexsee的API中包含了对百度网盘的操作。本教程就是说明如何使用rexsee开发百度网盘应用。
百度网盘是百度提供的一个云服务。全名是个人云存储(Personal Cloud Storage,简称PCS)是百度推出的针对个人用户的云存储服务。
Rexsee中与百度网盘有关的对象是rexseeBaiduPCS。包含了用户授权(登录、登出)、文件上传下载操作,文件夹操作。简化了开发者对PCS中文件和目录API的调用。
开发过程
第一步:开发准备
1, 开发者必须是具有百度的开发者帐号。
2, 在百度的开发者中心创建应用,获取应用的API key和SecretKey。
3, 在百度的开发者中心申请开通PCS权限。
第二步:设计编写代码
主要是指通过使用(html、javascript、css、rexsee API)进行应用的开发。
第三步:生成应用
通过Rexsee的在线编译系统(需要注册Rexsee开发者帐号登录)生成APK文件。在在线编译系统中可以预置baidupcs相关开发授权信息(APIkey,secretKey)。可以预打包一些资源文件、html、css、javascript文件到安装包中。
RexseeBaiduPCS对象简介
RexseeBaiduPCS对象可以做为一个javascript对象来使用。无需创建和销毁。其产生和销毁由Rexsee运行环境自动完成。
RexseeBaiduPCS对象包含了登录、注销、远程文件及文件夹操作、文件上传下载操作。也包含了对开发者授权信息的读取和设置(比如设置APIkey及secretKey值)。
开发示例
下面,我们针对每个环节进行代码分析。
授权
这部分包括登录和注销。
登录
因为百度PCS需要PCS用户授权,所以在第一次使用的时候。需要让用户登录到百度网盘,授权给该应用。这个过程需要用户输入用户名和密码。如不知用户是否已经登录可以通过isReady()方法,当true,也就是已经授权。调用login()方法后,如果当前并没有登录,则会出现百度网盘的页面登录界面。
这里我们看一下代码(应用首页)::
应用打开后,先出现首页,然后执行百度PCS登录。出现图1-1画面:
图1-1
因为首次登录,没有获取用户的百度PCS操作授权,所以会出现图1-2的画面:
图1-2
等待用户输入正确的用户名及密码后并得到验证后,会登录到主控页面,显示网盘里的内容。如图:1-3:
图1-3
如果登录授权没有通过则回到百度网盘授权页面,等待再次输入正确的用户名和密码。
如果登录授权通过后,退出应用程序,再次打开应用程序,因为已经记载了授权信息,所以自动到百度服务器进行验证,如果验证通过,直接导航到应用的主控界面即图1-3。
注销
注销是指取消用户给本应用操作百度PCS的授权。在RexseeBaiduPCS中对应的方法是:logout();
如图1-4
图1-4
我们在这个应用里,注销的操作切入点是一个链接:
图1-5
前端使用了提示对话框的方式让用户进行二次确认。(图1-5)
/**注销账号**/
function logout(){
确定'){
}
注销完毕后,即回到百度PCS授权页面。
();
();
}
if(prompt('3button','title=注销百度PCS;message=确定注销;options=取消|确定;')=='目录和文件操作
目录和文件操作,主要指新建目录、删除目录、获取配额、列目录、复制、移动等操作。这些操作其实是发送指令给百度PCS,远程控制用户的PCS。在百度PCS中,第三方应用操作的目录是以/apps/appname开头的路径。这个appname是在百度开发者中心里定义的。
不可以改变。
创建
前端的入口为一个链接或者点击动作(javascript:functionname())
使用到了mkdir(path)方法。
我们看到mkdir() 会得到返回。或者是创建成功的消息,或者是创建失败的消息。当遇到网络异常时,会有Rexsee会抛出异常事件。
创建成功的返回:{“fs_id”:….,”path”:”….”,”ctime”:…..,”mtime”:…..,”request_id”:….},失败时返回{“error_code”:…,”error_msg”:”…..”,”request_id”:….} ,返回的字符串是json格式的,可以通过eval(‘(‘+jsonstr+’)’)的方式转换成数组,最后通过下标检索相关值。
删除
使用remove(path)方法。删除的方法和创建目录的方法很类似,其区别主要是返回值的删除失败则返回不同。当删除成功时返回{“request_id”:….}
{“error_code”:…,”error_msg”:”…”,”request_id”:….}
获取配额
我们看图1-4中,显示了配额信息: 15G,这个信息是怎么获取到呢。我们看到页面显示的代码是:
function show(){
var s = eval('('+()+')');
//alert(sizeType());
mentById('quota').innerHTML = sizeType();
}
functionsizeType(size){
}
当登录成功后,调用了show方法,通过()获取到网盘的容量及已使用量的信息。返回的数据结构如:{“quota”:…….,”used”:…….,”request_id”…….},这个数据通过eval转换成数组,通过下标定位到要quota的值,经过函数sizeType的转换成为容量显示。最后通过将数字插入到span中达到了显示容量的效果。
if(size<1024){
returnsize+'B';
}else if(size<1024*1024){
(size/1024)+'KB';
}else if(size<1023*1024*1024){
(size/1024/1024)+'MB';
}else{
}
(size/1024/1024/1024*100)/100+'G';
列目录
列目录的方法是list(path),在交互过程中,经常会出现刷新当前目录的要求。故而有一个函数专门实现目录的刷新。下面我们看一下代码:
functiongetData(file){
currentFile =file;
var filename = file;
varfilenameArr = ('/');
filename = filenameArr[-1];
le('infospan','label:'+(filename=="rexseekaifapingtai"?"UP云盘":filename));
if(isId('infoButton')) le('infoButton','label:'+filename+';');//设置header文件名字
}
datalist = (file,0,true);
array_datalist = eval('('+datalist+')');
datalist_length = array_;
testadd(array_datalist);
functiontestadd(x){
//遍历数组删除以创建的id
mentById('fileList').innerHTML='';
//删除子节点
var list = x;
varfileListStr='';
if( == 0){
mentById('fileList').innerHTML="
}else{
for(vari=0;i<;i++){
var id = [i].fs_id;//文件id
var path = [i].path;//文件路径
id = path;
varnameArr = ('/');
var name = nameArr[-1];//文件名字
vartypeArr = ('.');
var type = typeArr[-1];//文件类型
varctime = [i].ctime;//文件创建时间
varmtime = [i].mtime;//文件修改时间
var size = [i].size;//文件大小
varisdir = [i].isdir;//是否是文件夹
fileListStr+='
class="list" >n';
fileListStr+='
20px 10px 20px;height:30px;weight:30px;"/>n';
fileListStr+='
fileListStr+='
'+name+'
n';fileListStr+='
style="margin-top:5px;font-size:0.8em;color:#999">'+filestr(isdir,mtime,size)+'
n';
fileListStr+='
fileListStr+='
}
mentById('fileList').innerHTML=fileListStr;
addListener();
}
}
我们看到在list方法返回的json字符串中,有个字段叫isdir,它的值或者为0或者为1,当为0时,说明当前的名字对应的是个文件,当为1时,说名当前的名字对应的是个目录。
list(path,byInt,increase) 方法中,path指明了要列的目录名,byInt表明排序的方式,0为按文件名,2为按修改时间,3为按大小,注意目录没有大小。increase表示了排序的类型,true为升序,false为降序。在本例中datalist = (file,0,true);意味者按照文件名的升序排序。
至于复制和移动的使用比较简单,在这里就不多讲了。大家可以参看Rexsee在线手册。
文件交互操作
这个过程其实是本地和远程的交互过程。文件或者从本地上传到远程(百度PCS)或者从远程(百度PCS)下载到本地。是基于文件流的操作。
上传
使用rexsee的文件选择器选择本地文件,上传完毕后,分析返回的字符串。
图2-1
在图2-1中表明使用rexsee文件选择器选择了图片.
代码如下:
eIcons("file:///android_asset/icons/","file:///android_asset/i/**上传文件到到当前文件夹**/
/**文件选择器**/
functionuploadFile(){
cons/","apk:file:///android_asset/icons/;");
mStyle("icon-url:file:///android_asset/icons/;","icon-url:file:///android_asset/icons/;");
('height:'+screenHeight+';window-modeless:true;window-dim-amou
ensions('jpg,png,apk');
ptipleSelection(true);
ssFolderSelection(true);
nt:0;');
}
/*文件选择器结束*/
functiononFileSelected(){
varlocalPath = ection();
localPath = eval('('+localPath+')');
for(vari=0;i<;i++){
var _localPath=localPath[i];
//alert(_localPath);
var _localPathArr = _('/');
//alert(_localPathArr);
var _filename = _localPathArr[_-1];
alert( _filename );
if(xk_reg(_filename)===true&&_filename!=''){
var Path = currentFile+'/'+_filename;
alert('上传本地文件'+_localPath+'n'+'到服务器'+Path);
_isWifi();
varrt=(Path,_localPath);
rt=eval(‘(‘+rt+’)’);
varrt_path=;
if (==Path){
var _fileSize = (_localPath);
uploadSize(_fileSize);
}else
{
varrt_msg=_msg;
(‘上传失败,失败信息为’+rt_msg);
}
}else{
(xk_reg(_filename));
}
}
getData(currentFile);
}
上传成功的返回应该是如图2-2所显示的样子。
图2-2
因为上传的操作可能会带来流量很大的问题,所以我们做了一个wifi可用的一个判断,判断如果wifi不可用,提示是否打开wifi设置以便节省流量。如下面所示:
/**提示用户打开wifi**/
function _isWifi(){
if(!led()){
if(prompt('3button','title=WIFI;message=当前WIFI未启动,是否启WiFi;options=确定|取消;')=='确定'){
ttings();
}
}
}
图2-3
如果确定会出现wifi设置画面:
下载
下载和上传的过程正好相反。ad()方法主要就是指定了本地下载地址。这里就不再详细阐述。
开发小结
使用Rexsee开发百度PCS应用时,通过html绘制界面,通过javascript和rexseeAPI实现操作的交互。


发布评论