1. 程式人生 > >Android QQ、微信、Facebook和推特第三方登入

Android QQ、微信、Facebook和推特第三方登入

        在Android 很多的APP應用中,都需要利用第三方登入來實現APP 自己本身應用的快速登入。這裡的第三方平臺,一般是已經有大量使用者的平臺,比如說國內的QQ,微信,國外的Facebook和Twitter 等,而本篇部落格主要實現了這四個平臺的登入。

QQ登入

        首先進入 騰訊開放平臺,登入後可以根據自己的需要註冊個人或者公司的開發者賬號,然後建立一個Android應用,獲取應用的APPID。因為我本人很久之前就註冊了開發者賬號,不知道現在重新註冊後會跳轉到哪一個介面,所以已註冊的開發者可以直接點選這,進入應用建立介面。建立應用成功後,能夠得到應用的APP ID 和 APP KEY,第三方登入會用到這個資訊。

點選連結下載最新的SDK.jar,也可以在下面的專案中拿到已經下載好的jar 包。成功引用jar後,開始程式碼的實現。
首先實現一個監聽:

public class BaseUiListener implements IUiListener {

    @Override
    public void onCancel() {
        // TODO Auto-generated method stub
    }

    @Override
    public void onComplete(Object arg0) {
        doComplete((JSONObject)arg0);
    }

