編輯:關於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、創建微博授權所需參數的持久化類
/**
* 該類定義了微博授權時所需要的參數。
*
* @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();
}
}
/**
* 新浪微博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);
}
}
//從本地讀取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()
{
}
});
}
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 使用URL顯示網絡圖片
URL對象中前而幾個方法都非常容易理解,而該對象提供的openStream()可以讀取該 URL資源的InputStream,通過該方法可以非
打造android萬能上拉下拉刷新框架——XRefreshView (二)
一、前言自從上次發表了打造android萬能上拉下拉刷新框架——XRefreshView (一)之後,期間的大半個月一直都很忙,但是我每天晚上下班
Android 快速掌握高德地圖SDK(內含實踐項目)
上周學習了高德地圖和極光推送的SDK,需要在項目中用到,不過學習起來還是費了一番功夫去看文檔和Demo代碼的。(不得不吐槽部分文檔真的無厘頭,只有簡單的實例程序注釋都沒有
Android中的RecyclerView新組件初步上手指南
介紹RecyclerView是support-v7包中的新組件,是一個強大的滑動組件,與經典的ListView相比,同樣擁有item回收復用的功能,但是直接把viewho