菟盘 - 鸿蒙版百度网盘客户端

系统
菟盘,由百度网盘开放平台提供的API开发的一个百度网盘客户端。主要提供网盘文件浏览,文件下载等。(100M以下文件不限速,超过100M就是祖传100k/s了,支持会员加速)。

[[440624]]

想了解更多内容,请访问:

51CTO和华为官方合作共建的鸿蒙技术社区

https://harmonyos.51cto.com

介绍

什么是菟盘

菟盘,由百度网盘开放平台提供的API开发的一个百度网盘客户端。

主要提供网盘文件浏览,文件下载等。(100M以下文件不限速,超过100M就是祖传100k/s了,支持会员加速)

👉百度网盘开放平台

应用主入口

本应用主入口是MainAbility ,当打开应用时,会判断用户是否已登录,未登录会跳转到登录页面,已登录会跳转到主页。

登录界面

登录通过webview来请求百度的access_token

#星光计划2.0# 菟盘 - 鸿蒙版百度网盘客户端-鸿蒙HarmonyOS技术社区

接入流程文档

这里需要注意一个细节,官方文档提供的授权地址是PC版的,需要改造一下,来适配手机页面。

原理是先在百度H5端登录,登录完成后重定向至授权地址。

/* 
    百度应用信息 
     */ 
    String YOUR_CLIENT_ID = ""; //填自己的 
    String YOUR_REGISTERED_REDIRECT_URI = "https://dsttl3.cn/baiduapi.html"; //需要和自己在百度网盘开放平台填写的相同,有个地址就行,不需要在服务器操作。当然也可以在服务器请求token后直接返回。 
    String YOUR_CLIENT_SECRET = ""; //填自己的 
 
    /** 
     * @return 移动端登录授权链接 
     */ 
 
    public String getLoginUrl(){ 
 
        String url = "https://openapi.baidu.com/oauth/2.0/authorize?response_type=code" + 
                "&client_id=" +YOUR_CLIENT_ID + 
                "&redirect_uri=" + YOUR_REGISTERED_REDIRECT_URI + 
                "&scope=basic,netdisk&force_login=0"
        try { 
            url = URLEncoder.encode(url,"UTF-8"); 
            url = "https://wappass.baidu.com/passport/?login&tpl=wimn&sms=1&regtype=1&u=" + 
                    url + 
                    "&extrajson=%7b%22src%22%3a%22se_000000%22%7d#/password_login"
            return url; 
        } catch (UnsupportedEncodingException e) { 
            e.printStackTrace(); 
            return null
        } 
    } 
 
    /** 
     * @return Access_token授权链接 
     */ 
 
    public String getAccessTokenUrl(String CODE){ 
        return "https://openapi.baidu.com/oauth/2.0/token?grant_type=authorization_code" + 
                "&code=" + CODE + 
                "&client_id=" + YOUR_CLIENT_ID + 
                "&client_secret=" + YOUR_CLIENT_SECRET + 
                "&redirect_uri=" + YOUR_REGISTERED_REDIRECT_URI; 
    } 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.

webview内的操作

