【Android实战】实现新浪微博第三方登录获取用户信息

本来最开始研究的腾讯微博第三方登录,但腾讯微博的SDK太糟糕了,估计他们自己都放弃了。想想也是,除了腾讯自家的应用在用腾讯微博,其他的开发者基本不去碰这块。所以马上去研究微博老大去了,平台果然强大,代码和文档一大堆,研究了半天,找点自己需要的功能,还是有点收获,先把这些记录下来,以后再慢慢研究。

目前实现的是实现第三方的登录,获取用户名显示到第三方应用上面。

主类,用到了Afinal框架

public class WbMainAct extends FinalActivity {
	// @ViewInject(id = R.id.login_out_button_silver, click = "myClick")
	LoginoutButton oauthButton;
	// @ViewInject(id = R.id.mytv)
	TextView textView;
	AuthInfo authInfo;
	@ViewInject(id = R.id.user, click = "getUser")
	Button userButton;
	@ViewInject(id = R.id.userInfo)
	TextView userTextView;
	UsersAPI userAPI;
	private Oauth2AccessToken mAccessToken;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.oauthlay);
		authInfo = new AuthInfo(getApplicationContext(), Constants.APP_KEY,
				Constants.REDIRECT_URL, Constants.SCOPE);
		oauthButton = (LoginoutButton) findViewById(R.id.login_out_button_default);
		textView = (TextView) findViewById(R.id.mytv);
		oauthButton.setWeiboAuthInfo(authInfo, new AuthListener());
		oauthButton.setLogoutListener(new LogOutRequestListener());
		final Button logoutButton = (Button) findViewById(R.id.logout_button);

		logoutButton.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				Toast.makeText(WbMainAct.this, "onClick", Toast.LENGTH_SHORT)
						.show();
				new LogoutAPI(WbMainAct.this, Constants.APP_KEY,
						AccessTokenKeeper.readAccessToken(WbMainAct.this))
						.logout(new LogOutRequestListener());
			}
		});

	}

	public void getUser(View v) {
		mAccessToken = AccessTokenKeeper.readAccessToken(this);
		userAPI = new UsersAPI(this, Constants.APP_KEY, mAccessToken);
		if (mAccessToken != null && mAccessToken.isSessionValid()) {
			long uid = Long.parseLong(mAccessToken.getUid());
			userAPI.show(uid, mListener);

		} else {

			Toast.makeText(WbMainAct.this,
					R.string.weibosdk_demo_access_token_is_empty,
					Toast.LENGTH_LONG).show();
			userTextView
					.setText((mAccessToken == null) ? "mAccessToken = null "
							+ mAccessToken.isSessionValid()
							: "mAccessToken != null "
									+ mAccessToken.isSessionValid());
		}
	}

	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) {
					Toast.makeText(WbMainAct.this,
							"获取User信息成功,用户昵称:" + user.screen_name,
							Toast.LENGTH_LONG).show();
					userTextView.setText(user.screen_name);
				} else {
					userTextView.setText(response);

					Toast.makeText(WbMainAct.this, "2:" + response,
							Toast.LENGTH_LONG).show();
				}
			}
		}

		@Override
		public void onWeiboException(WeiboException e) {

			ErrorInfo info = ErrorInfo.parse(e.getMessage());
			Toast.makeText(WbMainAct.this, "3:" + info.toString(),
					Toast.LENGTH_LONG).show();
			userTextView.setText(info.toString());
		}
	};

	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		super.onActivityResult(requestCode, resultCode, data);

		//
		if (oauthButton != null) {
			oauthButton.onActivityResult(requestCode, resultCode, data);
		}

	}

	private class LogOutRequestListener implements RequestListener {
		@Override
		public void onComplete(String response) {
			if (!TextUtils.isEmpty(response)) {
				try {
					JSONObject obj = new JSONObject(response);
					String value = obj.getString("result");

					if ("true".equalsIgnoreCase(value)) {
						AccessTokenKeeper.clear(WbMainAct.this);
						textView.setText(R.string.weibosdk_demo_logout_success);
					}
				} catch (JSONException e) {
					e.printStackTrace();
				}
			}
		}

		@Override
		public void onWeiboException(WeiboException e) {
			textView.setText(R.string.weibosdk_demo_logout_failed);
		}
	}

	private class AuthListener implements WeiboAuthListener {
		@Override
		public void onComplete(Bundle values) {
			Toast.makeText(WbMainAct.this, "onComplete", Toast.LENGTH_SHORT)
					.show();
			Oauth2AccessToken accessToken = Oauth2AccessToken
					.parseAccessToken(values);

			if (accessToken != null && accessToken.isSessionValid()) {
				String date = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss")
						.format(new java.util.Date(accessToken.getExpiresTime()));
				String format = getString(R.string.weibosdk_demo_token_to_string_format_1);
				textView.setText(String.format(format, accessToken.getToken(),
						date));

				AccessTokenKeeper.writeAccessToken(getApplicationContext(),
						accessToken);
			}
		}

		@Override
		public void onWeiboException(WeiboException e) {
			Toast.makeText(WbMainAct.this, e.getMessage(), Toast.LENGTH_SHORT)
					.show();
		}

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

}

常量类,根据实际情况替换相关数据

public interface Constants {

	public static final String APP_KEY = "1530318928";

	public static final String REDIRECT_URL = "http://open.weibo.com/apps/1530318928/info/advanced";

	public static final String SCOPE = "email,direct_messages_read,direct_messages_write,"
			+ "friendships_groups_read,friendships_groups_write,statuses_to_me_read,"
			+ "follow_app_official_microblog," + "invitation_write";
}

