• 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,如获取某人发的全部微博,获取粉丝,自己关注的人等等,事实上网上非常多新浪微博开发的样例都是通过这种方法实现的

  • 相关阅读:
    3.2 playbook tags
    3.1 playbook语法实践
    3. playbook基础组件
    elasticsearch IK中文分词
    elasticsearch参数详解
    2. ansible常用模块
    1. ansible简介
    Python sphinx-build在Windows系统中生成Html文档
    Oracle PL/SQL Developer集成TFS进行团队脚本文件版本管理
    Gulp自动构建Web前端程序
  • 原文地址:https://www.cnblogs.com/gcczhongduan/p/4288927.html
Copyright © 2020-2023  润新知