Facebook 登录接入记录
1. 注册 Facebook 账号
2. 在开发者中心创建应用
https://developers.facebook.com/
3. 接入sdk
https://developers.facebook.com/docs/android/getting-started/,较早的版本有中文
compile 'com.facebook.android:facebook-login:4.28.0'
<meta-data android:name="com.facebook.sdk.ApplicationId"
android:value="@string/facebook_app_id"/>
<activity android:name="com.facebook.FacebookActivity"
android:configChanges=
"keyboard|keyboardHidden|screenLayout|screenSize|orientation"
android:label="@string/app_name" />
<activity
android:name="com.facebook.CustomTabActivity"
android:exported="true">
<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="@string/fb_login_protocol_scheme" />
</intent-filter>
</activity>
主要代码
先注册登录回调
LoginManager.getInstance().registerCallback(callbackManager,
new FacebookCallback<LoginResult>() {
@Override
public void onSuccess(LoginResult loginResult) {
Logger.d(loginResult.getAccessToken());
// Profile.getCurrentProfile() null
}
@Override
public void onCancel() {
// App code
}
@Override
public void onError(FacebookException exception) {
// App code
}
});
调用登录
Collection<String> permissions = Arrays.asList("public_profile", "email", " user_friends");
LoginManager.getInstance().logInWithReadPermissions(this, permissions);
没安装应用是会自动使用网页登录
问题
1. 获取 token 后 profile 为 null
Profile 不是立即更新的,还得等他更新
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
callbackManager = CallbackManager.Factory.create();
profileTracker = new ProfileTracker() {
@Override
protected void onCurrentProfileChanged(
Profile oldProfile,
Profile currentProfile) {
// App code
}
};
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
callbackManager.onActivityResult(requestCode, resultCode, data);
}
@Override
public void onDestroy() {
super.onDestroy();
profileTracker.stopTracking();
}
放到 getToken 之后,等 profile 更新了再获取内容
2. 权限
刚注册的应用默认只有 “public_profile”, “email”, ” user_friends”, 对应的就是个人信息和好友信息
但 user_friends 只有好友数量信息而已,其他信息则需要申请额外权限,调用其他接口获取
3. 退出
LoginManager.getInstance().logOut();
4. 接口访问
sdk 并没有封装所有的接口,只提供了类似 asyncHttp 的 http 访问工具类,通过sdk只能获取基本信息,更多数据则需要自己访问接口
具体的接口信息都在 https://developers.facebook.com/docs/graph-api
比如用户好友信息
public class UserFriendsRequest {
public static void makeRequest(GraphRequest.Callback callback) {
String userId = Profile.getCurrentProfile().getId();
String endPoint = String.format("/%s/friends", userId);
GraphRequest request = new GraphRequest(
AccessToken.getCurrentAccessToken(),
endPoint,
null,
HttpMethod.GET,
callback
);
request.executeAsync();
}
}
然后判断错误,json 转 obj 就可以了
mCallback = new GraphRequest.Callback() {
@Override
public void onCompleted(GraphResponse response) {
if (response.getError() == null) {
UserFriendsResp userFriendsResp = parse(response.getRawResponse());
if (userFriendsResp != null) {
mGetUserFriendsResponse.onCompleted(userFriendsResp);
return;
}
}
mGetUserFriendsResponse.onError();
}
};