工具类,保持从服务器返回的token信息

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();
    }
}

时间: 2024-11-08 23:20:07

【Android实战】实现新浪微博第三方登录获取用户信息的相关文章

Android Twitter第三方登录&获取用户信息

Android接入Twitter先是去了Twitter的开发者网站,发现太麻烦,不太适用目前项目,转而接入了Twitter为java提供的twitter4j的jar包. 以下为接入Twitter4j的一些经验 官网地址:http://twitter4j.org/en/index.html#sourceCode 其中提供了jar包下载链接 Download 分为两个版本 ?Latest stable version (稳定版) ?Latest snapshot build (快照版) 快照版应该是

Android之QQ授权登录获取用户信息

有时候我们开发的app须要方便用户简单登录.能够让用户使用自己的qq.微信.微博登录到我们自己开发的app. 今天就在这里总结一下怎样在自己的app中集成QQ授权登录获取用户信息的功能. 首先我们打开腾讯开发平台这个网页,点击---->移动应用---->创建应用,成功创建应用后.能够产生我们须要的App ID和App Key,例如以下图所看到的: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYmVhcl9odWFuZ3poZW4=/font/5a6

微信第三方登陆,无需注册一键登录,获取用户信息,PHP实现方法.

今天讲讲利用微信oauth2实现第三方登陆的实现方法. 先说说前提吧! 首先你得是服务号,并且是经过认证的.这样微信会给你很多第三方接口的权限,如果是订阅号或者没有认证的服务号那就不用想了! 一开始你需要进入微信公众平台开启开发模式,并且填写oauth2的回调地址,地址填写你项目的域名就可以了.比如:www.baidu.com或zhidao.baidu.com.如果你的项目在二级域名就写二级域名 前端url授权地址,在url中填写appid与你项目中方法中的oauth的地址,具体在下面的代码中可

[微信开发] - 使用普通扫码登录获取用户信息,非开放平台版本

微信平台扫码登录时,因为开放平台的openid与原系统不一致,所以使用了原公众平台二维码扫码后获取用户openid,继而转链接形式. 油腻腻的大猪蹄进行测试 oysIt005E1TDKTKIdc8TmR6VTViA < 使用开放平台的登录二维码扫码获取的openid o4mIl1jXCq4b2MkQ0tTZTzKzl2XY < 微信平台获取的openid o4mIl1jXCq4b2MkQ0tTZTzKzl2XY < 扫码临时二维码获取的openid 大致流程: 用户点击微信登录->

基于node(express)实现微信内第三方网页获取用户信息

近来,有个需求:用户在微信中打开第三方网页,然后输入姓名手机号登录.用户退出后,再次进入网页不需要登录.拿到需求后,就看了下微信的公众平台开发者文档,原来微信内打开第三方网页,可以拿到用户的openid(每个用户唯一),甚至经过授权后可以拿到用户的昵称.性别.所在地等信息. 废话少说,直接来吧! 第一步:获取code 在确保微信公众账号拥有授权作用域(scope参数)的权限的前提下(服务号获得高级接口后,默认拥有scope参数中的snsapi_base和snsapi_userinfo).获取co

PHP版微信第三方实现一键登录及获取用户信息的方法

本文实例讲述了PHP版微信第三方实现一键登录及获取用户信息的方法.分享给大家供大家参考,具体如下: 注意,要使用微信在第三方网页登录是需要"服务号"才可以哦,所以必须到官方申请. 一开始你需要进入微信公众平台开启开发模式,并且填写oauth2的回调地址,地址填写你项目的域名就可以了.比如:www.baidu.com或zhidao.baidu.com.如果你的项目在二级域名就写二级域名 前端url授权地址,在url中填写appid与你项目中方法中的oauth的地址,具体在下面的代码中可以

javaEE SSH框架 qq第三方登录及用户绑定

前几天刚申请好域名,下面实现网站的qq第三方登录的功能,javaEE的SSH框架.(一些细节问题没有处理,只是大体上实现) 一:首先说一下需求,第一次使用qq第三方登录的用户需要绑定已有的网站用户名,绑定成功后进入首页.以后再使用qq第三方登录就直接进入网站首页. 二:要想使用qq第三方首先需要申请应用(需要有自己的域名) (1)登录qq互联网站申请应用,http://connect.qq.com/ (2)创建应用 (3)创建好之后还是可以修改的,这里回调地址我用的是域名+back.jsp界面(

微信授权登录并获取用户信息接口开发

总结一下微信授权登录并获取用户信息 这个接口的开发流程. 一.首先你的微信公众号要获得相应的AppID和AppSecret,申请微信登录且通过审核后,才可开始接入流程. 二.授权流程 1.流程说明 (1). 第三方发起微信授权登录请求,微信用户允许授权第三方应用后,微信会拉起应用或重定向到第三方网站,并且带上授权临时票据code参数: (2). 通过code参数加上AppID和AppSecret等,通过API换取access_token: (3). 通过access_token进行接口调用,获取

【CURL】模拟登录网站并获取用户信息

模拟登录网站并获取用户信息 前言 这次来做的是通过代码的方式,模拟登录秒拍官网,获取登录用户的信息. 前后端分离 本文的标题是CURL,传统的网站是PHP代码直接渲染项目视图,通过表单提交到控制器直接进行数据操作. 传统模拟登录的方式在页面上找到表单元素,直接进行模拟表单提交. 近两年前端技术趋于完善,实现了前后端分离. 分析页面元素 秒拍官网地址 http://www.miaopai.com/ 通过审查元素以及源代码查找,在本页面并没有form标签,由此推断页面是通过js进行提交的. 查找提交