您的位置:首页 > 移动开发 > Android开发

Android 中实现分享和第三方登陆---以新浪微博为例

2014-08-23 22:00 351 查看
尊重原创:http://blog.csdn.net/yuanzeyao/article/details/38781957
第三方登陆和分享功能在目前大部分APP中都有,分享功能可以将自己觉得有意义的东西分享给身边的朋友,而第三方登陆可以借助已经有巨大用户基础的平台(如QQ和新浪微博)的账号,让用户在使用自己APP的时候不用注册,直接使用第三方账号登陆,从而避免了注册的过程(其实是服务器端帮你注册),这对于吸引更多的用户非常有意义。下面我们就以新浪微博为例,讲解如何实现分享功能和第三方登陆。首先你需要到新浪微博开放平台创建一个应用:
新浪微博开放平台:http://open.weibo.com/

首先我们来介绍分享功能,分享功能就是将一些信息分享到一些社交app中,如比较热门的就是新浪微博,腾讯微博,人人网,开心网,微信,朋友圈,易信等等,在Android中 实现分享功能通常有四种方式:

方式一:使用Android自带的分享功能,通过Intent找出手机中所有的社交app
这种方式的优点就是实现比较简单,不需要引入第三方sdk,缺点就是需要安装社交app之后才能分享,其实我觉得这个也是合理的,试想如果一个人的手机中没有安装新浪微博,那么意味着他肯定不玩微博,所以不能分享也无所谓
//分享文本
Intent sendIntent = new Intent();  
sendIntent.setAction(Intent.ACTION_SEND);  
sendIntent.putExtra(Intent.EXTRA_TEXT, "我用手机测试分享内容");  
sendIntent.setType("text/plain");  
startActivity(Intent.createChooser(sendIntent, "我是弹出框的标题"));  

弹出界面如下:



不同人手机这个节目肯定是不一样的,因为有些人喜欢玩微博,只装了微博,没有微信。如果一个人不玩社交app,那么这个Dialog里面至少有一个是短信和蓝牙之类的,因为这些每个手机都有。

方式二:使用ShareSDK实现,ShareSDK是一款功能非常强大的第三方提供的专门用于分享等功能的sdk,使用也很简单,但是需要引入一些sdk,这里我就不举例了,研究一些ShareSDK提供的demo就可以实现,优点是简单,功能强大,并且不需要安装社交app
方式三:使用社交开放平台提供的sdk,有点事简单,但是需要安装社交app
方式四:使用社交平台提供的api接口,通过调用这些api接口实现分享和登陆,使用这种不需要安装社交app

本文着重介绍第四种方式,并以新浪微博为例:
1、创建微博授权所需参数的持久化类/**
* 该类定义了微博授权时所需要的参数。
*
* @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();
}
}
2、创建一个类,用来实分享和登陆功能,当然你需要引入新浪微博的sdk:weibosdkcore.jar,这个jar包在新浪微博开放平台下提供下载。

/**
* 新浪微博API,可以根据自己的需要添加API
*
* @author cstdingran@gmail.com
*
*/
public class SinaWeiboAPI {

/**
* 访问微博服务接口的地址
*/
public static final String API_SERVER = "https://api.weibo.com/2";

private static final String URL_USERS = API_SERVER + "/users";

private static final String URL_STATUSES = API_SERVER + "/statuses";

private static final String URL_ACCOUNT = API_SERVER + "/account";

/**
* post请求方式
*/
public static final String HTTPMETHOD_POST = "POST";

/**
* get请求方式
*/
public static final String HTTPMETHOD_GET = "GET";

private Oauth2AccessToken oAuth2accessToken;

private String accessToken;

/**
* 构造函数,使用各个API接口提供的服务前必须先获取Oauth2AccessToken
*
* @param accesssToken
* Oauth2AccessToken
*/
public SinaWeiboAPI(Oauth2AccessToken oauth2AccessToken) {
this.oAuth2accessToken = oauth2AccessToken;
if (oAuth2accessToken != null) {
accessToken = oAuth2accessToken.getToken();
}
}

/**
* 执行请求
*
* @param url
* @param params
* @param httpMethod
* @param listener
*/
private void request(final String url, final WeiboParameters params,
final String httpMethod, RequestListener listener) {
params.put("access_token", accessToken);
AsyncWeiboRunner.requestAsync(url, params, httpMethod, listener);

}

/**
* 根据用户ID获取用户信息
*
* @param uid
* 需要查询的用户ID。
* @param listener
*/
public void show(long uid, RequestListener listener) {
WeiboParameters params = new WeiboParameters();
params.put("uid", uid);
request(URL_USERS + "/show.json", params, HTTPMETHOD_GET, listener);
}

/**
* 发布一条新微博(连续两次发布的微博不可以重复)
*
* @param content
* 要发布的微博文本内容,内容不超过140个汉字。
* @param lat
* 纬度,有效范围:-90.0到+90.0,+表示北纬,默认为0.0。
* @param lon
* 经度,有效范围:-180.0到+180.0,+表示东经,默认为0.0。
* @param listener
*/
public void update(String content, String lat, String lon,
RequestListener listener) {
WeiboParameters params = new WeiboParameters();
params.put("status", content);
if (!TextUtils.isEmpty(lon)) {
params.put("long", lon);
}
if (!TextUtils.isEmpty(lat)) {
params.put("lat", lat);
}
request(URL_STATUSES + "/update.json", params, HTTPMETHOD_POST,
listener);
}

/**
* 上传图片并发布一条新微博,此方法会处理urlencode
*
* @param content
* 要发布的微博文本内容,内容不超过140个汉字
* @param file
* 要上传的图片,仅支持JPEG、GIF、PNG格式,图片大小小于5M。
* @param lat
* 纬度,有效范围:-90.0到+90.0,+表示北纬,默认为0.0。
* @param lon
* 经度,有效范围:-180.0到+180.0,+表示东经,默认为0.0。
* @param listener
*/
public void upload(String content, String file, String lat, String lon,
RequestListener listener) {
WeiboParameters params = new WeiboParameters();
params.put("status", content);
params.put("pic", file);
if (!TextUtils.isEmpty(lon)) {
params.put("long", lon);
}
if (!TextUtils.isEmpty(lat)) {
params.put("lat", lat);
}
request(URL_STATUSES + "/upload.json", params, HTTPMETHOD_POST,
listener);
}
//分享一张带网络图片的微博
public void updateImgWithURL(String content, String url,RequestListener listener)
{
WeiboParameters params = new WeiboParameters();
params.put("status", content);
params.put("url", url);
request(URL_STATUSES + "/upload_url_text.json", params, HTTPMETHOD_POST,
listener);
}

/**
* 退出登录
*
* @param listener
*/
public void endSession(RequestListener listener) {
WeiboParameters params = new WeiboParameters();
request(URL_ACCOUNT + "/end_session.json", params, HTTPMETHOD_POST,
listener);
}
}
3、分享微博

