Android仿微博功能实现(使用2017新版文档)

前言

记录一下自己的学习练习记录,利用一些时间写了这个仿微博,其实一开始是要写一个仿网易音乐的,结果找不到一个音乐接口啊,只好选择了微博来练手,戏剧性的是写了一半的时候,我就找到了音乐接口,笑cry,这里也推荐给大家这个API集合,很多你想用的接口里边都有,音乐,视频,数学,机器学习,购物健身娱乐什么的,有兴趣可以收藏下来慢慢玩。
有兴趣和我一试的friends。。

  • 从这个项目里可以复习Android几乎所有基础知识,也可以作部分控件和库使用方法的一个小简介。
  • 代码不是结构很严谨的那种,但是很容易看懂实现过程,我会继续努力的,大神们务必留下指点
  • 未使用官方SDK开发,想自己把所有套路摸一遍再去看官方的,能更好的知道怎样更好的去实现

    开篇

    开发前的准备

    这里整理了一张开发流程图
    第一步,当然是跑去微博开放平台申请开发者账号,新浪这个网页有个坑,就是你很可能点登录登不上(它会没有任何反应的。。),这时候你就需要先去微博首页登录你的微博账号,然后再回到开放平台首页刷新一下页面就登录成功了。登陆成功以后,微链接–>立即创建–>移动应用,填好信息后点击创建,网页反应可能有些慢,稍等就会显示创建成功。此时会跳到应用信息界面,在这个页面我们要获得到App Key和App Secret两个参数的信息,接下来我们要做微博的授权,所以顺带把相关信息填写好,高级信息–>授权回调页,两项我们都填成一样的即可,在这里我填的是百度的首页,这里有第二个坑万万别踩。。。就是回调地址千万不要填写新浪网,其他都可以,否则后续你将得不到你要的信息,其他我们可以暂时不填,到之后用的时候再去填写。

    OAuth2 授权

    在文档–>API文档中,可以找到关于OAuth2授权的文档。这里微博也为我们提供了一个很好的API测试工具,但是在授权之前我们还用不着。之后可以使用。从文档我们需要看的信息有,首先是请求的URL。其次,很重要的就是请求的方式。再有就是请求参数,在表格里,属性为true的是必选属性,在这里我们要传递两个参数,可以从说明中看到是刚刚获取到的APPKEY和填写的授权回调地址,授权回调地址在这里,就是在授权完成返回结果的时候,可以从中获取到返回的参数所使用的。示例里使用了Get请求方法。
    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
    //请求
    https://api.weibo.com/oauth2/authorize?client_id=123050457758183&redirect_uri=http://www.example.com/response&response_type=code
    //同意授权后会重定向
    http://www.example.com/response&code=CODE
    ```
    这里我网络请求使用了OkHttp,get请求直接访问URL,将参数直接加在URL后边(多个参数用&连接),直接访问即可。
    POST方法后续介绍使用方法。
    这里我们可以开始 请求OAuth授权 ,我使用了一个WebView来加载授权页面,
    ```JAVA
    final WebView webView = (WebView) findViewById(R.id.webView);
    //管理WebView
    WebSettings webSettings = webView.getSettings();
    //启用JavaScript调用功能
    webSettings.setJavaScriptEnabled(true);
    //启用缩放网页功能
    webSettings.setSupportZoom(true);
    //获取焦点
    webView.requestFocus();
    RequestParams params = new RequestParams();
    String url1 = params.put(Constants.APP_KEY, Constants.REDIRECT_URL);
    webView.loadUrl(url1);
    //WebViewClient主要帮助WebView处理各种通知、请求事件
    webView.setWebViewClient(
    new WebViewClient() {
    @Override
    public void onPageStarted(WebView view, String url, Bitmap favicon) {
    super.onPageStarted(view, url, favicon);
    System.out.println("kaishi");
    if (url.startsWith(Constants.REDIRECT_URL)) {
    String code = url.split("=")[1];
    System.out.println("code is " + code);
    requestmsg(code);
    }
    }
    });

这样当回调页面时候,就可以从其网页URL中截取出code的值,以供下一步获取其他值使用。
接下来我们就要拿着code去 获取授权 以得到access_token了。打开相关文档,依旧是首先查看重点三项,URL,请求方式,请求参数,这次用到了POST请求。

OkHttp使用方法(包含maven使用)

Okhttp的post请求。这里我们来简介一下okhttp的用法。首先要添加它的依赖,在这里,我们可以去maven仓库去寻找我们需要使用的第三方库。百度maven repository即可。搜索到结果以后,在下方众多版本里,选择使用人数最多的办版本,一般都不会出错。这里我们选择3.4.1版本。并复制他的依赖

1
compile group: 'com.squareup.okhttp3', name: 'okhttp', version: '3.4.1

我们需要删去group,name,version等标签和引号等,保留冒号,见如下格式

1
compile 'com.squareup.okhttp3:okhttp: 3.4.1'

在app.gradle里添加,然后同步。
无论何种请求方式,我们都要先创建一个OkhttpClient实例。

1
OkHttpClient client = new OkHttpClient();

然后,如果是get请求,我们只需要将处理准备好的URL直接进行访问和获取数据即可。

1
2
3
Request request = new Request.Builder().url(准备好的URL).build();
Call call = client.newCall(request);
call.enqueue(new Callback() {···});

如果是post请求方式,那么我们则会多使用一个FormBody来放置参数。

1
2
3
4
5
6
FormBody formBody = new FormBody.Builder().add("client_id", Constants.APP_KEY)
.add("client_secret", Constants.APP_SECRET)
.add("grant_type", "authorization_code")
.add("code", code)
.add("redirect_uri", Constants.REDIRECT_URL)
.build();

将post请求需要的参数都以键值对的形式通过add方法添进formBody中。然后再使用Request发起请求传递

1
2
3
4
5
6
7
8
9
10
FormBody formBody = new FormBody.Builder().add("client_id", Constants.APP_KEY)
.add("client_secret", Constants.APP_SECRET)
.add("grant_type", "authorization_code")
.add("code", code)
.add("redirect_uri", Constants.REDIRECT_URL)
.build();
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder().url("https://api.weibo.com/oauth2/access_token").post(formBody).build();
Call call = client.newCall(request);
call.enqueue(new Callback() {···});

然后我们需要将返回的json数据封装成简单的实体类,返回的数据在new Callback() {···}的onresponse方法中获得和处理,这里说明,无论返回的数据是否正确,只要有返回,都会在onResponse中处理,onFailure中不用于返回数据不正确的情况。
这里我们可以将返回的数据封装成一个Token类。可以自己手动写,但是现今有工具就要学会使用嘛,往上很多json自动转换POJO的。我使用的是这个,正确格式的json串复制进去生成实体类就好。
获取json返回数据,首先

1
String responseData = response.body().string();

获取工作到这里就结束了,接下来我们就该开始做解析数据工作。这里我使用的是GSON
依旧去maven仓库找到它的依赖,添加到gradle中,我们就可以使用它解析数据了
接下来你要做的就是,使用Gson将它封装成实体类,代码如下

1
2
3
Token token = new Token();
Gson gson = new Gson();
token = gson.fromJson(responseData, Token.class);

这样我们就完成了封装。

1
2
final String access_token=token.getAccess_token();
final String uid=token.getUid();

这些操作应该就很简单了很容易理解了。
其他的数据处理也是一样的操作。 下一篇中我们将获取解析好友微博。
源码地址,写练手项目博客不带完整源码的都是流氓(逃~