菟盘,由百度网盘开放平台提供的API开发的一个百度网盘客户端。
主要提供网盘文件浏览,文件下载等。(100M以下文件不限速,超过100M就是祖传100k/s了,支持会员加速)
本应用主入口是MainAbility ,当打开应用时,会判断用户是否已登录,未登录会跳转到登录页面,已登录会跳转到主页。
登录通过webview来请求百度的access_token
这里需要注意一个细节,官方文档提供的授权地址是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; }
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来显示文件列表
代码有点多,不在本文介绍了,可以参考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下载
解析处理的链接不能直接下载,必需要设置User-Agent字段为pan.baidu.com才能正常下载
需要修改的地方
包名
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.
签名文件
这个需要自己操作
不需要自己下载代码进行编译
留言或私信华为账号,我会给你添加测试。然后通过华为官方发送的短信进行下载。
文章相关附件可以点击下面的原文链接前往下载