    protected
void doComplete(JSONObject values) { } @Override public void onError(UiError arg0) { // TODO Auto-generated method stu } }

        然後在登入介面實現:

//應用需要獲得哪些介面的許可權,由“,”分隔  所有許可權用“all”
String Scope = "get_user_info,add_t,qrcode";
// 啟動QQ登入SDK
mTencent = Tencent.createInstance(QQAppID, getApplicationContext());
// 啟動QQ登入SDK
listener = new BaseUiListener() { @Override protected void doComplete(JSONObject values) { Toast.makeText(MainActivity.this, "QQ 登入成功-----" + values, Toast.LENGTH_SHORT).show(); } }; // 執行登入方法 mTencent.login(MainActivity.this, Scope, listener); //應用呼叫Andriod_SDK介面時,如果要成功接收到回撥,需要在呼叫介面的Activity的onActivityResult方法中增加如下程式碼: if (requestCode == Constants.REQUEST_LOGIN) { Tencent.onActivityResultData(requestCode, resultCode, data, listener); }

        最後還要在AndroidManifest.xml中增加配置的節點下增加以下配置(注:不配置將會導致無法呼叫API)

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

<application>
 <activity
       android:name="com.tencent.tauth.AuthActivity"
       android:noHistory="true"
       android:launchMode="singleTask" >
    <intent-filter>
           <action android:name="android.intent.action.VIEW" />
           <category android:name="android.intent.category.DEFAULT" />
           <category android:name="android.intent.category.BROWSABLE" />
           <data android:scheme="tencent你的AppId" />
    </intent-filter>
 </activity>
<activity
       android:name="com.tencent.connect.common.AssistActivity"
       android:configChanges="orientation|keyboardHidden"
       android:screenOrientation="behind" 

android:theme="@android:style/Theme.Translucent.NoTitleBar" />
<application>

微信登入

        首先進入微信開發平臺,登入後可以根據自己的需要註冊個人或者公司的開發者賬號,然後建立一個Android應用。填寫完畢後,點選 提交稽核,提交稽核成功,7天內微信會給出稽核結果。稽核通過後,應用的APPID和APPKey就可以使用了。稽核通過後在管理中心的移動應用列表點選檢視,拿到應用的AppID和AppSecret。因為微信SDK改成通過Gradle的方式釋出到jcenter,所以在Android Studio 中的build.gradle檔案中,新增遠端依賴實現SDK 庫的載入。

compile 'com.tencent.mm.opensdk:wechat-sdk-android-with-mta:+'

        在你的包名相應目錄下新建一個wxapi目錄,並在該wxapi目錄下新增一個WXEntryActivity類。

public class WXEntryActivity extends AppCompatActivity implements IWXAPIEventHandler {

    private static final String TAG = "WXEntryActivity";
    private String wechatAppID = "wxd38bb2e01fee8e55";
    private String wechatAppSecret = "wxd38bb2e01fee8e55";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        IWXAPI api = WXAPIFactory.createWXAPI(this, wechatAppID, true);
        api.handleIntent(getIntent(), this);
    }

    @Override
    public void onReq(BaseReq req) {
        Log.i(TAG, "onReq...");
    }

    @Override
    public void onResp(BaseResp resp) {
        Log.i(TAG, "onResp: " + resp);
        String code = null;
        switch (resp.errCode) {
            case BaseResp.ErrCode.ERR_OK:// 使用者同意,只有這種情況的時候code是有效的
                code = ((SendAuth.Resp) resp).code;
                Log.i("Apptest", code);
                try {
                    requesUserInfo(code);
                } catch (Exception e) {
                    e.printStackTrace();
                }
                break;
            case BaseResp.ErrCode.ERR_AUTH_DENIED:// 使用者拒絕授權
                Log.i("Apptest", "使用者拒絕授權");
                break;
            case BaseResp.ErrCode.ERR_USER_CANCEL:// 使用者取消
                Log.i("Apptest", "使用者取消");
                break;

            default:// 傳送返回

                break;
        }
        finish();
    }

    public void requesUserInfo(final String code) {
        final String path = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=" + wechatAppID
                + "&secret=" + wechatAppSecret + "&code=" + code
                + "&grant_type=authorization_code";
        final android.os.Handler handler = new android.os.Handler() {
            public void handleMessage(Message msg) {
                super.handleMessage(msg);
                Bundle b = msg.getData();
                String newsTemp = b.getString("msg");
                Toast.makeText(WXEntryActivity.this, "微信登入成功-----" + newsTemp, Toast.LENGTH_SHORT).show();
            }
        };

        new Thread(new Runnable() {
            @Override
            public void run() {
                BufferedReader br = null;
                try {
                    URL url = new URL(path);
                    HttpURLConnection httpconn = (HttpURLConnection) url.openConnection();
                    httpconn.setRequestProperty("accept", "*/*");
                    httpconn.setDoInput(true);
                    httpconn.setDoOutput(true);
                    httpconn.setConnectTimeout(5000);
                    httpconn.connect();
                    int stat = 200;
                    String msg = "";
                    if (stat == 200) {
                        br = new BufferedReader(new InputStreamReader(httpconn.getInputStream()));
                        msg = br.readLine();
                        Bundle b = new Bundle();
                        b.putString("msg", msg);
                        Message m = new Message();
                        m.setData(b);
                        handler.sendMessage(m);
                    } else {
                        msg = "請求失敗";
                        Log.i(TAG, msg);
                    }
                } catch (MalformedURLException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                } finally {
                    if (br != null) {
                        try {
                            br.close();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }
        }).start();
    }

}

        並在manifest檔案裡面加上exported屬性,設定為true,並且新增許可權支援

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

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

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

<uses-permission android:name="android.permission.READ_PHONE_STATE"/>

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

...

<activity
            android:name=".wxapi.WXEntryActivity"
            android:exported="true"
            android:label="@string/app_name" />

        然後在登入介面實現:

// 獲取IWXAPI 例項
mIwxapi = WXAPIFactory.createWXAPI(MainActivity.this, wechatAppID, false);
// 將應用的APPID 註冊到微信
mIwxapi.registerApp(wechatAppID);
// 傳送登入請求
SendAuth.Req req = new SendAuth.Req();
req.scope = "snsapi_userinfo";
req.state = "wechat_sdk_test";
mIwxapi.sendReq(req);

FaceBook 登入

        因為大陸不能訪問外國網站的原因,所以Facebook 的登入需要翻牆,這裡預設大家都能成功翻牆,點選進入Facebook for developers,註冊一個Facebook開發者賬號。然後點選我的應用,選擇新增新應用。在應用控制介面點選產品模組,新增Facebook 登入模組,點選快速啟動建立Android應用。在建立的過程中,根據教程實現第三方登入,當第六步編輯完資源和清單檔案後,執行下面的操作:

// 要獲取的資訊
List<String> permissions = Arrays.asList("email", "user_likes",
            "user_status", "user_photos", "user_birthday", "public_profile", "user_friends");
// 建立 callbackManager,以便處理登入響應
callbackManager = CallbackManager.Factory.create();
LoginManager.getInstance().registerCallback(callbackManager,
    new FacebookCallback<LoginResult>() {
        @Override
        public void onSuccess(LoginResult loginResult) {
            Toast.makeText(MainActivity.this, "Facebook 登入成功-----" + loginResult.getAccessToken().toString(), Toast.LENGTH_SHORT).show();
        }

    @Override
    public void onCancel() {
        // App code
    }

    @Override
    public void onError(FacebookException exception) {
        // App code
    }
});

//最後通過 callbackManager 將登入結果傳遞至 LoginManager。
 @Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == 64206) {
        callbackManager.onActivityResult(requestCode, resultCode, data);
    }
}

Twitter 登入

        因為大陸不能訪問外國網站的原因,所以Twitter 的登入也需要翻牆,這裡預設大家都能成功翻牆,點選進入Twitter移動開發,註冊一個Twitter開發者賬號,Twitter 開發者這裡是需要稽核的。稽核通過後建立一個應用,拿到應用的TWITTER_KEY 和 TWITTER_SECRET。

 // 初始化Twitter
 TwitterConfig config = new TwitterConfig.Builder(MainActivity.this)
            .logger(new DefaultLogger(Log.DEBUG))
            .twitterAuthConfig(new TwitterAuthConfig(TWITTER_KEY, TWITTER_SECRET))
            .debug(true)
            .build();
Twitter.initialize(config);
// 獲取twitter 的客戶端
twitterAuthClient = new TwitterAuthClient();

twitterAuthClient.authorize(MainActivity.this, new Callback<TwitterSession>() {
    @Override
    public void success(Result<TwitterSession> result) {
        TwitterAuthToken authToken = result.data.getAuthToken();
            Toast.makeText(MainActivity.this, "Twitter 登入成功-----" + authToken, Toast.LENGTH_SHORT).show();
    }

    @Override
    public void failure(TwitterException exception) {

    }
});

//最後通過 twitterAuthClient 將登入結果返回。
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == TwitterAuthConfig.DEFAULT_AUTH_REQUEST_CODE) {
        twitterAuthClient.onActivityResult(requestCode, resultCode, data);
    }
}

        以上就是四個第三方平臺第三方登入過程,具體的實現程式碼已提交到GitHub,點選檢視Android QQ,微信,Facebook和推特第三方登入,歡迎fark,star。