AndroidアプリでFacebook認証

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);
    }

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA