Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android 中實現分享和第三方登陸---以新浪微博為例

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、創建微博授權所需參數的持久化類

/**
 * 該類定義了微博授權時所需要的參數。
 * 
 * @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包在新浪微博開放平台下提供下載。

 

 

/**
 * 新浪微博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、分享微博

 

 

 //從本地讀取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拿到用戶信息然後幫助用戶在後台注冊就實現了第三方登陸了,代碼如下:

 

 

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,如獲取某人發的所有微博,獲取粉絲,自己關注的人等等,其實網上很多新浪微博開發的例子都是通過這個方法實現的

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved