AndroidアプリからFacebook認証を使う。
ユーザーがボタンを押したらFacebookで認証を行い、Facebookからメールアドレスなどを取得する。
基本は公式サイトの通りでOK。
Facebook 公式
実装箇所は下記の通り。
その他、Facebookの開発者ページでアプリ作成、プラットフォーム追加、パッケージ名の登録など必要です。
build.gradle(プロジェクト)
buildscript {
・・・
repositories {
・・・
jcenter()
}
build.gradle(モジュール)
dependencies {
・・・
implementation 'com.facebook.android:facebook-login:[4,5)'
}
strings.xml
<string name="facebook_app_id">9999999999999</string>
<string name="fb_login_protocol_scheme">fb9999999999999</string>
AndroidManifest.xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
・・・
<uses-permission android:name="android.permission.INTERNET" />
・・・
<application>
・・・
<!-- Facebook 認証 -->
<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/appName" />
<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>
・・・
layout.xml
公式サイトでは、com.facebook.login.widget.LoginButtonを使用しているが、デザインを合わせたいので独自のボタンを使用する。
<com.beardedhen.androidbootstrap.BootstrapButton
android:id="@+id/login_facebook"
app:bootstrapText="Facebook でログインする"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginLeft="24dp"
android:layout_marginRight="24dp"
android:layout_marginTop="24dp"
app:bootstrapBrand="primary"
app:bootstrapSize="lg"
app:buttonMode="regular"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@id/xxxx"
app:showOutline="false" />
Activity
public class XxxxActivity extends AppCompatActivity {
・・・
BootstrapButton btnLoginFacebook;
CallbackManager callbackManager;
・・・
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
・・・
btnLoginFacebook = findViewById(R.id.login_facebook);
btnLoginFacebook.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
LoginManager.getInstance().logInWithReadPermissions(this, Arrays.asList("public_profile", "email"));
}
});
callbackManager = CallbackManager.Factory.create();
LoginManager.getInstance().registerCallback(callbackManager,
new FacebookCallback<LoginResult>() {
@Override
public void onSuccess(LoginResult loginResult) {
GraphRequest request = GraphRequest.newMeRequest(
loginResult.getAccessToken(),
new GraphRequest.GraphJSONObjectCallback() {
@Override
public void onCompleted(JSONObject object, GraphResponse response) {
if (response.getError() != null || !object.has("email")) {
// error
return;
}
try {
doSomesthing(
object.getString("id"),
object.getString("email"),
object.getString("name"));
} catch (JSONException e) {
// to do
}
}
});
Bundle parameters = new Bundle();
parameters.putString("fields", "id, name, email, gender");
request.setParameters(parameters);
request.executeAsync();
}
@Override
public void onCancel() {
// to do
}
@Override
public void onError(FacebookException exception) {
// to do
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
callbackManager.onActivityResult(requestCode, resultCode, data);
super.onActivityResult(requestCode, resultCode, data);
}