- 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、創建微博授權所需參數的持久化類1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768/**
* 該類定義了微博授權時所需要的參數。
*
* @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包在新浪微博開放平臺下提供下載。
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147/**
* 新浪微博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、分享微博
1234567891011121314151617181920212223242526272829303132333435363738//從本地讀取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拿到用戶信息然後幫助用戶在後臺註冊就實現了第三方登陸了,代碼如下:
1234567891011121314151617181920212223242526272829303132333435363738394041424344WeiboMessage 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,如獲取某人發的所有微博,獲取粉絲,自己關注的人等等,其實網上很多新浪微博開發的例子都是通過這個方法實現
的