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, 我是彈出框的標題));


彈出界面如下:

/

不同人手機這個節目肯定是不一樣的,因爲有些人喜歡玩微博,只裝了微博,沒有微信。如果一個人不玩社交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,如獲取某人發的所有微博,獲取粉絲,自己關注的人等等,其實網上很多新浪微博開發的例子都是通過這個方法實現

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章