FB Login SDK
FB Login SDK (需翻墙)
1.注册开发者帐号
2.创建应用
3.接入SDK
-
minSdkVersion : 15
-
module的build.gradle中添加
repositories {
mavenCentral()
}
-
module的dependecies中添加:
compile 'com.facebook.android:facebook-android-sdk:[4,5)'
-
string.xml中:
<string name="facebook_app_id">fb_app_id</string>
-
AndroidManifest.xml 添加网络访问权限:
<uses-permission android:name="android.permission.INTERNET"/>
-
添加meta-data:
<application android:label="@string/app_name" ...>
...
<meta-data android:name="com.facebook.sdk.ApplicationId" android:value="@string/facebook_app_id"/>
...
</application>
4.代码调用
FB登录代码调用分为两种:
其一,使用FB提供的登录按钮
<com.facebook.login.widget.LoginButton
android:id="@+id/login_fb"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
LoginButton loginFb;
CallbackManager callbackManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
callbackManager = CallbackManager.Factory.create();
loginButton.setReadPermissions("email");
// If using in a fragment
// loginButton.setFragment(this);
// Other app specific specialization
loginFb.registerCallback(callbackManager, new FacebookCallback<LoginResult>() {
@Override
public void onSuccess(LoginResult loginResult) {
// App code
}
@Override
public void onCancel() {
// App code
}
@Override
public void onError(FacebookException error) {
// App code
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
callbackManager.onActivityResult(requestCode, resultCode, data);
}
其二,使用自定义的登录按钮
与第一种方式的区别:
注册回调时通过LoginManager而非LoginButton
LoginManager.getInstance().registerCallback(..., ...)
登录调用
List<String> permissions;
permissions = Arrays.asList("email", "user_likes", "user_status", "user_photos", "user_birthday", "public_profile", "user_friends");
LoginManager.getInstance().logInWithReadPermissions(activity, permissions);
检查登录状态
您的应用一次只能登录一个用户,LoginManager 会为该用户设置当前的 AccessToken 和 Profile。FacebookSDK 会将该数据保存在共享首选项中,并在 SDK 初始化过程中进行设置。 您可以通过检查 AccessToken.getCurrentAccessToken() 和 Profile.getCurrentProfile() 来查看用户是否已登录。
获取用户资料
仅需简单的个人资料可通过Profile.getCurrentProfile()获得的,Profile包含字段:
- id
- firstName
- middleName
- lastName
- name
- linkUri (用户主页链接)
若需获取更详细的信息可通过以下方式查询获取:
GraphRequest request = GraphRequest.newMeRequest(accessToken, new GraphRequest.GraphJSONObjectCallback() {
@Override
public void onCompleted(JSONObject object, GraphResponse response) {
Log.e("yc", "object:"+object.toString());
if (object != null) {
String id = object.optString("id");
String name = object.optString("name");
String gender = object.optString("gender");
String emali = object.optString("email");
JSONObject object_pic = object.optJSONObject("picture");
JSONObject object_data = object_pic.optJSONObject("data");
String photo = object_data.optString("url");
String locale = object.optString("locale");
FbProfile selfInfo = GsonT.parseJson(object.toString(), FbProfile.class);
if (fbLoginListener != null) {
fbLoginListener.accessProfile(selfInfo);
}
}
}
});
Bundle parameters = new Bundle();
parameters.putString("fields", "id,name,link,gender,birthday,email,picture,locale,updated_time,timezone,age_range,first_name,last_name");
request.setParameters(parameters);
request.executeAsync();
附:获取Hash值命令
keytool -exportcert -alias YOUR_RELEASE_KEY_ALIAS(别名) -keystore YOUR_RELEASE_KEY_PATH(key文件) | openssl sha1 -binary | openssl base64
Issues And Answers
issue1:
登录时反馈这样的信息: This app is still in development mode, and you don’t have access to it. Switch to a registered test user or ask an app admin for permissions.
Answer:
Facebook当前登录的账号需是创建App的账号
或者
将App设置为public(试了不起作用不知道是不是哪个步骤错了) http://stackoverflow.com/questions/30085246/app-not-setup-this-app-is-still-in-development-mode
issue2:
Invalid key hash. …
Answer:
如果按照官方指导生成仍然抱着个错误,可能是使用 获取Hash值命令 key文件的路径错了