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

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


 

第三方登陆和分享功能在目前大部分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 中实现分享和第三方登陆---以新浪微博为例_第1张图片

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

 

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


本文着重介绍第四种方式,并以新浪微博为例:
1、创建微博授权所需参数的持久化类

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
/**
  * 该类定义了微博授权时所需要的参数。
  *
  * @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包在新浪微博开放平台下提供 下载。

 

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
/**
  * 新浪微博API,可以根据自己的需要添加API
  *
  * @author [email protected]
  *
  */
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、分享微博

 

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
//从本地读取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拿到用户信息然后帮助用户在后台注册就实现了第三方登陆了,代码如下:

 

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
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)