Android开发全程记录(九)——使用新浪微博登录第三方应用

1.首先到官网下载SDK,下载地址:http://open.weibo.com/wiki/Sdk

2.解压SDK包,解压后,目录下会有pdf文档,同时提供有WeiboSDK和WeiboSDKDemo,在WeiboSDKDemo里包含了常用的微博功能示例。

3.在Eclipse中导入WeiboSDK和WeiboSDKDemo项目,前者是lib,后者是demo。

   注意:导入Eclipse后,直接运行WeiboSDKDemo时,登录授权会一闪而过,导致授权不能成功。主要原因还是签名的原因,文档里有明确的说明:在自己的电脑里,找到C:\Users\Administrator\.android目录,在这个目录下有一个debug.keystore文件,将这个文件使用新浪微博官网下载的debug.keystore替换(其实也就是SDK包里面的debug.keystore文件),然后再次运行这个Demo发现,登录授权就可以成功了。

4.这里我从Demo中提取了一个第三方登录的功能,因为这里其余的功能用不到。详细步骤如下:

1)WeiboSDKDemo项目中的com.sina.weibo.sdk.demo包中保留以下三个文件,其余的删掉:

   AccessTokenKeeper.java、Constants.java、WBAuthActivity.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.sina.weibo.sdk.demo;

import java.text.SimpleDateFormat;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.text.TextUtils;
import android.text.method.ScrollingMovementMethod;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.TextView;
import android.widget.Toast;

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.exception.WeiboException;
import com.sina.weibo.sdk.net.RequestListener;
import com.sina.weibo.sdk.openapi.UsersAPI;
import com.sina.weibo.sdk.openapi.models.ErrorInfo;
import com.sina.weibo.sdk.openapi.models.User;

/**
 * 该类主要演示如何进行授权、SSO登陆。
 * 
 * @author SINA
 * @since 2013-09-29
 */
public class WBAuthActivity extends Activity {

	/** 显示认证后的信息,如 AccessToken */
	private TextView mTokenText;

	/** 微博 Web 授权类,提供登陆等功能 */
	private WeiboAuth mWeiboAuth;

	/** 封装了 "access_token","expires_in","refresh_token",并提供了他们的管理功能 */
	private Oauth2AccessToken mAccessToken;

	/** 注意:SsoHandler 仅当 SDK 支持 SSO 时有效 */
	private SsoHandler mSsoHandler;
	/** 用户信息接口 */
	private UsersAPI mUsersAPI;

