java实现的新浪微博分享代码实例
作者:hebedich 发布时间:2023-07-06 08:33:13
标签:java,微博,分享
weibo.java
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.user_center);
// 创建微博实例
mWeiboAuth = new WeiboAuth(this, Constants.APP_KEY,
Constants.REDIRECT_URL, Constants.SCOPE);
// 创建微博分享接口实例
mWeiboShareAPI = WeiboShareSDK.createWeiboAPI(this, Constants.APP_KEY);
// 当 Activity 被重新初始化时(该 Activity 处于后台时,可能会由于内存不足被杀掉了),
// 需要调用 {@link IWeiboShareAPI#handleWeiboResponse} 来接收微博客户端返回的数据。
// 执行成功,返回 true,并调用 {@link IWeiboHandler.Response#onResponse};
// 失败返回 false,不调用上述回调
if (savedInstanceState != null) {
mWeiboShareAPI.handleWeiboResponse(getIntent(), this);
}
}
/**
* 检查用户是否安装新浪微博
*/
public void isNotInstall() {
try {
// 检查微博客户端环境是否正常,如果未安装微博,弹出对话框询问用户下载微博客户端
if (mWeiboShareAPI.checkEnvironment(true)) {
// 注册第三方应用 到微博客户端中,注册成功后该应用将显示在微博的应用列表中。
// 但该附件栏集成分享权限需要合作申请,详情请查看 Demo 提示
mWeiboShareAPI.registerApp();
startSinaShare();
}
} catch (WeiboShareException e) {
e.printStackTrace();
Toast.makeText(UserCenter.this, e.getMessage(), Toast.LENGTH_LONG)
.show();
}
if (dialog != null) {
dialog.dismiss();
}
}
/**
* 微博认证授权回调类。 1. SSO 授权时,需要在 {@link #onActivityResult} 中调用
* {@link SsoHandler#authorizeCallBack} 后, 该回调才会被执行。 2. 非 SSO
* 授权时,当授权结束后,该回调就会被执行。 当授权成功后,请保存该 access_token、expires_in、uid 等信息到
* SharedPreferences 中。
*/
class AuthListener implements WeiboAuthListener {
@Override
public void onComplete(Bundle values) {
// 从 Bundle 中解析 Token
mAccessToken = Oauth2AccessToken.parseAccessToken(values);
if (mAccessToken.isSessionValid()) {
// 保存 Token 到 SharedPreferences
AccessTokenKeeper.writeAccessToken(UserCenter.this,
mAccessToken);
sendMessage();
}
}
@Override
public void onCancel() {
}
@Override
public void onWeiboException(WeiboException e) {
Toast.makeText(UserCenter.this,
"Auth exception : " + e.getMessage(), Toast.LENGTH_LONG)
.show();
}
}
/**
* 新浪微博用户授权
*/
public void startSinaShare() {
mSsoHandler = new SsoHandler(UserCenter.this, mWeiboAuth);
// 从 SharedPreferences 中读取上次已保存好 AccessToken 等信息,
mAccessToken = AccessTokenKeeper.readAccessToken(this);
// 如果Token有效,则直接调用发送微博
if (mAccessToken.isSessionValid()) {
sendMessage();
} else {
mSsoHandler.authorize(new AuthListener());
}
}
/**
* @See {@link Activity#onNewIntent}
*/
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
// 从当前应用唤起微博并进行分享后,返回到当前应用时,需要在此处调用该函数
// 来接收微博客户端返回的数据;执行成功,返回 true,并调用
// {@link IWeiboHandler.Response#onResponse};失败返回 false,不调用上述回调
mWeiboShareAPI.handleWeiboResponse(intent, this);
}
/**
* 当 SSO 授权 Activity 退出时,该函数被调用。
*
* @see {@link Activity#onActivityResult}
*/
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
// SSO 授权回调
// 重要:发起 SSO 登陆的 Activity 必须重写 onActivityResult
if (mSsoHandler != null) {
mSsoHandler.authorizeCallBack(requestCode, resultCode, data);
}
}
/**
* 接收微客户端博请求的数据。 当微博客户端唤起当前应用并进行分享时,该方法被调用。
*
* @param baseRequest
* 微博请求数据对象
* @see {@link IWeiboShareAPI#handleWeiboRequest}
*/
@Override
public void onResponse(BaseResponse baseResp) {
switch (baseResp.errCode) {
case WBConstants.ErrorCode.ERR_OK:
if (PublicFun.shareCondition()) {
gainBoBi();
} else {
Toast.makeText(this, R.string.share_success, Toast.LENGTH_LONG)
.show();
}
break;
case WBConstants.ErrorCode.ERR_CANCEL:
break;
case WBConstants.ErrorCode.ERR_FAIL:
Toast.makeText(this, R.string.errcode_deny, Toast.LENGTH_LONG)
.show();
break;
}
if (dialog != null) {
dialog.dismiss();
}
}
/**
* 第三方应用发送请求消息到微博,唤起微博分享界面。
* @see {@link #sendMultiMessage} 或者 {@link #sendSingleMessage}
*/
private void sendMessage() {
if (mWeiboShareAPI.isWeiboAppSupportAPI()) {
sendMultiMessage();
} else {
Toast.makeText(this, R.string.sina_share_hint, Toast.LENGTH_SHORT)
.show();
}
}
/**
* 第三方应用发送请求消息到微博,唤起微博分享界面。 注意:当
* {@link IWeiboShareAPI#getWeiboAppSupportAPI()} >= 10351 时,支持同时分享多条消息,
*
* @param hasText
* 分享的内容是否有文本
* @param hasImage
* 分享的内容是否有图片
* @param hasWebpage
* 分享的内容是否有网页
*/
private void sendMultiMessage() {
// 1. 初始化微博的分享消息
WeiboMultiMessage weiboMessage = new WeiboMultiMessage();
weiboMessage.textObject = getTextObj();
// 用户可以分享其它媒体资源(网页、音乐、视频、声音中的一种)
weiboMessage.mediaObject = getWebpageObj();
// 2. 初始化从第三方到微博的消息请求
SendMultiMessageToWeiboRequest request = new SendMultiMessageToWeiboRequest();
// 用transaction唯一标识一个请求
request.transaction = String.valueOf(System.currentTimeMillis());
request.multiMessage = weiboMessage;
// 3. 发送请求消息到微博,唤起微博分享界面
mWeiboShareAPI.sendRequest(request);
// 记录分享日志
PublicFun.sendShareAppLog(UserCenter.this,
getResources().getString(R.string.micro_blog));
if (dialog != null) {
dialog.dismiss();
}
}
/**
* 创建文本消息对象。
* @return 文本消息对象。
*/
private TextObject getTextObj() {
TextObject textObject = new TextObject();
textObject.text = getResources().getString(R.string.share_content);
return textObject;
}
/**
* 创建多媒体(网页)消息对象。
* @return 多媒体(网页)消息对象。
*/
private WebpageObject getWebpageObj() {
WebpageObject mediaObject = new WebpageObject();
mediaObject.actionUrl = getString(R.string.share_url);
mediaObject.identify = Utility.generateGUID();
mediaObject.title = getResources().getString(R.string.share_title);
mediaObject.description = getString(R.string.share_content);
Bitmap bmp = BitmapFactory.decodeResource(getResources(),
R.drawable.icon);
mediaObject.setThumbImage(bmp);
return mediaObject;
}
/**
* 该类定义了微博授权时所需要的参数。
* @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";
/**
* 保存 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.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.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();
}
}
以上所述就是本文的全部内容了,希望对大家熟练掌握java有所帮助。


猜你喜欢
- 目录问题:解答方案:总结问题:我遇到了一个有趣的问题,它的代码大概是这样的。List<Func<int>> acti
- mybatis #{}无法自动添加引号传入string类型时,无法自动添加引号,导致SQL将值识别为列名,导致SQL失败解决使用map类型代
- 一. 概述在开发后端接口, 通常都会涉及检验参数必填校验, 一般我们的处理都是很粗暴的写个if()判断, 然后抛异常. 本文将介绍通过代理的
- 一、说明1.spring aop中的 * 主要有两种方式,jdk * 和cglib * 2.从实现接口、继承父类的角度讨论区别3.从限
- 最近遇到了一个问题,一份很老的代码要修改里面的变量,源码早就和开发者一起不知去向,其中引用了一些jar包导致无法直接编译,只能直接修改.cl
- 二进制、八进制和十六进制向十进制转换都是非常容易的,就是“按权相加”。所谓“权”,也即“位权”。例如,十进制第1位的位权为100=1,第2位
- 在工作中经常读写文本文件,在读文件时,需要按开头的两个字节判断文件格式,然后按该格式读文件中的内容。 写文件时,也要按目标文件指定
- 很多开发者表示,不知道Android的Drawable和Bitmap之间如何相关转换。下面Android123给大家两种比较简单高效的方法。
- 在LINUX上部署带有JAR包的JAVA项目首先eclipse上要装上一个小插件,叫做Fat Jar点击Fat Jar红框里选上主类点击Ne
- 问题描述使用@Autowired处理多个同种类型的bean,出现@Value和@Bean的执行顺序问题。首先使用扫描包+注解的方式注册Use
- 基础铺垫在java中,关于json的lib有很多,比如jackjson、fastjson、gson等等,本人都用过,但是对于我等只需要让ja
- 据JDK5的新特性,用For循环Map,例如循环Map的Keyfor(String dataKey : paraMap.keySet())&
- 在上篇文章给大家介绍了Mybatis中#{}和${}传参的区别及#和$的区别小结,如果大家有需要可以参考下。$和#简单说明:#相当于对数据
- 本文实例为大家分享了C#实现多个计时器记录不同定时时间的具体代码,供大家参考,具体内容如下1.定义Timer类、定义委托//定义Timer类
- 序本文主要研究一下java String的internString.intern()java.base/java/lang/String.j
- 本文实例为大家分享了Android自定义圆环倒计时控件的具体代码,供大家参考,具体内容如下先来一张最终效果图:主要思路: 在画渐变
- 迭代器Iterator接口1.迭代器接口Iterable内置方法iterator(), 返回一个新建的 Iterator。如:public
- 相关文章:Java使用POI导出Excel(一):单sheetJava使用POI导出Excel(二):多个sheet相信在大部分的web项目
- 背景最近在研究搭建spring源码调试环境时,接触到到gradle项目构建工具。由于之前习惯于maven项目的构建,故通过此文记录相关gra
- 刚毕业的第一份工作是 java 开发,项目中需要用到 mybatis,特此记录学习过程,这只是一个简单 demo,mybatis 用法很多不