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

尊重原创: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, "我是弹出框的标题"));  


弹出界面如下:

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

不同人手机这个节目肯定是不一样的,因为有些人喜欢玩微博,只装了微博,没有微信。如果一个人不玩社交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,如获取某人发的所有微博,获取粉丝,自己关注的人等等,其实网上很多新浪微博开发的例子都是通过这个方法实现的

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

上一篇:OCP试题解析之052-- DROP PROFILE app_user


下一篇:从零开始学android