WebView webView = (WebView) findComponentById(ResourceTable.Id_login_wv); 
        webView.getWebConfig().setJavaScriptPermit(true); 
        webView.setWebAgent(new WebAgent(){ 
            @Override 
            public boolean isNeedLoadUrl(WebView webView, ResourceRequest request) { 
                if (request.getRequestUrl().toString().startsWith("https://dsttl3.cn")){ // 这个链接是你所填写的 YOUR_REGISTERED_REDIRECT_URI 这里只写了开头,效果相同 
                    String code = request.getRequestUrl().toString().split("code=")[1]; 
                    String Access_token_url = new AppUtils().getAccessTokenUrl(code); 
                    new Thread(new Runnable() { 
                        @Override 
                        public void run() { 
                            try { 
                                OkHttpClient client = new OkHttpClient(); 
                                Request request = new Request.Builder().url(Access_token_url) 
                                        .header("User-Agent","pan.baidu.com"
                                        .build(); 
                                Call call = client.newCall(request); 
                                String accessTokenJson = call.execute().body().string(); 
                                AccessToken accessToken = new Gson().fromJson(accessTokenJson, AccessToken.class); 
                                System.out.println(accessToken.getAccess_token()); 
                                getUITaskDispatcher().asyncDispatch(new Runnable() { 
                                    @Override 
                                    public void run() { 
                                        Preferences preferences = new DataUtils().getPreferences(getApplicationContext()); 
                                        preferences.putString("token",accessToken.getAccess_token()); 
                                        preferences.flush(); 
                                        Intent intent1 = new Intent(); 
                                        Operation operation = new Intent.OperationBuilder() 
                                                .withBundleName(MyApp.bundleName) 
                                                .withAbilityName("cn.dsttl3.tupan.Ability.IndexAbility"
                                                .build(); 
                                        intent1.setOperation(operation); 
                                        startAbility(intent1); 
                                        terminateAbility(); //因为登录完成后无需返回改界面,通过 terminateAbility() 方法销毁该界面 
                                    } 
                                }); 
                            } catch (IOException e) { 
                                e.printStackTrace(); 
                            } 
                        } 
                    }).start(); 
                    return false
                } 
                return super.isNeedLoadUrl(webView, request); 
            } 
        }); 
        webView.load(new AppUtils().getLoginUrl()); // 这里是上面转换链接的方法 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.

当用户完成登录后,token就保存到本地了。

主页面

使用ListContainer来显示文件列表

#星光计划2.0# 菟盘 - 鸿蒙版百度网盘客户端-鸿蒙HarmonyOS技术社区

代码有点多,不在本文介绍了,可以参考ListContainer的相关文档

这里介绍一下防手滑操作

当该应用只有一个界面时,一不小心返回,导致应用直接退出,可以使用这个方法进行一个提醒。

/** 
     * 防止误退出操作 
     */ 
    boolean exit = true
    @Override 
    public boolean onKeyDown(int keyCode, KeyEvent keyEvent) { 
        if (exit){ 
            new ToastDialog(getContext()).setText("再次返回退出程序").show(); 
            exit = false
            new Thread(new Runnable() { 
                @Override 
                public void run() { 
                    Time.sleep(3000);//三秒内再次返回退出程序 
                    exit=true
                } 
            }).start(); 
            return true
        }else { 
            return false
        } 
    } 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.

下载页面

提供两种下载方式,本地下载和Aria2下载

#星光计划2.0# 菟盘 - 鸿蒙版百度网盘客户端-鸿蒙HarmonyOS技术社区

解析处理的链接不能直接下载,必需要设置User-Agent字段为pan.baidu.com才能正常下载

怎么获取该应用

1、自己编译,本文附件提供源码

需要修改的地方

  •  包名

config.json 下的bundleName,和cn.dsttl3.tupan目录下MyApp.java的bundleName。不修改导致无法真机运行和页面跳转失败

  • 填写百度开放平台应用信息

cn.dsttl3.tupan.utils 目录下的 AppUtils.java

/* 
    百度应用信息 
     */ 
    String YOUR_CLIENT_ID = ""; //填自己的 
    String YOUR_REGISTERED_REDIRECT_URI = "https://dsttl3.cn/baiduapi.html"; //需要和自己在百度网盘开放平台填写的相同,有个地址就行,不需要在服务器操作。当然也可以在服务器请求token后直接返回。 
    String YOUR_CLIENT_SECRET = ""; //填自己的 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.

  签名文件

  • 这个需要自己操作

2、下载测试版

不需要自己下载代码进行编译

留言或私信华为账号,我会给你添加测试。然后通过华为官方发送的短信进行下载。

文章相关附件可以点击下面的原文链接前往下载

https://harmonyos.51cto.com/resource/1586

想了解更多内容,请访问:

51CTO和华为官方合作共建的鸿蒙技术社区

https://harmonyos.51cto.com

责任编辑:jianghua 来源: 鸿蒙社区
相关推荐

2021-12-22 09:26:04

百度网盘青春版下载速度

2012-03-29 14:22:20

云存储

2020-04-26 08:03:40

百度网盘流量

2022-08-26 05:39:00

监控隐私

2020-02-07 11:10:07

开源技术 趋势

2021-04-26 05:41:32

百度网盘秒传

2016-10-26 19:02:53

2021-05-29 07:40:20

百度网盘存储计算机技术

2018-09-30 10:58:20

云存储原理网盘

2012-03-30 13:51:38

2011-10-28 16:19:21

百度搜索

2020-04-16 09:38:43

百度破解开发者

2021-03-11 10:20:47

百度网盘存储计算机技术

2011-11-28 10:02:12

百度知道微问答移动

2017-09-12 17:05:02

AndroidLoading客户端

2013-05-16 11:12:29

百度百度MTC录制回放客户端
点赞
收藏

51CTO技术栈公众号