2021年10月5日付けで、Facebookログインは、ユーザー認証のためのAndroid埋め込みブラウザー(WebViews)のサポートを終了します。

これに関する背景情報については、ブログ記事の「Android埋め込みブラウザーでのFBログイン認証のサポート終了について」をご覧ください。

WebViewの代わりにカスタムタブを使用する詳細については、Android WebViewsの廃止をご覧ください。

Android用Facebookログイン - クイックスタート

Android用Facebook SDKを使用すると、Facebookログインでアプリにサインインできます。利用者はFacebookでアプリにログインする際に、アクセス許可をアプリに付与して、アプリが情報を取得したり、利用者の代わりにFacebookでアクションを実行することを許可します。

FacebookログインをAndroidアプリに統合する方法を例証しているサンプルプロジェクトについては、GitHubFBLoginSampleをご覧ください。

Facebookログインをアプリに追加するには、以下の手順に従います。

1. ログイン

アプリの作成または開発者としての登録を行うには、Facebookにログインしてください。

2.Facebookアプリをダウンロードする

下のボタンをクリックしてFacebookアプリをダウンロードする

3.Facebook SDKを統合する

Android用FacebookログインSDKはAndroid用Facebook SDKのコンポーネントです。プロジェクトでFacebookログインSDKを使用するには、Mavenで依存関係にするか、ダウンロードします。Android 11の変更点をサポートするには、SDKバージョン8.1以上を使用します。

Mavenを使用する

  1. プロジェクトで、[your_app] > [Gradle Scripts] > [build.gradle (Project)]を開き、次のリポジトリがbuildscript { repositories {}}に含まれていることを確認します。
    mavenCentral() 
    
  2. プロジェクトで、[your_app] > [Gradle Scripts] > [build.gradle (Module: app)]を開き、次のインプリメンテーションステートメントをdependencies{}セクションに追加して、最新バージョンのFacebookログインSDKに依存するようにします。
     implementation 'com.facebook.android:facebook-login:latest.release'
    
  3. プロジェクトをビルドします。

4.リソースとマニフェストを編集する

Android用Facebook SDKのバージョン5.15以降を使用する場合は、Chromeカスタムタブのアクティビティとインテントフィルターを追加する必要はありません。この機能はSDKに含まれています。

Facebookログインを統合すると、特定のアプリイベントは、アプリイベントの自動記録を無効にしない限り、イベントマネージャのために自動的に記録、収集されます。これは、アプリコードで変更できます。また、アプリダッシュボードかイベントマネージャの[アプリイベント]の下のトグルで切り替えることもできます。AutoLogAppEventsEnabledのフラグとトグルとの間で値が競合している場合、「Facebook SDKの自動イベント記録」のトグル値が優先されることに注意してください。収集される情報やアプリイベントの自動記録を無効にする方法については、アプリイベントの自動記録をご覧ください。

FacebookアプリIDと、Chromeカスタムタブの有効化に必要なIDの文字列を作成します。さらに、AndroidマニフェストにFacebookActivityを追加します。
  1. /app/res/values/strings.xmlファイルを開きます。
  2. facebook_app_idfb_login_protocol_schemefacebook_client_tokenの名前のstring要素を追加し、値を実際のアプリIDおよびクライアントトークンに設定します。例えば、アプリIDが1234、クライアントトークンが56789の場合、コードは次のようになります。
    <string name="facebook_app_id">1234</string>
    <string name="fb_login_protocol_scheme">fb1234</string>
    <string name="facebook_client_token">56789</string>
    
    
  3. /app/manifest/AndroidManifest.xmlファイルを開きます。
  4. application要素に該当アプリIDおよびクライアントトークンのmeta-data要素を追加します。
    <application android:label="@string/app_name" ...>
        ...
       	<meta-data android:name="com.facebook.sdk.ApplicationId" android:value="@string/facebook_app_id"/>
       	<meta-data android:name="com.facebook.sdk.ClientToken" android:value="@string/facebook_client_token"/>
        ...
    </application>
    
  5. application要素内にFacebookのアクティビティと、Chromeカスタムタブのアクティビティとインテントフィルターを追加します。
        <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>
    
  6. application要素の後のマニフェストに、uses-permission要素を追加します。
    <uses-permission android:name="android.permission.INTERNET"/>
    
    
  7. (任意)広告IDアクセス許可をオプトアウトするには、application要素の後のマニフェストにuses-permission要素を追加します。
    <uses-permission android:name="com.google.android.gms.permission.AD_ID" tools:node="remove"/>
            
  8. AndroidManifest.xmlファイル内のAutoLogAppEventsEnabledフラグを設定することで、アプリイベントの自動記録をtrueまたはfalseに直接設定できるようになります。

  9. プロジェクトをビルドします。

5.パッケージ名とデフォルトクラスをアプリに関連付ける

このステップを完了するには、ログインしてください。

6.アプリの開発キーハッシュとリリースキーハッシュを指定する

このステップを完了するには、ログインしてください。

7.アプリのシングルサインオンを有効にする

このステップを完了するには、ログインしてください。

8.Facebookログインボタンを追加する

