100字范文,内容丰富有趣,生活中的好帮手!
100字范文 > 【Android开发日记】 新浪微博API SSO授权 分享

【Android开发日记】 新浪微博API SSO授权 分享

时间:2021-06-19 19:44:55

相关推荐

【Android开发日记】 新浪微博API SSO授权 分享

其实新浪API的说明文档已经说的很明白了,demo里面注释也很清晰。

官方SDK下载地址:/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:/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="/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) - 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**/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 -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

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。