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+='

    n';

    fileListStr+='

    '+name+'

    n';

    fileListStr+='

    style="margin-top:5px;font-size:0.8em;color:#999">'+filestr(isdir,mtime,size)+'

    n';

    fileListStr+='

    n';

    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实现操作的交互。