1. 程式人生 > >實現新浪微博第三方登入獲取使用者資訊

實現新浪微博第三方登入獲取使用者資訊

第一步:建立Android專案下載新浪sdk

下載地址:https://github.com/sinaweibosdk/weibo_android_sdk

裡面包含簽名工具和新浪官方的debug.keystore

新浪的demo必須用官方的debug.keystore編譯才能正常執行

第二步:登入新浪微博開放平臺http://open.weibo.com/

建立應用

填寫應用名稱

填寫專案的包名和簽名

簽名的獲取方法:在下載好的新浪sdk包中包含有,安裝在模擬器上,填寫上本專案的包名即可獲得對應的專案簽名

填寫完畢之後。

點選高階資訊,填寫好回撥頁

回撥頁可以為任意的網址


第三步:現在可以正式開始寫程式碼啦

如果想要實現新浪的第三方登入,必須引入新浪的第三方library

weiboSDK

為啦避免引入失敗,必須將weiboSDK和專案放在同一目錄下,並保證supportv4 jar 包版本一致


將WeiboSDKDemo中lib下的所有so包拷貝到專案的lib目錄下


將所需的許可權及其他內容複製到清單配置檔案中

 <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

 <activity android:name="com.sina.weibo.sdk.component.WeiboSdkBrowser" 
    android:configChanges="keyboardHidden|orientation"
    android:windowSoftInputMode="adjustResize"
    android:exported="false" >
</activity>
<service android:name="com.sina.weibo.sdk.net.DownloadService"
    android:exported="false">
</service>

在佈局檔案中加入登入按鈕

<com.sina.weibo.sdk.widget.LoginButton
            android:id="@+id/login_button_style2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerInParent="true"
            android:layout_marginLeft="10dp"
            android:background="@drawable/com_sina_weibo_sdk_login_button_with_original_logo"
             />

將Demo中的Constants類複製到專案中

將AppKey和REDIRECT_URL替換成當前專案的AppKey和回撥地址

Activity中程式碼如下:

package com.example.weibologin;




import java.text.SimpleDateFormat;


import com.sina.weibo.sdk.auth.AuthInfo;
import com.sina.weibo.sdk.auth.Oauth2AccessToken;
import com.sina.weibo.sdk.auth.WeiboAuthListener;
import com.sina.weibo.sdk.auth.sso.SsoHandler;
import com.sina.weibo.sdk.exception.WeiboException;
import com.sina.weibo.sdk.net.RequestListener;
import com.sina.weibo.sdk.openapi.UsersAPI;
import com.sina.weibo.sdk.openapi.models.User;
import com.sina.weibo.sdk.widget.LoginButton;


import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Log;
import android.widget.Toast;
public class MainActivity extends Activity {


private AuthInfo mAuthInfo;
private SsoHandler mSsoHandler;
private Oauth2AccessToken mAccessToken;
private LoginButton loginbt;
public UsersAPI mUsersApi;
private RequestListener mListener = new RequestListener() {
@Override
public void onComplete(String response) {
if (!TextUtils.isEmpty(response)) {


// 呼叫 User#parse 將JSON串解析成User物件
User user = User.parse(response);
if (user != null) {
Toast.makeText(MainActivity.this,
"獲取User資訊成功,使用者暱稱:" + user.screen_name,
Toast.LENGTH_LONG).show();
Log.i("TAG","登入成功!------->:"+user.screen_name);
//userTextView.setText(user.screen_name);
} else {
//userTextView.setText(response);


Toast.makeText(MainActivity.this, "2:" + response,
Toast.LENGTH_LONG).show();
}
}
}


@Override
public void onWeiboException(WeiboException arg0) {
// TODO Auto-generated method stub

}
};


@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mAuthInfo = new AuthInfo(this, Constants.APP_KEY, 
Constants.REDIRECT_URL, Constants.SCOPE);
loginbt=(LoginButton) findViewById(R.id.login_button_style2);
loginbt.setWeiboAuthInfo(mAuthInfo, new AuthListener());
loginbt.setStyle(LoginButton.LOGIN_INCON_STYLE_3);

}
  @Override
   protected void onActivityResult(int requestCode, int resultCode, Intent data) {
       super.onActivityResult(requestCode, resultCode, data);
       
       if(loginbt!=null)
       {
        loginbt.onActivityResult(requestCode, resultCode, data);
        Log.i("TAG","登入成功!");
        System.out.println(data.toString());
       }
       
   }
/**
     * 微博認證授權回撥類。
     * 1. SSO 授權時,需要在 {@link #onActivityResult} 中呼叫 {@link SsoHandler#authorizeCallBack} 後,
     *    該回調才會被執行。
     * 2. 非 SSO 授權時,當授權結束後,該回調就會被執行。
     * 當授權成功後,請儲存該 access_token、expires_in、uid 等資訊到 SharedPreferences 中。
     */
    class AuthListener implements WeiboAuthListener {
        
        


@Override
        public void onComplete(Bundle values) {
            // 從 Bundle 中解析 Token
            mAccessToken = Oauth2AccessToken.parseAccessToken(values);
            //從這裡獲取使用者輸入的 電話號碼資訊 
            mUsersApi =new UsersAPI(MainActivity.this, Constants.APP_KEY, mAccessToken);
            Long uid = Long.parseLong(mAccessToken.getUid());
            mUsersApi.show(uid, mListener);
            String  phoneNum =  mAccessToken.getPhoneNum();
            if (mAccessToken.isSessionValid()) {
            Log.i("TAG","登入成功!成功~~~~~~~~~~~~~~~~~~~~~~~~");
            System.out.println("成功~~~~~~~~~~~~~~~~~~~~~~~~");
            Oauth2AccessToken accessToken = Oauth2AccessToken.parseAccessToken(values);
                 if (accessToken != null && accessToken.isSessionValid()) {
                     String date = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss").format(
                             new java.util.Date(accessToken.getExpiresTime()));
                     String format = getString(R.string.weibosdk_demo_token_to_string_format_1);
                     String s =String.format(format, accessToken.getToken(), date);
                     Log.i("TAG","登入成功------>"+s+phoneNum);
//                     AccessTokenKeeper.writeAccessToken(getApplicationContext(), accessToken);
                 }
            } else {
                // 以下幾種情況,您會收到 Code:
                // 1. 當您未在平臺上註冊的應用程式的包名與簽名時;
                // 2. 當您註冊的應用程式包名與簽名不正確時;
                // 3. 當您在平臺上註冊的包名和簽名與您當前測試的應用的包名和簽名不匹配時。
                String code = values.getString("code");
                Log.i("TAG","登入成功!失敗~~~~~~~~~~~~~~~~~~~~~~~~");
                System.out.println("失敗");
//                String message = getString(R.string.weibosdk_demo_toast_auth_failed);
//                if (!TextUtils.isEmpty(code)) {
//                    message = message + "\nObtained the code: " + code;
//                }
//                Toast.makeText(WBAuthActivity.this, message, Toast.LENGTH_LONG).show();
            }
        }


        @Override
        public void onCancel() {
//            Toast.makeText(WBAuthActivity.this, 
//                   R.string.weibosdk_demo_toast_auth_canceled, Toast.LENGTH_LONG).show();
        }


        @Override
        public void onWeiboException(WeiboException e) {
        System.out.println("出錯~~~~~~~~~~~~~~");
        Log.i("TAG","登入成功!出錯~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
//            Toast.makeText(WBAuthActivity.this, 
//                    "Auth exception : " + e.getMessage(), Toast.LENGTH_LONG).show();
        }
    }
    
}