【Android开发日记】 新浪微博API SSO授权 分享
其实新浪API的说明文档已经说的很明白了,demo里面注释也很清晰。
官方SDK下载地址:https://github.com/sinaweibosdk/weibo_android_sdk
我直接把我的代码贴出来吧。
说明:授权方式有三种,官方指南上说推荐第一种,我就用了第一种SSO方式。
一 场景说明:
点击分享到微博按钮,开始进行授权验证,授权成功后自动进入分享界面。我这里设置发布文字和图片。图片是根据前面的Activity传过来的图片名,从sd卡中加载的。
二 操作说明:
1.下载官方SDK,修改语言为UTF8,导入eclipse
2.在自己的项目中添加library:WeiboSDK
3.将WeiboSDKDemo的jar包 weibosdkscore.jar复制添加到自己的项目中,也就是说一共有两个weibo相关的jar包:weibosdk.jar weibosdkscore.jar
4.将Demo中Constants.java复制到自己的项目中,修改其中的APP_KEY和REDIRECT_URL。
APP_KEY 与 开发者平台上项目的key一致。
REDIRECT_URL只要与自己在开发者平台上设置的一样就行。建议使用默认的url:https://api.weibo.com/oauth2/default.html
由于采用sso授权,因此App Secret 不需要写进项目中。
5.将Demo中AccessTokenKeeper.java 复制到自己工程中,内容无需更改。这个是用来存储授权拿到的token信息的,每次授权之前会检查此账号是否token有效,授权
后会更新。
6.在自己项目中设置点击事件跳转到 ShareMainActivity这个类。
三 当前存在的问题:
1.授权成功后有时候会显示一个白底 Auth2.0的 页面,有时候一闪而过。这个页面怎么跳过让其不显示?
2.同时在应用中授权超过一个微博账号时,授权成功会进入一个选择账号的页面,会让你选择哪一个账号进行分享,但是只有一个账号时也有那个页面只不过一闪而过,
能否让那个页面停留,等候操作呢?因为那个页面有一个添加账号的选项。
四 代码:
1.iread_activity_share.xml
<?xml version="1.0" encoding="UTF-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="fill_parent"android:layout_height="fill_parent"android:background="#F5FFFA" ><LinearLayoutandroid:id="@+id/linearLayout1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerInParent="true" ><ImageViewandroid:id="@+id/iread_read_share_weibo"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginLeft="30dp"android:layout_weight="1"android:src="@drawable/iread_read_share_weibo" /><ImageViewandroid:id="@+id/iread_read_share_wechat"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginLeft="30dp"android:layout_marginRight="30dp"android:layout_weight="1"android:src="@drawable/iread_read_share_wechat" /></LinearLayout><TextViewandroid:id="@+id/iread_read_share_log"android:layout_width="fill_parent"android:layout_height="wrap_content"android:layout_alignParentBottom="true"android:layout_alignParentRight="true"android:layout_marginBottom="31dp"android:text="" /></RelativeLayout>
2.ShareMainActivity.java
/** 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.think.share;import java.io.File;
import java.text.SimpleDateFormat;import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.os.Environment;
import android.text.TextUtils;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.TextView;
import android.widget.Toast;import com.sina.weibo.sdk.api.ImageObject;
import com.sina.weibo.sdk.api.TextObject;
import com.sina.weibo.sdk.api.WeiboMessage;
import com.sina.weibo.sdk.api.WeiboMultiMessage;
import com.sina.weibo.sdk.api.share.BaseResponse;
import com.sina.weibo.sdk.api.share.IWeiboDownloadListener;
import com.sina.weibo.sdk.api.share.IWeiboHandler;
import com.sina.weibo.sdk.api.share.IWeiboShareAPI;
import com.sina.weibo.sdk.api.share.SendMessageToWeiboRequest;
import com.sina.weibo.sdk.api.share.SendMultiMessageToWeiboRequest;
import com.sina.weibo.sdk.api.share.WeiboShareSDK;
import com.sina.weibo.sdk.auth.Oauth2AccessToken;
import com.sina.weibo.sdk.auth.WeiboAuth;
import com.sina.weibo.sdk.auth.WeiboAuthListener;
import com.sina.weibo.sdk.auth.sso.SsoHandler;
import com.sina.weibo.sdk.constant.WBConstants;
import com.sina.weibo.sdk.exception.WeiboException;
import com.sina.weibo.sdk.exception.WeiboShareException;import com.think.R;/*** 该类主要演示如何进行授权、SSO登陆。* * @author SINA* @since 2013-09-29*/
public class ShareMainActivity extends Activity implements IWeiboHandler.Response{/** 显示认证后的信息,如 AccessToken */private TextView mTokenText;/** 微博 Web 授权类,提供登陆等功能 */private WeiboAuth mWeiboAuth;/** 封装了 "access_token","expires_in","refresh_token",并提供了他们的管理功能 */private Oauth2AccessToken mAccessToken;/** 注意:SsoHandler 仅当 SDK 支持 SSO 时有效 */private SsoHandler mSsoHandler;/** 微博分享的接口实例 */private IWeiboShareAPI mWeiboShareAPI;/**pic num*/private String picnum;/*** @see {@link Activity#onCreate}*/@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.iread_activity_share);//拿到picnumIntent intent0 = this.getIntent();picnum=intent0.getStringExtra("picnum");// 获取 Token View,并让提示 View 的内容可滚动(小屏幕可能显示不全)mTokenText = (TextView) findViewById(R.id.iread_read_share_log);// 分享到微博findViewById(R.id.iread_read_share_weibo).setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {// 创建微博实例mWeiboAuth = new WeiboAuth(ShareMainActivity.this, Constants.APP_KEY, Constants.REDIRECT_URL, Constants.SCOPE);mSsoHandler = new SsoHandler(ShareMainActivity.this, mWeiboAuth);mSsoHandler.authorize(new AuthListener());}});// 分享到微信findViewById(R.id.iread_read_share_wechat).setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {}});// 从 SharedPreferences 中读取上次已保存好 AccessToken 等信息,// 第一次启动本应用,AccessToken 不可用mAccessToken = AccessTokenKeeper.readAccessToken(this);if (mAccessToken.isSessionValid()) {updateTokenView(true);}// 当 Activity 被重新初始化时(该 Activity 处于后台时,可能会由于内存不足被杀掉了),// 需要调用 {@link IWeiboShareAPI#handleWeiboResponse} 来接收微博客户端返回的数据。// 执行成功,返回 true,并调用 {@link IWeiboHandler.Response#onResponse};// 失败返回 false,不调用上述回调if (savedInstanceState != null) {mWeiboShareAPI.handleWeiboResponse(getIntent(), ShareMainActivity.this);}}/*** 当 SSO 授权 Activity 退出时,该函数被调用。* * @see {@link Activity#onActivityResult}*/@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {super.onActivityResult(requestCode, resultCode, data);// SSO 授权回调// 重要:发起 SSO 登陆的 Activity 必须重写 onActivityResultif (mSsoHandler != null) {mSsoHandler.authorizeCallBack(requestCode, resultCode, data);}}/*** 微博认证授权回调类。* 1. SSO 授权时,需要在 {@link #onActivityResult} 中调用 {@link SsoHandler#authorizeCallBack} 后,* 该回调才会被执行。* 2. 非 SSO 授权时,当授权结束后,该回调就会被执行。* 当授权成功后,请保存该 access_token、expires_in、uid 等信息到 SharedPreferences 中。*/class AuthListener implements WeiboAuthListener {@Overridepublic void onComplete(Bundle values) {// 从 Bundle 中解析 TokenmAccessToken = Oauth2AccessToken.parseAccessToken(values);if (mAccessToken.isSessionValid()) {// 显示 TokenupdateTokenView(false);// 保存 Token 到 SharedPreferencesAccessTokenKeeper.writeAccessToken(ShareMainActivity.this, mAccessToken);Toast.makeText(ShareMainActivity.this, "授权成功", Toast.LENGTH_SHORT).show();
// try {
// Thread.currentThread();
// Thread.sleep(2000);
// } catch (InterruptedException e) {
// e.printStackTrace();
// }//开始分享// 创建微博分享接口实例mWeiboShareAPI = WeiboShareSDK.createWeiboAPI(ShareMainActivity.this, Constants.APP_KEY);// 注册第三方应用到微博客户端中,注册成功后该应用将显示在微博的应用列表中。// 但该附件栏集成分享权限需要合作申请,详情请查看 Demo 提示// NOTE:请务必提前注册,即界面初始化的时候或是应用程序初始化时,进行注册mWeiboShareAPI.registerApp();// 如果未安装微博客户端,设置下载微博对应的回调if (!mWeiboShareAPI.isWeiboAppInstalled()) {mWeiboShareAPI.registerWeiboDownloadListener(new IWeiboDownloadListener() {@Overridepublic void onCancel() {Toast.makeText(ShareMainActivity.this, "取消下载...", Toast.LENGTH_SHORT).show();}});}//分享try {// 检查微博客户端环境是否正常,如果未安装微博,弹出对话框询问用户下载微博客户端if (mWeiboShareAPI.checkEnvironment(true)) { sendMessage(true,true,false,false,false,false);}} catch (WeiboShareException e) {e.printStackTrace();Toast.makeText(ShareMainActivity.this, e.getMessage(), Toast.LENGTH_LONG).show();}} else {// 以下几种情况,您会收到 Code:// 1. 当您未在平台上注册的应用程序的包名与签名时;// 2. 当您注册的应用程序包名与签名不正确时;// 3. 当您在平台上注册的包名和签名与您当前测试的应用的包名和签名不匹配时。String code = values.getString("code");String message = "auth_failed";if (!TextUtils.isEmpty(code)) {message = message + "\nObtained the code: " + code;}//Toast.makeText(ShareMainActivity.this, message, Toast.LENGTH_LONG).show();}}@Overridepublic void onCancel() {Toast.makeText(ShareMainActivity.this, "授权取消", Toast.LENGTH_LONG).show();}@Overridepublic void onWeiboException(WeiboException e) {Toast.makeText(ShareMainActivity.this, "Auth exception : " + e.getMessage(), Toast.LENGTH_LONG).show();}}/*** @see {@link Activity#onNewIntent}*/ @Overrideprotected void onNewIntent(Intent intent) {super.onNewIntent(intent);// 从当前应用唤起微博并进行分享后,返回到当前应用时,需要在此处调用该函数// 来接收微博客户端返回的数据;执行成功,返回 true,并调用// {@link IWeiboHandler.Response#onResponse};失败返回 false,不调用上述回调mWeiboShareAPI.handleWeiboResponse(intent, this);}/*** 接收微客户端博请求的数据。* 当微博客户端唤起当前应用并进行分享时,该方法被调用。* * @param baseRequest 微博请求数据对象* @see {@link IWeiboShareAPI#handleWeiboRequest}*/@Overridepublic void onResponse(BaseResponse baseResp) {switch (baseResp.errCode) {case WBConstants.ErrorCode.ERR_OK:Toast.makeText(this, "分享成功", Toast.LENGTH_LONG).show();break;case WBConstants.ErrorCode.ERR_CANCEL:Toast.makeText(this, "分享被取消", Toast.LENGTH_LONG).show();break;case WBConstants.ErrorCode.ERR_FAIL:Toast.makeText(this, "分享失败" + "Error Message: " + baseResp.errMsg, Toast.LENGTH_LONG).show();break;}}/*** 第三方应用发送请求消息到微博,唤起微博分享界面。* @see {@link #sendMultiMessage} 或者 {@link #sendSingleMessage}*/private void sendMessage(boolean hasText, boolean hasImage, boolean hasWebpage, boolean hasMusic, boolean hasVideo, boolean hasVoice) { if (mWeiboShareAPI.isWeiboAppSupportAPI()) {int supportApi = mWeiboShareAPI.getWeiboAppSupportAPI();if (supportApi >= 10351 /*ApiUtils.BUILD_INT_VER_2_2*/) {sendMultiMessage(hasText, hasImage, hasWebpage, hasMusic, hasVideo, hasVoice);} else {sendSingleMessage(hasText, hasImage, hasWebpage, hasMusic, hasVideo/*, hasVoice*/);}} else {Toast.makeText(this, "需要客户端的支持,请确保已安装微博客户端。", Toast.LENGTH_SHORT).show();}}/*** 第三方应用发送请求消息到微博,唤起微博分享界面。* 注意:当 {@link IWeiboShareAPI#getWeiboAppSupportAPI()} >= 10351 时,支持同时分享多条消息,* 同时可以分享文本、图片以及其它媒体资源(网页、音乐、视频、声音中的一种)。* * @param hasText 分享的内容是否有文本* @param hasImage 分享的内容是否有图片* @param hasWebpage 分享的内容是否有网页* @param hasMusic 分享的内容是否有音乐* @param hasVideo 分享的内容是否有视频* @param hasVoice 分享的内容是否有声音*/private void sendMultiMessage(boolean hasText, boolean hasImage, boolean hasWebpage,boolean hasMusic, boolean hasVideo, boolean hasVoice) {// 1. 初始化微博的分享消息WeiboMultiMessage weiboMessage = new WeiboMultiMessage();if (hasText) {weiboMessage.textObject = getTextObj();}if (hasImage) {weiboMessage.imageObject = getImageObj();}// 2. 初始化从第三方到微博的消息请求SendMultiMessageToWeiboRequest request = new SendMultiMessageToWeiboRequest();// 用transaction唯一标识一个请求request.transaction = String.valueOf(System.currentTimeMillis());request.multiMessage = weiboMessage;// 3. 发送请求消息到微博,唤起微博分享界面mWeiboShareAPI.sendRequest(request);}/*** 第三方应用发送请求消息到微博,唤起微博分享界面。* 当{@link IWeiboShareAPI#getWeiboAppSupportAPI()} < 10351 时,只支持分享单条消息,即* 文本、图片、网页、音乐、视频中的一种,不支持Voice消息。* * @param hasText 分享的内容是否有文本* @param hasImage 分享的内容是否有图片* @param hasWebpage 分享的内容是否有网页* @param hasMusic 分享的内容是否有音乐* @param hasVideo 分享的内容是否有视频*/private void sendSingleMessage(boolean hasText, boolean hasImage, boolean hasWebpage,boolean hasMusic, boolean hasVideo/*, boolean hasVoice*/) {// 1. 初始化微博的分享消息// 用户可以分享文本、图片、网页、音乐、视频中的一种WeiboMessage weiboMessage = new WeiboMessage();if (hasText) {weiboMessage.mediaObject = getTextObj();}if (hasImage) {weiboMessage.mediaObject = getImageObj();}// 2. 初始化从第三方到微博的消息请求SendMessageToWeiboRequest request = new SendMessageToWeiboRequest();// 用transaction唯一标识一个请求request.transaction = String.valueOf(System.currentTimeMillis());request.message = weiboMessage;// 3. 发送请求消息到微博,唤起微博分享界面mWeiboShareAPI.sendRequest(request);}/*** 获取分享的文本模板。* * @return 分享的文本模板*/private String getSharedText() {String format = "<我正在使用 CoolLetter 分享>";String text = format;return text;}/*** 创建文本消息对象。* * @return 文本消息对象。*/private TextObject getTextObj() {TextObject textObject = new TextObject();textObject.text = getSharedText();return textObject;}/*** 创建图片消息对象。* * @return 图片消息对象。*/private ImageObject getImageObj() {ImageObject imageObject = new ImageObject();String filePath=Environment.getExternalStorageDirectory()+"/"+picnum+".jpg";File mfile=new File(filePath);if (mfile.exists()) {//若该文件存在Bitmap bm = BitmapFactory.decodeFile(filePath);imageObject.setImageObject(bm);}//BitmapDrawable bitmapDrawable = (BitmapDrawable) mImageView.getDrawable();//imageObject.setImageObject(bitmapDrawable.getBitmap());return imageObject;}/*** 显示当前 Token 信息。* * @param hasExisted 配置文件中是否已存在 token 信息并且合法*/@SuppressLint("SimpleDateFormat")private void updateTokenView(boolean hasExisted) {String date = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss").format(new java.util.Date(mAccessToken.getExpiresTime()));String format = "Token:%1$s \n有效期:%2$s";mTokenText.setText(String.format(format, mAccessToken.getToken(), date));String message = String.format(format, mAccessToken.getToken(), date);if (hasExisted) {message = "Token 仍在有效期内,无需再次登录。" + "\n" + message;}mTokenText.setText(message);}
}
3. 图标
weibo wechat
【Android开发日记】 新浪微博API SSO授权 分享相关推荐
- android开发怎么调用api
在 Android 开发中调用 API 需要以下步骤: 确定要调用的 API 的 URL 地址,并了解其输入和输出的格式. 在 Android 项目中使用网络请求库,如 Retrofit.Volley ...
- Android开发规范:API接口安全设计规范
公众号[国民程序员]回馈粉丝福利: 现金红包和送书活动火热进行中,点击参与! 我的新书<Android App开发入门与实战>已于2020年8月由人民邮电出版社出版,欢迎购买. 书籍详情请 ...
- 新浪微博开发接口_第三方登录(授权)/分享(发帖)
应用场景:第三方登录(授权)/分享(发帖) 注意:不要运行官方Demo 修改官方Demo包名,或者将所有资源拷贝到自己项目中 原因:官方Demo运行有问题 1. 新浪微博开放接口使用步骤 1) 进入h ...
- Android开发之高德API篇:2、高德API线路规划
TIME:2020年7月6日 2.高德API线路规划----步行线路规划 前言: step1 工程配置 step2 整体实现过程 step3 具体实现过程 总结 附上源码 前言: 该篇博客主要是介绍高 ...
- 基于oAuth2.0开发属于自己的SSO授权服务 - 授权码(Authourization Code)模式 (持续更新中。。。)
此文章篇幅较长,平日上班较少时间写作,请见谅.持续更新中... oAuth2.0系列文章目录 #mermaid-svg-AZMPq56OmFj1I7k0 {font-family:"treb ...
- Android 开发多摄像头 API
这篇博客是对我们的 Android 开发者峰会 2018 演讲 的补充,是与来自合作伙伴开发者团队中的 Vinit Modi.Android Camera PM 和 Emilie Roberts 合作 ...
- 新浪微博java开发_新浪微博API java开发
这几天 新浪微博账号被盗,导致多出了700个关注,手动删除是在蛋疼,决定写个程序 批量删除. 首先申请开发者,这些不再赘述,总之最都得到一个App key 和App Secret, 在工程下的 con ...
- Android开发之集成Twitter登陆以及分享,文后有源码。
目录 1.APP build 2.sdk初始化 3.按钮样式(布局文件) 3.1官方按钮登陆 3.2自定义按钮登陆 4.Twitter分享 5.源码传送:点我点我点我 1.APP build //推特 ...
- Android开发之自定义Notification(源代码分享)
Android的自定义notification选项我觉得限制还是挺多的,如图所示,官方API告诉我们它依然必须得设置icon,tittle,text三个选项,除此之外,还一定要设置pengdingin ...
最新文章
- Java中四种线程池介绍
- 企业级应用能帮助闪存走出产能过剩时代吗?
- Linux安装Elasticsearch-head插件
- Android vector Path Data画图详解
- 设计费收费标准2002修订_@设计师,2019景观园林设计收费标准,注意查收!
- 关于MCU、CPU扩展SDRAM的一个小知识
- 微博:将对“宣扬仇恨”行为进行界定,并开展专项整顿
- [100124]红楼梦:林黛玉与北静王【硬盘版】[带全CG存档+攻略]
- 北大计算机考研题一般出自哪里,北大计算机考研常见问题解答
- 超级全面的iOS资源
- Python:WIN10解决matplotlib画图中显示中文宋体英文TimesNewRoman问题
- SAP 采购订单关单
- windows10系统,如何进行文件内容多关键字搜索
- ppt在服务器上打开要修复,打开ppt提示需要修复怎么办-处理ppt总是提示需要修复的方法 - 河东软件园...
- 目标检测tricks(基于detectron2)
- 1000000转万 js_javascript将数字转换整数金额大写的方法
- 正则(数字或者以英文逗号隔开的数字字符串)
- ElasticSearch(狂神说笔记)
- 统计出库数,sql查询数据,sqldf做透视表,循坏处理数据
- 【小沐学NLP】Python实现聊天机器人(ALICE)