Android新浪微博开发
学习Android已经挺长的一段时间了,正好要毕业了,于是就决定选了Android新浪微博这个课题。像很多人一样,刚开始是打算去网上下载源码的,但是发现很多源码都是太老了,已经和新浪微博现在的开发平台的文档已经完全不符了= =,这点真是要吐槽下,好多代码都是没最新的分享,于是只好自己去新浪开放平台下载sdk文档去看。时间是2016年3月13号,我以后都是在这个时间点开发的,都是用的最新的sdk文档。用的jar包是weiboSDKCore_3.1.4,文档是 微博Android平台SDK文档V3.1.2,可以在新浪微博开放平台下到。
新浪微博Android SDK为开发者提供了Oauth2.0授权认证,并集成SSO登录功能,使第三方应用无需了解复杂的验证机制即可进行授权登录操作,并提供微博分享功能,第三方应用可直接通过微博客户端进行分享。
这些知识点大家估计都知道,网上也能查到,废话不多说,马上写代码和流程细节。
1、下载新浪微博开发SDK
1.1导入工程
在Eclipse中,点击File->Import->Existing Projects into Workspace,输入正确的路径,导入WeiboSDK和WeiboSDK Demo工程(如果出现乱码请将编码格式改成UTF-8格式)
1.2修改debug.keystore
MD5工具是根据keystore来生成签名的,不同的keystore生成的签名是不一样 的。此Demo的签名是用官网提供的keystore生成的,若要顺利运行Demo程序,需要进 行设置或是替换keystore,两种方法选择一种操作即可:
方式一:替换keystore:把Android默认的debug.keystore(在 C:\Users\XXXXX\.android目录下)替换成官方在GitHub上提供的debug.keystore。
方式二:在Eclipse中设置工程keystore:在Eclipse中点击“WindowsPreferencesAndroidBuild”,在Custom debug keystore中选择Demo中的debug.keystore,如下图,点击ApplyOK,Demo即可正常运行。
1.3运行weiboSDK Demo在你的手机上
这是在我手机上运行的结果,我选择的是SSO授权(web),会返回一个token,这个就是你之后访问用户资源的重要标识。
2.集成前的准备
2.1申请APP_KEY和填写签名信息等等
去新浪微博开放平台去创建一个你的应用,填写信息,这里设计到最重要的有几个信息:1.Android签名包信息,需要填写你的应用包名,还有个应用签名,很多人都死在这个地方,首先你要下载app_signatures.apk这个签名软件,这个apk已经在你下的SDK文件夹里了,然后把它安装到你手机里。接着运行你的应用在你手机里,安装完后打开你之前装好的签名软件,输入你应用的包名,就会生成Android签名了。把他保存然后输入到新浪开放平台的信息栏里。2.在新浪微博开发者界面选择我的应用里面的高级信息,里卖年有个OAuth2.0授权设置,将授权回调页和取消授权回调页的网址填成 http://www.sina.com。其他的一些信息自己再填写就好,等提交之后新浪就会返回APP KEY和APP SECRET给你了。
2.2在应用里集成环境
将WeiboSDK工程整个目录拷贝到和你自己的工程相同的目录下,在你自己的工程中,添加WeiboSDK工程的引用:工程->右键->properties->Android->Add->选择工程
注意 : 无论使用哪一种方式,都需要先将demo 中lib目录下的对应的全部 libweibosdkcore.so 文件目录 拷贝到你的目标工程中 D e m o工程中的 weibosdkcore. jar与github上的 weibosdkcore_v3. x . x .jar 包是同一个。(就是说你要把so文件全部拷贝到自己那里,并且把jar文件也加入自己的应用环境里)
3.代码实现
3.1添加权限
< uses-permission android:name = "android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
3.2认证过程
常量类,这里只要修改APP KEY就行了,改成自己的
/*
* Copyright (C) 2010-2013 The SINA WEIBO Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.sdf.simplebeautyweibo.utils;
/**
* 该类定义了微博授权时所需要的参数。
*
* @author SINA
* @since 2013-09-29
*/
public interface Constants {
/** 当前 DEMO 应用的 APP_KEY,第三方应用应该使用自己的 APP_KEY 替换该 APP_KEY */
public static final String APP_KEY = "20665779879";
/**
* 当前 DEMO 应用的回调页,第三方应用可以使用自己的回调页。
*
* <p>
* 注:关于授权回调页对移动客户端应用来说对用户是不可见的,所以定义为何种形式都将不影响,
* 但是没有定义将无法使用 SDK 认证登录。
* 建议使用默认回调页:https://api.weibo.com/oauth2/default.html
* </p>
*/
public static final String REDIRECT_URL = "http://www.sina.com";
/**
* Scope 是 OAuth2.0 授权机制中 authorize 接口的一个参数。通过 Scope,平台将开放更多的微博
* 核心功能给开发者,同时也加强用户隐私保护,提升了用户体验,用户在新 OAuth2.0 授权页中有权利
* 选择赋予应用的功能。
*
* 我们通过新浪微博开放平台-->管理中心-->我的应用-->接口管理处,能看到我们目前已有哪些接口的
* 使用权限,高级权限需要进行申请。
*
* 目前 Scope 支持传入多个 Scope 权限,用逗号分隔。
*
* 有关哪些 OpenAPI 需要权限申请,请查看:http://open.weibo.com/wiki/%E5%BE%AE%E5%8D%9AAPI
* 关于 Scope 概念及注意事项,请查看:http://open.weibo.com/wiki/Scope
*/
public static final String SCOPE =
"email,direct_messages_read,direct_messages_write,"
+ "friendships_groups_read,friendships_groups_write,statuses_to_me_read,"
+ "follow_app_official_microblog," + "invitation_write";
}
public class MainActivity extends Activity implements OnClickListener {
private Button btn_token;
private TextView tv;
private AuthInfo mAuthInfo;
private SsoHandler mSsoHandler;
/** 封装了 "access_token","expires_in","refresh_token",并提供了他们的管理功能 */
private Oauth2AccessToken mAccessToken;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
inflaterView();
setListener();
initData();
}
private void inflaterView() {
btn_token = (Button) findViewById(R.id.btn_token);
tv = (TextView) findViewById(R.id.textView1);
}
private void setListener() {
btn_token.setOnClickListener(this);
}
private void initData() {
mAuthInfo=new AuthInfo(this, Constants.APP_KEY, Constants.REDIRECT_URL, Constants.SCOPE);
mSsoHandler=new SsoHandler(MainActivity.this, mAuthInfo);
}
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
switch (v.getId()) {
case R.id.btn_token:
mSsoHandler.authorizeWeb(new AuthListener());
break;
default:
break;
}
}
/**
* 微博认证授权回调类。 1. SSO 授权时,需要在 {@link #onActivityResult} 中调用
* {@link SsoHandler#authorizeCallBack} 后, 该回调才会被执行。 2. 非 SSO
* 授权时,当授权结束后,该回调就会被执行。 当授权成功后,请保存该 access_token、expires_in、uid 等信息到
* SharedPreferences 中。
*/
class AuthListener implements WeiboAuthListener {
@Override
public void onCancel() {
// TODO Auto-generated method stub
Toast.makeText(MainActivity.this,
R.string.weibosdk_demo_toast_auth_canceled, Toast.LENGTH_LONG).show();
}
@Override
public void onComplete(Bundle values) {
// TODO Auto-generated method stub
// 从 Bundle 中解析 Token
mAccessToken = Oauth2AccessToken.parseAccessToken(values);
// 从这里获取用户输入的 电话号码信息
String phoneNum = mAccessToken.getPhoneNum();
if (mAccessToken.isSessionValid()) {
// 显示 Token
updateTokenView(false);
// 保存 Token 到 SharedPreferences
AccessTokenKeeper.writeAccessToken(MainActivity.this,
mAccessToken);
Toast.makeText(MainActivity.this,
R.string.weibosdk_demo_toast_auth_success,
Toast.LENGTH_SHORT).show();
} else {
// 以下几种情况,您会收到 Code:
// 1. 当您未在平台上注册的应用程序的包名与签名时;
// 2. 当您注册的应用程序包名与签名不正确时;
// 3. 当您在平台上注册的包名和签名与您当前测试的应用的包名和签名不匹配时。
String code = values.getString("code");
String message = getString(R.string.weibosdk_demo_toast_auth_failed);
if (!TextUtils.isEmpty(code)) {
message = message + "\nObtained the code: " + code;
}
Toast.makeText(MainActivity.this, message, Toast.LENGTH_LONG)
.show();
}
}
@Override
public void onWeiboException(WeiboException e) {
// TODO Auto-generated method stub
Toast.makeText(MainActivity.this,
"Auth exception : " + e.getMessage(), Toast.LENGTH_LONG).show();
}
}
/**
* 显示当前 Token 信息。
*
* @param hasExisted
* 配置文件中是否已存在 token 信息并且合法
*/
private void updateTokenView(boolean hasExisted) {
String date = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss")
.format(new java.util.Date(mAccessToken.getExpiresTime()));
String format = getString(R.string.weibosdk_demo_token_to_string_format_1);
tv.setText(String.format(format, mAccessToken.getToken(), date));
String message = String.format(format, mAccessToken.getToken(), date);
if (hasExisted) {
message = getString(R.string.weibosdk_demo_token_has_existed)
+ "\n" + message;
}
tv.setText(message);
}
}
/**
* 该类定义了微博授权时所需要的参数。
*
* @author SINA
* @since 2013-10-07
*/
public class AccessTokenKeeper {
private static final String PREFERENCES_NAME = "com_weibo_sdk_android";
private static final String KEY_UID = "uid";
private static final String KEY_ACCESS_TOKEN = "access_token";
private static final String KEY_EXPIRES_IN = "expires_in";
private static final String KEY_REFRESH_TOKEN = "refresh_token";
/**
* 保存 Token 对象到 SharedPreferences。
*
* @param context 应用程序上下文环境
* @param token Token 对象
*/
public static void writeAccessToken(Context context, Oauth2AccessToken token) {
if (null == context || null == token) {
return;
}
SharedPreferences pref = context.getSharedPreferences(PREFERENCES_NAME, Context.MODE_APPEND);
Editor editor = pref.edit();
editor.putString(KEY_UID, token.getUid());
editor.putString(KEY_ACCESS_TOKEN, token.getToken());
editor.putString(KEY_REFRESH_TOKEN, token.getRefreshToken());
editor.putLong(KEY_EXPIRES_IN, token.getExpiresTime());
editor.commit();
}
/**
* 从 SharedPreferences 读取 Token 信息。
*
* @param context 应用程序上下文环境
*
* @return 返回 Token 对象
*/
public static Oauth2AccessToken readAccessToken(Context context) {
if (null == context) {
return null;
}
Oauth2AccessToken token = new Oauth2AccessToken();
SharedPreferences pref = context.getSharedPreferences(PREFERENCES_NAME, Context.MODE_APPEND);
token.setUid(pref.getString(KEY_UID, ""));
token.setToken(pref.getString(KEY_ACCESS_TOKEN, ""));
token.setRefreshToken(pref.getString(KEY_REFRESH_TOKEN, ""));
token.setExpiresTime(pref.getLong(KEY_EXPIRES_IN, 0));
return token;
}
/**
* 清空 SharedPreferences 中 Token信息。
*
* @param context 应用程序上下文环境
*/
public static void clear(Context context) {
if (null == context) {
return;
}
SharedPreferences pref = context.getSharedPreferences(PREFERENCES_NAME, Context.MODE_APPEND);
Editor editor = pref.edit();
editor.clear();
editor.commit();
}
}
完成了这些之后就能在自己手机上运行自己的应用了,我这边是成功可以授权并且返回token值的。