zoukankan      html  css  js  c++  java
  • Android 中实现分享和第三方登陆---以新浪微博为例

    尊重原创:http://blog.csdn.net/yuanzeyao/article/details/38781957

    第三方登陆和分享功能在眼下大部分APP中都有,分享功能能够将自己觉得有意义的东西分享给身边的朋友,而第三方登陆能够借助已经有巨大用户基础的平台(如QQ和新浪微博)的账号,让用户在使用自己APP的时候不用注冊,直接使用第三方账号登陆,从而避免了注冊的过程(事实上是server端帮你注冊),这对于吸引很多其它的用户非常有意义。以下我们就以新浪微博为例,解说怎样实现分享功能和第三方登陆。首先你须要到新浪微博开放平台创建一个应用:

    新浪微博开放平台: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,使用也非常easy,可是须要引入一些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,如获取某人发的全部微博,获取粉丝,自己关注的人等等,事实上网上非常多新浪微博开发的样例都是通过这种方法实现的

  • 相关阅读:
    printcap
    browser-ua
    PHP 开发 APP 接口 学习笔记与总结
    Java实现 LeetCode 72 编辑距离
    Java实现 LeetCode 72 编辑距离
    Java实现 LeetCode 72 编辑距离
    Java实现 LeetCode 71 简化路径
    Java实现 LeetCode 71 简化路径
    Java实现 LeetCode 71 简化路径
    Java实现 LeetCode70 爬楼梯
  • 原文地址:https://www.cnblogs.com/gcczhongduan/p/4288927.html
Copyright © 2011-2022 走看看