新浪微博分享目前分为两种途径:
1,直接在自己的APP,弹出类似Dialog(sina集成)来完成授权,授权成功后可直接分享内容,全程都是在自己APP里完成分享。老版本的微博SDK中集成了弹出分享Dialog(WebView)的视图,以及插入文字、图片、URL等API,直接调用接口中的update就可以分享,此方法是在自己的APP中弹出类似Dialog的形式来完成的,分享的所有过程都在一个界面。
【APP分享-弹出sina封装好的Dialog-(授权)--分享---Dialog消失】
2,最新版的微博SDK,建议移动开发者使用SSO授权机制,这种机制牵引用户在分享时,跳转到手机中的新浪微博客户端,然后授权验证以及发送微博。
【APP携带要分享的数据-----跳转到微博客户端----(授权或登录)----分享-----返回APP】
如果使用老版本的SDK,代码量很少,就可以很简单的分享一条微博,但是授权验证时:Failed to receive access token,始终无法获得授权token,初步认为sina不再支持这种方式了。
如果使用新版本的SDK,带来的问题就是用户的手机一定要安装了 新浪微博客户端 否则无法分享。
本文是sina建议的SSO机制,APP间跳转和回调,跟着我的步骤走,让你很快实现分享功能。
成为开发者
打开新浪开发平台,都应该有新浪微博账号吧,登录好后,在网页右上角点击个人信息-编辑开发者信息:
首先你要成为一名开发者,类型的话我选择的是个人,公司性质还需要一系列审核,很麻烦,我只是为了在APP里实现分享功能,并不会延伸到支付等高级API,所以选择了个人开发者,完成后会给邮箱发邮件,一系列的动作,相信你没问题。(至于身份认证,需要上传开发者证件,我认为无所谓,目前只是分享功能)
创建应用
开发平台,点击管理中心,在这个界面我们需要创建一个应用,以供sina识别我们自己的APP。
sina说的很明确了,创建一个应用,得到appkey,就能测试了,至于之后的审核、上线,就看你的需求了,不需要审核,就可以实现分享的功能!
创建应用
创建应用-移动APP应用地址什么之类的可以随意写(如果你只是demo)。
编辑应用
创建好后,记住APP_KEY,这是你身份标识,然后编辑应用:
你的APP是什么包名,这里就填什么,不一致的话,不能通过验证。
Android签名是sina让你使用它的APk,输入包名,生成一个唯一的MD5校验码
http://open.weibo.com/wiki/SDK 寻找Android SDK,下载下来,打开后有一个app_signatures.apk,部署到手机里,运行生成一个DM5签名,复制到网页中来。
Android下载地址就无所谓了,可以随意写。
高级信息
打开高级信息,编辑OAuth2.0 授权设置,因为是移动APP,我们要填写一个授权回调页,否则获取不到access_token,在这里我填写的是www.sina.com,【注意哦,这里填写什么,项目中的REDIRECT_URL的值就是什么,这俩得保持一直,否则验证不通过,就会遇到error:redicect_uri_mismatch 错误】,取消授权页这里可以什么都不输入,目前用不到。
关联账号
打开测试账号,输入自己的微博名称,关联一下,到此为止,已经成功了一半。
开发测试
导入jar包
把下载好的weibo_sdk.jar导入到项目中的libs。
配置跳转Action
在AndroidManifest.xml中,在需要接受消息(微博APP分享成功返回到自己APP)的类里声明对应的Action:
com.sina.weibo.sdk.action.ACTION_SDK_REQ_ACTIVITY如下代码:
<activity
android:name=".DemoActivity"
android:configChanges="keyboardHidden|orientation"
android:launchMode="singleTask"
android:screenOrientation="portrait"
android:theme="@android:style/Theme.Black.NoTitleBar" >
<intent-filter>
<action android:name="com.sina.weibo.sdk.action.ACTION_SDK_REQ_ACTIVITY"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</activity>
对应的Activity要实现IWeiboHandler.Response接口
初始化
protected Weibo mWeibo;
public static final String WEIBO_KEY = "你的APP_KEY";
public static final String REDIRECT_URL = "http://www.sina.com";//【和网站自己设置的回调页保持一致】
public Oauth2AccessToken mAccessToken;
public IWeiboAPI weiboApi;
protected Bitmap mSharedPic;
protected SsoHandler mSsoHandler;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// TODO init
mWeibo = Weibo.getInstance(WEIBO_KEY, REDIRECT_URL, null);
weiboApi = WeiboSDK.createWeiboAPI(AppMain.this, WEIBO_KEY);
weiboApi.responseListener(getIntent(), this);
String path = Environment.getExternalStorageDirectory().toString()
+ "/test.png";
mSharedPic = BitmapFactory.decodeFile(path);
}
Callback
在onCreate()和onNewIntent里加入weiboApi.responseListener(intent,this);
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
weiboApi.responseListener(intent, this);
}
当从微博发博器界面返回到该 Activity时 , 接 口 函 数 IWeiboHandler.Response.onResponse(...)会被调用,用户可以从该函数内获取成功或失败,以及取消的信息,如下:
/**
* 当从微博返回到该Activity时,此接口函数会被调用
*/
@Override
public void onResponse(BaseResponse baseResp) {
switch (baseResp.errCode) {
case com.sina.weibo.sdk.constant.Constants.ErrorCode.ERR_OK:
Toast.makeText(this, "分享成功", Toast.LENGTH_LONG).show();
break;
case com.sina.weibo.sdk.constant.Constants.ErrorCode.ERR_FAIL:
Toast.makeText(this, baseResp.errMsg + "分享失败!", Toast.LENGTH_LONG)
.show();
break;
case com.sina.weibo.sdk.constant.Constants.ErrorCode.ERR_CANCEL:
Toast.makeText(this, "取消分享", Toast.LENGTH_LONG).show();
break;
}
}
在onActivityResult里加入回调函数
当用户点击分享按钮时,会进行SSO 登录,登陆完成后,返回该Activity,此时,我们需要在 onActivityResult(…)中调用 mSsoHandler.authorizeCallBack(requestCode,
resultCode, data) 函数,整个登陆才能结束。授权成功后,SDK会默认通过 AccessTokenKeeper 将access_token、expires_in信息其保存到SharedPreference 里面,
用 户 也 可 在 onComplete函 数中通过
Oauth2AccessToken token = AccessTokenKeeper.readAccessToken(getApplicationContext()); 获得 access_token 、 expires_in 信息。
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (mSsoHandler != null) {
mSsoHandler.authorizeCallBack(requestCode, resultCode, data);
}
}
实现WeiboAuthListener 接口
授权成功后,SDK 会默认通过AccessTokenKeeper 将access_token、expires_in 信息其保存到SharedPreference 里面,第三方也可在onComplete 函数中获得access_token、expires_in信息。具体如何保存和使用access_token 信息由开发者自行处理。
/***
* 实现WeiboAuthListener接口,返回授权结果
* 通过access_token和expires_in获取accesstoken
* @author Administrator
*
*/
class AuthDialogListener implements WeiboAuthListener {
@Override
public void onCancel() {
Toast.makeText(this, "Auth onCancel", Toast.LENGTH_LONG).show();
}
@Override
public void onComplete(Bundle values) {
String token = values.getString("access_token");
String expires_in = values.getString("expires_in");
mAccessToken = new Oauth2AccessToken(token, expires_in);
if (mAccessToken.isSessionValid()) {
AccessTokenKeeper.keepAccessToken(this, mAccessToken);
Toast.makeText(this, "授权认证成功!", Toast.LENGTH_LONG).show();
// TODO
reqMsg(mSharedPic);
}
}
@Override
public void onError(WeiboDialogError arg0) {
Toast.makeText(this, "授权失败:" + arg0.getMessage(), Toast.LENGTH_LONG)
.show();
}
@Override
public void onWeiboException(WeiboException arg0) {
Toast.makeText(this, "Auth Exception:" + arg0.getMessage(),
Toast.LENGTH_LONG).show();
}
}
调用authorize 方法,认证并授权
调用Weibo.authorize(…)方法,弹出授权对话框,进行授权。授权成功后即可获得 access_token。
在分享的按钮事件里添加验证:
@Override
public void onClick(View v) {
mAccessToken = AccessTokenKeeper.readAccessToken(AppMain.this);
if (mAccessToken.isSessionValid()) {
// TODO发微博
reqMsg(mSharedPic);
} else {
/** 不使用SSO方式进行授权验证 */
// mWeibo.anthorize(AppMain.this, new AuthDialogListener());
/** 使用SSO方式进行授权验证 */
mSsoHandler = new SsoHandler(this, mWeibo);
mSsoHandler.authorize(new AuthDialogListener(), null);
}
}
分享微博
/**
* 向weibo 客户端注册发送一个携带:文字、图片等数据
*
* @param bitmap
*/
public void reqMsg(Bitmap bitmap) {
weiboApi.registerApp();
/*图片对象*/
ImageObject imageobj = new ImageObject();
if (bitmap != null) {
imageobj.setImageObject(bitmap);
}
/*微博数据的message对象*/
WeiboMultiMessage multmess = new WeiboMultiMessage();
TextObject textobj = new TextObject();
textobj.text = "这是我的测试微博分享消息,大家看的到吗?";
multmess.textObject = textobj;
multmess.imageObject = imageobj;
/*微博发送的Request请求*/
SendMultiMessageToWeiboRequest multRequest = new SendMultiMessageToWeiboRequest();
multRequest.multiMessage = multmess;
//以当前时间戳为唯一识别符
multRequest.transaction = String.valueOf(System.currentTimeMillis());
weiboApi.sendRequest(this, multRequest);
}
运行效果图:
授权
SSO模式的授权
、
登录
分享
分享成功返回自己APP
网页微博效果
weiboSDK老版本和新版本区别:
答案是,新版本已经把类似StatusesAPI这种封装给取消了,也就是说,如果想不跳转微博客户端来分享,在自己APP里直接分享,就需要自己写StatusesAPI,调用微博api接口,实现分享。
到此为止,微博分享就成功啦,遇到errorcode千万不要着急头大,静下心来去openweibo看错误码标识,弄懂流程很容易就可以通过授权了,分享是最基本功能,以后还有很多接口可以调用,大家有什么问题或心得就在这里交流就可以哦~~
SDK:http://open.weibo.com/wiki/SDK
仿Oauth实现微博发文字图片:
Android SDK:https://github.com/mobileresearch/weibo_android_sdk
Scope接口:http://open.weibo.com/wiki/Scope
API文档:http://open.weibo.com/wiki/API%E6%96%87%E6%A1%A3
微博API:http://open.weibo.com/wiki/%E5%BE%AE%E5%8D%9AAPI
Error code:http://open.weibo.com/wiki/Error_code