Android 集成 Facebook 登录并获取用户信息


Android 集成 Facebook 登录并获取用户信息

https://developers.facebook.com/docs/facebook-login/android?sdk=maven

  1. 新建Android Studio项目

  2. 集成 Facebook SDK

  • 打开 your_app > Gradle Scripts > build.gradle (Project) 确保下列存储库都添加到 buildscript { repositories {}} 中:
1
jcenter()
  • 打开 your_app > Gradle Scripts > build.gradle (Module: app) 并将下列执行语句添加到 dependencies{} 部分,以便依赖于最新版的 Facebook 登录 SDK:
1
implementation 'com.facebook.android:facebook-login:[4,5)'
  • 构建项目
  1. 编辑资源和清单
  • /app/res/values/strings.xml 添加如下所示的代码:
1
2
<string name="facebook_app_id">xxxxxxxx</string> 
<string name="fb_login_protocol_scheme">fbxxxxxxxx</string>
  • 打开 /app/manifest/AndroidManifest.xml在 application 元素后添加以下 uses-permission 元素:
1
2

<uses-permission android:name="android.permission.INTERNET"/>
  • 在 application 元素中添加以下 meta-data 元素、一个针对 Facebook 的 activity 元素以及一个针对 Chrome 自定义选项卡的 activity 元素和意向筛选条件:
1
2
3
4
5
6
7
8
9
<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>
  1. 添加“Facebook 登录”按钮

添加到布局 XML 文件中:

1
2
3
4
5
6
7
8

<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" />
  1. 注册回调;快速获取密匙散列;获取玩家信息

MainActivity.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
import android.content.Intent;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.Signature;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Base64;

import com.facebook.AccessToken;
import com.facebook.CallbackManager;
import com.facebook.FacebookCallback;
import com.facebook.FacebookException;
import com.facebook.GraphRequest;
import com.facebook.GraphResponse;
import com.facebook.login.LoginManager;
import com.facebook.login.LoginResult;
import com.facebook.login.widget.LoginButton;

import org.json.JSONObject;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.logging.Logger;

public class AppActivity extends AppCompatActivity {
private CallbackManager callbackManager;
public LoginButton loginButton;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_app);

callbackManager = CallbackManager.Factory.create();

LoginManager.getInstance().registerCallback(callbackManager,
new FacebookCallback<LoginResult>() {
@Override
public void onSuccess(LoginResult loginResult) {
// App code
}

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

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

getkey();
loginButton = (LoginButton) findViewById(R.id.login_button);
loginButton.setReadPermissions("email");
// If using in a fragment
//loginButton.setFragment(this);

// Callback registration
loginButton.registerCallback(callbackManager, new FacebookCallback<LoginResult>() {
@Override
public void onSuccess(LoginResult loginResult) {
// App code
getUserInfo(loginResult.getAccessToken());

}

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

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

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

// FaceBook 快速获取密匙散列
public void getkey() {
try {
PackageInfo info = getPackageManager().getPackageInfo(
"com.hippogames.ludosaga", PackageManager.GET_SIGNATURES);
for (Signature signature : info.signatures) {
MessageDigest md = MessageDigest.getInstance("SHA");
md.update(signature.toByteArray());
String key = Base64.encodeToString(md.digest(),0);
int i = 0;
}
} catch (PackageManager.NameNotFoundException e) {
int i = 0;

} catch (NoSuchAlgorithmException e) {
int i = 0;


}
}
// 获取玩家信息
/* {
"id": "xxxxxxxx",
"name": "xxx",
"picture": {
"data": {
"height": 50,
"is_silhouette": false,
"url": "https:\/\/platform-lookaside.fbsbx.com\/platform\/profilepic\/?asid=xxxxxx&height=50&width=50&ext=xxxxx&hash=xxxxx",
"width": 50
}
}
}
*/
private void getUserInfo(AccessToken accessToken){

Bundle parameters = new Bundle();
parameters.putString("fields", "id,name,gender,picture");

GraphRequest graphRequest= GraphRequest.newMeRequest(accessToken, new GraphRequest.GraphJSONObjectCallback() {
@Override
public void onCompleted(JSONObject object, GraphResponse response) {
//这里获取的头像是50*50
try {
if (object != null) {
String name = object.optString("name");
String gender = object.optString("gender");
String picture="";
JSONObject jsonObject = object.optJSONObject("picture");
if(jsonObject!=null){
JSONObject data=jsonObject.optJSONObject("data");
if(data!=null){
picture=data.optString("url");
}
}
}
}catch (Exception e){
e.printStackTrace();
}

}


});

graphRequest.setParameters(parameters);
graphRequest.executeAsync();
}
}