从昨晚忙到今天凌晨4点,终于搞明白了Dribbble认证拿到了用于调用DribbbleAPI的Access Token, 并在界面中使用WebView获取用户授权后自动跳转。
整个过程非常简单,但是因为本人第一次调用Web API,遇到很多各种各样的问题,花了相当长的时间。
1.首先,在Dribbble的Developer网站上注册一个应用,获取到Client ID和Client Secret.
2.然后在代码中开启WebView加载Dribbble的authorize登录认证页面,URL必需的参数有两个,一个client_id,和一个scope。scope是要获取的权限,比如是只读权限,还是写入权限等等。
用户登陆后会显示授权界面。
这里要注意了,当用户点击授权后,网页会跳转到一个URL,就是在注册应用时填写的URL + code码。这个code码是我们需要的,稍后要用于获取Access Token。
现在的问题是,当用户点击授权后,页面会显示“页面无法显示”的信息,非常糟糕。要解决这个问题,就要获取到WebView页面加载完成的监听事件。
解决方法:自己写一个WebViewClient对象继承自WebViewClient,复写onPageFinished方法,该方法有一个URL参数,即完成加载的页面URL。因为我们知道该URL中有我们需要的“code”参数,就可以进行判断了。如果含有“code”字符串,则把code参数切出来传出去即可。
3.获取到Dribbble给我们返回的”code“参数后,就可以用这个参数来提交表单获取Access Token了。
获取Access Token的URL需要三个参数,除了上面提到的Client ID外,还有Client Secret和先前授权给我们的code码。
这里出现了第二个问题。一开始小生用HttpURLConnection类来POST表单,一切正常。然后为了精简代码,使用了Google的Volley网络框架造成了一个问题。
小生开启认证Activity时调用的是startActivityForResult()方法,然后在onActivityResult方法中接收Access Token,结果发现,onActivityResult被调用时,Volley还没有返回Access Token,造成无法接收Json数据进行解析。
这里要记录一下,自己在onActivityResult方法上栽跟头不是第一次了,发现该方法不被调用时要检查:
1.参数有三个,其中一个int类型的requestCode,一个int类型的resultCode和带数据的Intent。判断时判断的是另一个Activity传过来的resultCode,即创建Intent时传入的RESULT_OK,和当前RESULT_OK的值是否相等。要注意的是,RESULT_OK的值是一个int常量,-1.
2.检查intent中的数据是否为null。
当然Activity之间的数据传输不止这一种方法,小生决定拿到Access Token后直接存入数据库一劳永逸。