	/**
	 * @see {@link Activity#onCreate}
	 */
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_auth);

		// 获取 Token View,并让提示 View 的内容可滚动(小屏幕可能显示不全)
		mTokenText = (TextView) findViewById(R.id.token_text_view);
		TextView hintView = (TextView) findViewById(R.id.obtain_token_hint);
		hintView.setMovementMethod(new ScrollingMovementMethod());

		// 创建微博实例
		mWeiboAuth = new WeiboAuth(this, Constants.APP_KEY,
				Constants.REDIRECT_URL, Constants.SCOPE);

		// SSO 授权
		findViewById(R.id.obtain_token_via_sso).setOnClickListener(
				new OnClickListener() {
					@Override
					public void onClick(View v) {
						mSsoHandler = new SsoHandler(WBAuthActivity.this,
								mWeiboAuth);
						mSsoHandler.authorize(new AuthListener());
					}
				});

		// Web 授权
		findViewById(R.id.obtain_token_via_signature).setOnClickListener(
				new OnClickListener() {
					@Override
					public void onClick(View v) {
						mWeiboAuth.anthorize(new AuthListener());
						// 或者使用:mWeiboAuth.authorize(new AuthListener(),
						// Weibo.OBTAIN_AUTH_TOKEN);
					}
				});

		// 通过 Code 获取 Token
		findViewById(R.id.obtain_token_via_code).setOnClickListener(
				new OnClickListener() {
					@Override
					public void onClick(View v) {
					}
				});

		// 从 SharedPreferences 中读取上次已保存好 AccessToken 等信息,
		// 第一次启动本应用,AccessToken 不可用
		mAccessToken = AccessTokenKeeper.readAccessToken(this);
		if (mAccessToken.isSessionValid()) {
			updateTokenView(true);
		}
		mUsersAPI = new UsersAPI(mAccessToken);

	}

	/**
	 * 当 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);
		}
	}

	/**
	 * 微博认证授权回调类。 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()) {
				long uid = Long.parseLong(mAccessToken.getUid());
				mUsersAPI.show(uid, mListener);
				// 显示 Token
				updateTokenView(false);
				// 保存 Token 到 SharedPreferences
				AccessTokenKeeper.writeAccessToken(WBAuthActivity.this,
						mAccessToken);
				Toast.makeText(WBAuthActivity.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(WBAuthActivity.this, message, Toast.LENGTH_LONG)
						.show();
			}
		}

		@Override
		public void onCancel() {
			Toast.makeText(WBAuthActivity.this,
					R.string.weibosdk_demo_toast_auth_canceled,
					Toast.LENGTH_LONG).show();
		}

		@Override
		public void onWeiboException(WeiboException e) {
			Toast.makeText(WBAuthActivity.this,
					"Auth exception : " + e.getMessage(), Toast.LENGTH_LONG)
					.show();
		}
	}

	/**
	 * 微博 OpenAPI 回调接口。
	 */
	private RequestListener mListener = new RequestListener() {
		@Override
		public void onComplete(String response) {
			if (!TextUtils.isEmpty(response)) {
				// 调用 User#parse 将JSON串解析成User对象
				User user = User.parse(response);
				if (user != null) {
					String uss = user.profile_image_url;
					Toast.makeText(
							WBAuthActivity.this,
							"获取User信息成功,用户昵称:" + user.screen_name + "地址:"
									+ user.profile_image_url, Toast.LENGTH_LONG)
							.show();
				} else {
					Toast.makeText(WBAuthActivity.this, response,
							Toast.LENGTH_LONG).show();
				}
			}
		}

		@Override
		public void onWeiboException(WeiboException e) {
			ErrorInfo info = ErrorInfo.parse(e.getMessage());
			Toast.makeText(WBAuthActivity.this, info.toString(),
					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);
		mTokenText
				.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;
		}
		mTokenText.setText(message);
	}
}


 

2.在布局文件中指保留activity_auth.xml文件,代码如下:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".WBAuthActivity" >

    <Button
        android:id="@+id/obtain_token_via_sso"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="left|center_vertical"
        android:text="@string/weibosdk_demo_obtain_token_via_sso" />
    
    <Button
        android:id="@+id/obtain_token_via_signature"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"
        android:gravity="left|center_vertical"
        android:text="@string/weibosdk_demo_obtain_token_via_signature" />

	<Button
        android:id="@+id/obtain_token_via_code"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"
        android:gravity="left|center_vertical"
        android:text="@string/weibosdk_demo_obtain_token_via_code" />    
    
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"
        android:textSize="16sp"
        android:textStyle="bold"
        android:text="@string/weibosdk_demo_token_info" />
    
    <TextView
        android:id="@+id/token_text_view"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:textSize="12sp" />
    

	<TextView
        android:id="@+id/obtain_token_hint"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="20dp"
        android:layout_marginBottom="10dp"
        android:textSize="12sp"
        android:scrollbars="vertical"
        android:maxLines="1000"
        android:text="@string/weibosdk_demo_obtain_token_hint" />

</LinearLayout>


 

