Android應用接入第三方登陸之新浪微博


眾所周知,移動互聯網在這幾年經歷了蓬勃發展,到目前為止,移動互聯網發展仍然很強勁。其中移動設備系統以android占據主導地位,之前是加拿大的黑莓系統占據主導,但后來隨着android系統的問世,黑莓手機操作系統逐漸被android蠶食,目前,全球最為流行的移動操作系統有Google公司的android、蘋果(Apple)公司的ios、微軟(Microsoft)公司的windows Phone,以上三者形成手機操作系統三足鼎立之勢,其中Google的android占據市場的百分之六十幾的份額,蘋果(Apple)占據百分之十八點幾的份額,而微軟(Microsoft)的Windows Phone占據全球僅僅只有百分之三點幾的份額,好了,我們開始進入正題吧。

    隨着3G手機的廣泛普及,移動應用開始了井噴式的發展,這些移動應用公司如雨后春筍越來越多,一些剛剛起來的小公司開發的應用(大部分一些電商、社交等之類的)為了提高其知名度,不得不依附大公司的龐大的用戶群來進行推廣,比如像騰訊(Tencent),新浪(sina),人人網,臉譜網(Facebook)等,這些公司提供接口API供開發者調用。今天呢,我要說的就是新浪登錄,至於我為什么要說新浪,是因為新浪寫的接口文檔太可惡了,走了不少彎路,為了大家少走彎路,我決定寫這篇博文,如果寫的不好,請批評指正。

    要想在移動應用上使用sina登錄,第一步需要注冊成為開發者,說白了,就是一個新浪微博帳號,如果有了的話,就不要注冊了,直接登錄即可,那么在那里去注冊成為開發者呢?下面的圖會告訴你:在地址欄中輸入 t.sina.com.cn --> 它會要求你登錄(如果沒登錄)

經過以上第一步,我們進入了新浪的開放平台,如圖:

             

第三步,創建應用,獲得授權資格,這里需要你去填寫一些重要的信息,這些東西在以后會用到,如圖(創建應用):

第四步,當我們點擊了創建應用,你需要填寫以下信息,如圖:

好了,現在剩下最后一步了,填寫完以上信息之后,提交信息,完了,此時還還會有些信息需要你填寫,例如,回調地址,其實就是網站地址,可填新浪默認的,如果你自己有的話,也可以填寫你自己的網站地址,如圖:

記住,以上畫紅線部分,千萬不要泄露出去,因為會對公司造成安全隱患,特別是Android簽名、App Secret,如果App Secret不小心泄露出去的話,你可以點擊該條目,進入編輯頁,進行重置,其中android簽名是根據新浪提供的一個app_signatures.apk生成的一串MD5加密字符串,然后填上去,就哦了!下面是一個示例,還要記住的是,要想使用此工具生成一串MD5加密字符串,那你就必須將該應用安裝到你的手機上,因為該MD5加密字符串是根據包名及xx.keystore生成的,Eclipse集成開發工具Run as 所使用的是debug.keystore 所以當你在發布你的APP的時候,一定要根據你自己公司的 .keystore 生成MD5加密字符串填到android簽名哪一項上去,如果你填的是你通過Eclipse集成開發工具中的Run as 安裝到手機上去的debug.keystore生成的MD5加密字符串的話,那么會導致無法授權登錄問題產生。所以,一旦你要發布APP時,一定要更正回來,一般來說,一個公司keystore只有一份,根據報名產生的MD5加密字符串效果圖如下:

哦,對了,在最后一步我們提到了回調地址,那么該回調地址有什么用呢?該回調地址相對用戶來說是不可見的,這個回調地址是用來生成accessToken的,通過這個accessToken可以去請求接口,獲得相關用戶的信息。帶回一張圖就可以讓你明白,我上面所提到字段的意思。如圖:

完了,這就是新浪登錄的過程,下面貼上一段代碼,第三方登錄的代碼,這里有一個請求接口的類,我覺得吧他寫成內部類更好一點,因為這樣可以更好的傳數據。特別提一點,我使用的SSO登錄,我相信,Oauth2.0 認證應該是一樣的吧。

新浪微博SDK下載:http://open.weibo.com/wiki/SDK

代碼:

public class LoginActivity extends BaseActivity implements OnClickListener {

    public static final int END_SINA = 2;
    private RelativeLayout third_party_login_xinlang;
    public String TAG = "LoginActivity---->";
    public static Oauth2AccessToken accessToken;
    private Weibo mWeibo;
    private SsoHandler mSsoHandler;
    private Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            case END_SINA:
                Log.v(TAG, "sina data loded!!");
                isAlreadExist(LoginActivity.loginType);
                break;
            default:
                break;
            }
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.login);
        initViews();
        initData();
    }

    private void initData() {// 新浪微博實例

        mWeibo = Weibo.getInstance(ConstantS.APP_KEY, ConstantS.REDIRECT_URL,
                TAG);
    }

    private void initViews() {
        third_party_login_xinlang.setOnClickListener(this);

    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
        case R.id.third_party_login_xinlang:
            isThreeLogin("1");
            isSinaLogin();
            break;
        }

    }
    /**
     * 新浪登錄
     */
    private void isSinaLogin() {
        mSsoHandler = new SsoHandler(this, mWeibo);
        mSsoHandler.authorize(new AuthDialogListener(), null);
    }
    /**
     * 新浪回調
     * 
     * @author Administrator
     * 
     */
    private class AuthDialogListener implements WeiboAuthListener {

        @Override
        public void onCancel() {

        }

        @Override
        public void onComplete(Bundle values) {
            String token = values.getString("access_token");
            String expires_in = values.getString("expires_in");
            final String idstr = values.getString("uid");
            LoginActivity.accessToken = new Oauth2AccessToken(token, expires_in);
            if (LoginActivity.accessToken.isSessionValid()) {
                String date = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss")
                        .format(new java.util.Date(accessToken.getExpiresTime()));
                AccessTokenKeeper.keepAccessToken(LoginActivity.this,
                        accessToken);
            }
            new Thread(new Runnable() {
                @Override
                public void run() {
                    UserApi userApi = new UserApi(accessToken);
                    userApi.show(idstr, new SinaRequestListener());
                }
            }).start();
        }

        @Override
        public void onError(WeiboDialogError arg0) {

        }

        @Override
        public void onWeiboException(WeiboException arg0) {

        }

    }

    /**
     * 新浪請求接口
     * 
     * @author Administrator
     * 
     */
    private class SinaRequestListener implements RequestListener {

        @Override
        public void onComplete(String response) {
            JsonUtil jsonUtil = new JsonUtil();
            JSONObject jsonObject = jsonUtil.getJsonObject(response);
            try {
                Message msg = Message.obtain();
                String idstr = jsonObject.getString("idstr");// 唯一標識符(uid)
                String name = jsonObject.getString("name");// 姓名
                String avatar_hd = jsonObject.getString("avatar_hd");// 頭像

                userModel.setUid(idstr);
                userModel.setNickname(name);
                userModel.setAvatar(avatar_hd);
                
                msg.what = END_SINA;
                handler.sendMessage(msg);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

        @Override
        public void onComplete4binary(ByteArrayOutputStream arg0) {

        }

        @Override
        public void onError(WeiboException arg0) {

        }

        @Override
        public void onIOException(IOException arg0) {

        }

    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        if (mSsoHandler != null) {
            mSsoHandler.authorizeCallBack(requestCode, resultCode, data);
        }
    }

}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM