前情概要
集成環境
github上的環境說明有點瑕疵, 在Wosao/readme上做了更正。本地集成環境如下:
1. AndroidStudio 1.4.1
2. Facebook SDK 4.6.0
3. Gradle 2.2
4. OS Win10
目標
本作代碼 使用 git checkout -f Myddev-05-LoginManager 獲得
本作是其中的第三篇,Facebook SDK 提供2種方法供你登錄:
- LoginButton class - 提供登錄button, 你可以添加到自己的UI中,使用當前access token 並且可以登錄,登出!
- LoginManager class - 不使用UI 元素來初始化登錄!
通過閱讀本作,您可以獲得:
1. LoginButton方式登錄
2. LoginManager方式登錄
LoginButton登錄
首先在act_layout中添加自帶的button 元素。
<LinearLayout android:id="@+id/ll_social_container" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:layout_above="@+id/rl_home_bottom_container" android:layout_marginBottom="30dp"> <com.facebook.login.widget.LoginButton android:id="@+id/login_button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" />
其中com.facebook.login.widget.LoginButton就是facebook提供的UI控件, 可以添加android其他屬性。
其次需要在HomeActivityTest.java中實現登錄步驟
1.在Applicaion中初始化facebook sdk, 官方推薦的方法。
public void onCreate() { super.onCreate(); FacebookSdk.sdkInitialize(getApplicationContext()); }
不要忘記在AndroidManifest.xml中 application標籤下添加
android:name=".MyApplication"
2.定義LoginButton & CallbackManager對象
private LoginButton loginButton; private CallbackManager callbackManager;
3.在onCreate中實例化對象
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); ... //獲得callbackmanager callbackManager = CallbackManager.Factory.create(); setContentView(R.layout.act_home); ... ... //獲得loginButton loginButton = (LoginButton) findViewById(R.id.login_button); if (loginButton == null) { return; } ... ... }
4.設置讀取權限以及註冊回調
loginButton.setReadPermissions(Arrays.asList("public_profile", "user_friends", "email", "user_birthday")); loginButton.registerCallback(callbackManager, new FacebookCallback<LoginResult>() { @Override public void onSuccess(LoginResult loginResult) { Log.e(TAG, "onSuccess --------"); } @Override public void onCancel() { Log.e(TAG, "onCancel"); } @Override public void onError(FacebookException exception) { Log.e(TAG, "onError: " + exception.getMessage() + "\n " + exception.toString()); } });
5.重寫onActivityResult
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); Log.e(TAG, "request: " + requestCode + ", resultCode: " + resultCode + ", data: " + data.toString()); callbackManager.onActivityResult(requestCode, resultCode, data); }
LoginManager登錄
爲實現本地Button登錄facebook, 這裏僅僅添加了幾個步驟。
首先在act_layout中添加本地Button 元素。
<Button android:id="@+id/login_button_local" android:layout_width="wrap_content" android:layout_height="40dp" android:text="@string/local_login_button" android:layout_gravity="center_horizontal" />
其次,在HomeActivityTest.java中添加
//本地 Button Login private Button localLoginButton;
在onCreate()
//第二種方式(LoginManager)登錄facebook localLoginButton = (Button)findViewById(R.id.login_button_local); localLoginButton.setOnClickListener(this);
最後,在onClick()中調用函數localLogin 實現登錄以及回調處理
private void localLogin() { LoginManager.getInstance().logInWithReadPermissions(this, Arrays.asList("public_profile", "user_friends", "email", "user_birthday")); //LoginManager.getInstance().logInWithReadPermissions(this, Arrays.asList("public_profile", "user_friends")); LoginManager.getInstance().registerCallback(callbackManager, new FacebookCallback<LoginResult>() { @Override public void onSuccess(LoginResult loginResult) { // App code Log.e(TAG, "LocalLogin - onSuccess --------" + loginResult.getAccessToken()); Toast.makeText(getApplicationContext(), "Login in Success!!!", Toast.LENGTH_LONG).show(); } @Override public void onCancel() { // App code Log.e(TAG, "LocalLogin - onCancel"); Toast.makeText(getApplicationContext(), "Login in Cancel!!!", Toast.LENGTH_LONG).show(); } @Override public void onError(FacebookException exception) { // App code Log.e(TAG, "LocalLogin - onError: " + exception.getMessage() + "\n " + exception.toString()); Toast.makeText(getApplicationContext(), "Login in Error: " + exception.getMessage() + "\n " + exception.toString(), Toast.LENGTH_LONG).show(); } }); }
記得onActivityResult重寫是必須的!上文已說明,這裏不列舉!
sample運行效果
其中紅框內容,是本文的實現重點, 上半部分是分享的步驟!