注册

用Facebook登录你的APP

项目中有个第三方登录的模块,这也是目前很常见的需求,但国内做Facebook登录的并不多,所以轮到Facebook的时候上网查了下,资料少之又少,通过科学上网的方法访问developer.facebook.com之后发现Facebook登录非常简单明了,这里与大家分享一下。
 
第一步

首先你要申请一个Facebook APP ID,至于申请方法不是这里要讨论的重点,先过。这个APP ID要放在AndroidManifast.xml文件里。
<meta-data android:name="com.facebook.sdk.ApplicationId" android:value="@string/application_id" />
这样就OK了。

第二步

还是在AndroidManifast.xml里,声明下
Activity。<activity android:name="com.facebook.FacebookActivity" android:exported="true" android:label="@string/app_name" android:theme="@android:style/Theme.Translucent.NoTitleBar" />
注意这里有个android:exported="true",不要忘了加,这句的意思是当前Activity是否可以被另一个Application的组件启动:true允许被启动;false不允许被启动。

第三步

写个登录按钮,这地方也有个小小的坑。Facebook有提供一个按钮叫LoginButton的玩意,直接添加到xml文件里即可。下面这段代码就是Facebook提供的。
<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" android:layout_marginTop="30dp" android:layout_marginBottom="30dp" />
但是这个按钮居然没法修改,设置背景文字之类的都不生效,LoginButton类里也没提供相关的按钮属性修改方法。于是乎最后还是放弃使用LoginButton,自己写个吧。

第四步

导入Facebook的jar。用Android studio的话也很简单了。在build.gradle的dependencies里添加:
compile 'com.facebook.android:facebook-android-sdk:4.6.0'

第五步

万事俱备,我们只要写个activity来调用API测试下就好了。
public class FacebookLoginDemo extends Activity implements View.OnClickListener {
private static String TAG = "FacebookLoginDemo";

private Button mFbLoginBtn;
private CallbackManager callbackManager;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initViews();
FacebookSdk.sdkInitialize(getApplicationContext());
callbackManager = CallbackManager.Factory.create();
LoginManager.getInstance().registerCallback(callbackManager, new FacebookCallback<LoginResult>() {
@Override
public void onSuccess(LoginResult loginResult) {
Toast.makeText(FacebookLoginDemo.this, "facebook_account_oauth_Success", Toast.LENGTH_SHORT);
Log.e(TAG, "token: " + loginResult.getAccessToken().getToken());
//TODO:got the token,Notify server,and do something
}

@Override
public void onCancel() {
Toast.makeText(FacebookLoginDemo.this, "facebook_account_oauth_Cancel", Toast.LENGTH_SHORT);
}

@Override
public void onError(FacebookException e) {
Toast.makeText(FacebookLoginDemo.this, "facebook_account_oauth_Error", Toast.LENGTH_SHORT);
Log.e(TAG, "e: " + e);
}
});
}

private void initViews() {
mFbLoginBtn = (Button) findViewById(R.id.fbLoginBtn);
mFbLoginBtn.setOnClickListener(this);
}

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

@Override
protected void onResume() {
super.onResume();
AppEventsLogger.activateApp(this);
}

@Override
protected void onPause() {
super.onPause();
AppEventsLogger.deactivateApp(this);
}

@Override
public void onClick(View v) {
if (v.getId() == R.id.fbLoginBtn) {
AccessToken accessToken = AccessToken.getCurrentAccessToken();
if (accessToken accessToken = AccessToken.getCurrentAccessToken();
if (accessToken == null || accessToken.isExpired()) {
LoginManager.getInstance().logInWithReadPermissions(this, Arrays.asList("public_profile", "user_friends"));
}
}
}
}

简单分析下代码,点击登录的时候会跳转到FacebookActivity,然后做些权限授权之类的操作,成功后页面finish(),回调到onActivityResult里的callbackManager,onSuccess()里会拿到登录授权信息,一般来说拿到token就好了,再拿着token去告诉自己的服务器,授权登录Facebook成功,然后do something,大功告成。
 

0 个评论

要回复文章请先登录注册