zl程序教程

您现在的位置是:首页 >  APP

当前栏目

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

2023-03-14 11:24:03 时间

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

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

https://harmonyos.51cto.com

介绍

什么是菟盘

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

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

👉百度网盘开放平台

应用主入口

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

登录界面

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

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

接入流程文档

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

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

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

webview内的操作

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

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

主页面

使用ListContainer来显示文件列表

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

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

这里介绍一下防手滑操作

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

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

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

  签名文件

  • 这个需要自己操作

2、下载测试版

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

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

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

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

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

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

https://harmonyos.51cto.com