編輯:關於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 [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); } }
//從本地讀取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,如獲取某人發的所有微博,獲取粉絲,自己關注的人等等,其實網上很多新浪微博開發的例子都是通過這個方法實現的
URL對象中前而幾個方法都非常容易理解,而該對象提供的openStream()可以讀取該 URL資源的InputStream,通過該方法可以非
一、前言自從上次發表了打造android萬能上拉下拉刷新框架——XRefreshView (一)之後,期間的大半個月一直都很忙,但是我每天晚上下班
上周學習了高德地圖和極光推送的SDK,需要在項目中用到,不過學習起來還是費了一番功夫去看文檔和Demo代碼的。(不得不吐槽部分文檔真的無厘頭,只有簡單的實例程序注釋都沒有
介紹RecyclerView是support-v7包中的新組件,是一個強大的滑動組件,與經典的ListView相比,同樣擁有item回收復用的功能,但是直接把viewho