专栏名称: 51CTO官微
51CTO官方公众号——聚焦最新最前沿最有料的IT技术资讯、IT行业精华内容、产品交流心得。本订阅号为大家提供各种技术资讯和干货,还会不定期举办有奖活动,敬请关注。
目录
相关文章推荐
程序员的那些事  ·  字节“代码抄袭案”败诉,判赔 8267 万! ·  15 小时前  
码农翻身  ·  DeepSeek+豆包+通义+BetterY ... ·  22 小时前  
OSC开源社区  ·  AI的三岔路口:专业模型和个人模型 ·  2 天前  
OSC开源社区  ·  DS豆包通义BTY王炸组合,我做了个元宵AI ... ·  昨天  
程序猿  ·  离谱!下载 DeepSeek 将判 20 ... ·  2 天前  
51好读  ›  专栏  ›  51CTO官微

HarmonyOS版百度网盘客户端

51CTO官微  · 公众号  · 程序员  · 2021-12-23 11:45

正文

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


百度网盘开放平台:
https://pan.baidu.com/union/doc/


应用主入口


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


登录界面


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

接入流程文档:
https://pan.baidu.com/union/doc/0ksg0sbig

这里需要注意一个细节,官方文档提供的授权地址是 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®type=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;
    }


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()); // 这里是上面转换链接的方法


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

主页面


使用 ListContainer 来显示文件列表:

代码有点多,不在本文介绍了,可以参考 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;
        }
    }

下载页面


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

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

怎么获取该应用


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


需要修改的地方:


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






请到「今天看啥」查看全文