//从本地读取token,检查是否失效或者是否认证
mAccessToken=AccessTokenKeeper.readAccessToken(this);
if(mAccessToken!=null && mAccessToken.isSessionValid())
{
mSinaWeiboApi=new SinaWeiboAPI(mAccessToken);
mSinaWeiboApi.update("视频 康熙来了:http://www.iqiyi.com/v_19rrmo4v0o.html", null, null, listener);
}else
{
//如果失效或者没有认证,那么需要重新认证,
mWeiboAuth.anthorize(new WeiboAuthListener()
{

@Override
public void onWeiboException(WeiboException arg0)
{
}

@Override
public void onComplete(Bundle bundle)
{
//认证成功,保存到本地
mAccessToken = Oauth2AccessToken.parseAccessToken(bundle);
if(mAccessToken.isSessionValid())
{
AccessTokenKeeper.writeAccessToken(ShareActivity.this, mAccessToken);
mSinaWeiboApi=new SinaWeiboAPI(mAccessToken);
//然后分享
mSinaWeiboApi.update("视频 康熙来了:http://www.iqiyi.com/v_19rrmo4v0o.html", null, null, listener);
}
}

@Override
public void onCancel()
{
}

});
}
那么分享到这里就完成了,至于第三方登陆,首先也是要认证,认证成功后AccessToken里面有一个Uid,我们通过这个uid拿到用户信息然后帮助用户在后台注册就实现了第三方登陆了,代码如下:

WeiboMessage weiboMessage = new WeiboMessage();
weiboMessage.mediaObject = getVideoObj();
SendMessageToWeiboRequest request = new SendMessageToWeiboRequest();
// 用transaction唯一标识一个请求
request.transaction = String.valueOf(System.currentTimeMillis());
request.message = weiboMessage;

// 3. 发送请求消息到微博,唤起微博分享界面
mWeiboShareAPI.sendRequest(request);
}else if(view.getId()==R.id.btn_login)
{
mAccessToken=AccessTokenKeeper.readAccessToken(this);
//已经认证
if(mAccessToken!=null &&mAccessToken.isSessionValid())
{
mSinaWeiboApi=new SinaWeiboAPI(mAccessToken);
mSinaWeiboApi.show(Long.parseLong(mAccessToken.getUid()),listener);
}else
{
//没有认证或者认证过期
mWeiboAuth.anthorize(new WeiboAuthListener()
{

@Override
public void onWeiboException(WeiboException arg0)
{
}

@Override
public void onComplete(Bundle bundle)
{
mAccessToken = Oauth2AccessToken.parseAccessToken(bundle);
AccessTokenKeeper.writeAccessToken(ShareActivity.this, mAccessToken);
mSinaWeiboApi=new SinaWeiboAPI(mAccessToken);
mSinaWeiboApi.show(Long.parseLong(mAccessToken.getUid()),listener);
}

@Override
public void onCancel()
{
}

});
}
  思路其实和分享是一样的,就是调用的接口不一样。

好了,先写到这里,其实如果你学会了分享和登陆,那么其实你完全可以自己去写一个新浪微博,因为这个jar包里面提供了新浪微博所有操作的api,如获取某人发的所有微博,获取粉丝,自己关注的人等等,其实网上很多新浪微博开发的例子都是通过这个方法实现的
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