3)strings.xml中文件代码:

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <string name="app_name">WeiboSDKDemo</string>

    <!-- 获取 Token -->
    <string name="weibosdk_demo_obtain_token_via_sso">SSO(单点登录)授权</string>
    <string name="weibosdk_demo_obtain_token_via_signature">Web 授权</string>
    <string name="weibosdk_demo_obtain_token_via_code">通过 Code 获取 Token</string>
    <string name="weibosdk_demo_token_info">Token 信息:</string>
    <string name="weibosdk_demo_token_has_existed">Token 仍在有效期内,无需再次登录。</string>
    <string name="weibosdk_demo_obtain_token_hint"><b>请注意:</b>\n<li>SSO 登录需要微博客户端的支持,目前仅 3.0.0 及以上微博客户端版本支持 SSO;如果未安装,将自动转为 Oauth2.0 Web 授权认证(即第一种认证方式)</li>\n<li>如果您通过方式一和方式二获取不到 Token,而是获取到 code,那说明您的包名和签名存在问题,请到开放平台注册包名和签名。详情请查看 FAQ 文档</li></string>
    <string name="weibosdk_demo_obtain_token_via_sso_hint">使用 SSO 登录前,请检查手机上是否已经安装新浪微博客户端,目前仅 3.0.0 及以上微博客户端版本支持 SSO;如果未安装,将自动转为 Oauth2.0 进行认证。</string>
    <string name="weibosdk_demo_obtain_token_via_code_hint"><b>请注意:</b>基于以下几点原因,您可能不想使用前面的两种授权方式:\n<li>出于安全性的考虑,您不信任目前使用应用的包名和签名来获取 Token 的方式</li>\n<li>您不想安装微博客户端</li>\n您可以自行通过 Code 来获取 Token。通过这种方式需要使用到 APP_SECRET,请务必妥善保管好自己的 APP_SECRET,<b>不要直接暴露在程序中,泄露有风险</b>。\n<b>更多细节请查看:</b><a href="http://open.weibo.com/wiki/%E6%8E%88%E6%9D%83%E6%9C%BA%E5%88%B6%E8%AF%B4%E6%98%8E#Web.E5.BA.94.E7.94.A8.E7.9A.84.E9.AA.8C.E8.AF.81.E6.8E.88.E6.9D.83">验证授权步骤</a></string>
    <string name="weibosdk_demo_step_to_obtain_code">第一步:获取 Code</string>
    <string name="weibosdk_demo_step_to_obtain_token">第二步:通过 Code 获取 Token</string>
    <string name="weibosdk_demo_code_text_hint">第一步获取到的 Code:(一次性有效)</string>
    <string name="weibosdk_demo_token_text_hint">第二步获取到的 Token:</string>
    <string name="weibosdk_demo_token_to_string_format">Token:%1$s \nRefresh Token:%2$s \nexpires_in:%3$s</string>
    <string name="weibosdk_demo_token_to_string_format_1">Token:%1$s \n有效期:%2$s</string>
    <string name="weibosdk_demo_toast_auth_success">授权成功</string>
    <string name="weibosdk_demo_toast_auth_failed">授权失败</string>
    <string name="weibosdk_demo_toast_auth_canceled">取消授权</string>
    <string name="weibosdk_demo_toast_obtain_code_success">获取 Code 成功</string>
    <string name="weibosdk_demo_toast_obtain_code_failed">获取 Code 失败</string>
    <string name="weibosdk_demo_toast_obtain_token_success">获取 Token 成功</string>
    <string name="weibosdk_demo_toast_obtain_token_failed">获取 Token 失败</string>    



</resources>


 4)AndroidManifest.xml文件代码如下:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.sina.weibo.sdk.demo"
    android:versionCode="5"
    android:versionName="2.5.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="17" />

    <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" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_logo"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        
        
        <!-- 授权认证 -->
        <activity android:name=".WBAuthActivity" >
             <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter></activity>
        <activity android:name=".WBAuthCodeActivity" />
        <activity android:name=".WBShareMainActivity" />
        
        

        <!-- 其他 -->
        <!-- <activity android:name=".WBCallActivityV3" /> -->
        <!-- <activity android:name=".WBUserStateActivity" /> -->
    </application>

</manifest>


 

到此,使用新浪微博登录第三方应用就结束了。替换本地debug.keystore这个地方纠结了好久,一定要替换,不然不能完成授权了。

本实例源码下载地址:http://download.csdn.net/detail/wjwj1203/7530845

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值