アプリにFacebookログインを追加する最も簡単な方法は、 LoginButton をSDKから追加することです。 LoginButton という1つのUIエレメントに、 LoginManagerで使用可能な機能性がまとめられています。ユーザーがこのボタンをクリックすると、ログインが初期化され、 LoginManagerでセットされたアクセス許可が使用されます。Facebookログインには、外部ユーザーが使用する、高度なpublic_profileアクセス許可が必要です。ボタンはログイン状態によって変化し、ユーザーの認証状態に合わせたテキストが表示されます。
Facebookログインボタンを追加するには、最初にレイアウトXMLファイルにボタンを追加します。
<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" /> 

9.コールバックを登録する

ここで、CallbackManager.Factory.createを呼び出してcallbackManagerを作成し、ログイン応答を処理します。
callbackManager = CallbackManager.Factory.create();
Fragmentにボタンを追加する場合は、フラグメントを使用するアクティビティも更新する必要があります。Login buttonのプロパティをカスタマイズして、onCreate()メソッドまたはonCreateView()メソッドのコールバックに登録できます。カスタマイズできるプロパティはLoginBehaviorDefaultAudienceToolTipPopup.Styleと、LoginButtonのアクセス許可などです。例:
      
    private static final String EMAIL = "email";
      
    loginButton = (LoginButton) findViewById(R.id.login_button);
    loginButton.setReadPermissions(Arrays.asList(EMAIL));
    // If you are using in a fragment, call loginButton.setFragment(this);    

    // Callback registration
    loginButton.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
        }
    });
ログインの結果に応答するには、LoginManagerまたはLoginButtonのいずれかを使用してコールバックを登録する必要があります。LoginButtonによるコールバックの登録では、コールバックをログインマネージャに登録する必要はありません。
次のように、アクティビティまたはフラグメントのonCreate()メソッドにLoginManagerコールバックを追加します。
    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   
                }
    });
正常にログインすると、LoginResultパラメーターに新しいAccessTokenと、最後に付与または拒否されたアクセス許可が追加されます。
その後のログインに関してはregisterCallbackは必要なく、後述のAccessTokenTrackerクラスを使用して現在のアクセストークンの変更に従うことを選択できます。
最後に、onActivityResultメソッドでcallbackManager.onActivityResultを呼び出し、callbackManager経由でLoginManagerにログインの結果を渡します。

AndroidXのアクティビティまたはフラグメントを使っている場合、onActivityResultをオーバーライドする必要はありません。

      @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        callbackManager.onActivityResult(requestCode, resultCode, data);
        super.onActivityResult(requestCode, resultCode, data);
    }
FacebookSDKログインやシェアと統合したそれぞれのアクティビティやフラグメントで、onActivityResultcallbackManagerに転送します。

10.ログインステータスを確認する

アプリにログインする利用者を1人に限定できます。このとき、LoginManagerはその利用者の現在のAccessTokenProfileを設定します。FacebookSDKはこのデータを共有設定に保存し、セッションの開始時に設定します。AccessToken.getCurrentAccessToken()Profile.getCurrentProfile()をチェックすれば、この利用者がログインしているかどうかを確認できます。
SDKでは、コールドスタートでアプリを起動したときにキャッシュやアプリのブックマークからAccessToken.getCurrentAccessTokenを読み込むことができます。トークンの有効性は、次のようにActivityonCreateメソッドで確認します。
AccessToken accessToken = AccessToken.getCurrentAccessToken();
boolean isLoggedIn = accessToken != null && !accessToken.isExpired();
  
その後、カスタムボタンのOnClickListenerなどで、実際のログインを実行します。
      
LoginManager.getInstance().logInWithReadPermissions(this, Arrays.asList("public_profile"));

11.高速ログインを有効にする

エクスプレスログインでは、デバイスやプラットフォームを問わずFacebookアカウントで利用者をログインさせます。ある人がAndroidでアプリにログインし、それからデバイスを変えた場合、エクスプレスログインなら、ログイン方法をたずねることなく、その人のFacebookアカウントでログインさせることができます。これにより、重複したアカウントを作成してしまうとか、まったくログインできないといったことを回避できます。Android 11の変更点をサポートするには、まず/app/manifest/AndroidManifest.xmlファイルのqueriesエレメントに以下のコードを追加します。
  
<queries> <package android:name="com.facebook.katana" /> </queries>   
次のコードは、高速ログインを有効にする方法を示しています。
LoginManager.getInstance().retrieveLoginStatus(this, new LoginStatusCallback() { @Override public void onCompleted(AccessToken accessToken) { // User was previously logged in, can log them in directly here. // If this callback is called, a popup notification appears that says // "Logged in as <User Name>" } @Override public void onFailure() { // No access token could be retrieved for the user } @Override public void onError(Exception exception) { // An error occurred } });   

次のステップ

FacebookログインがAndroidアプリに追加されました。詳細なガイダンスについては、Facebookの他のドキュメントページをご覧ください。
Facebookからのデータ削除を求める利用者のリクエストに対応するため、データ削除コールバックを実装します。
利用者のアクセストークンとプロフィールをトラッキングします。
Facebookログインを通じてアプリがアクセスするデータの種類を管理します。
Facebookログインの統合で問題が生じた場合は、一般的な問題とその解決方法のリストをご確認ください。
Facebookログインの利用者に対してリクエストするFacebookデータによっては、公開前にアプリのレビュー申請が必要になる場合があります。
独自のログインフローを作成する方法については、ログインフローを手動で構築するをご覧ください。