Help us understand the problem. What is going on with this article?

Kotlin×AndroidでFacebook認証と取得を実装

More than 1 year has passed since last update.

新規でのアプリ開発をする機会があったので、Kotlinで開発中にSNS認証周りで
FacebookSDKがいつの間にかバージョン更新で仕様が変わっていて少々ハマってしまった際のメモです。
※こちらは2017年11月15日時点での実装方法になります。

今回ハマったのは、特に以下の点です。
(日付みると結構前に仕様が変わってたんですね・・・SNS認証関連から遠ざかっているとこうなるんですね:joy:
スクリーンショット 2017-11-16 17.06.44.png

アップグレードガイドラインには以下のようにしか記載がなく、、、
スクリーンショット 2017-11-16 17.14.17.png

コールバックの記載はあるのに、初期化の実装方法の記載がない・・・!

試しに初期化の記述だけ削除して実行して見たら、初期化してないからダメだよと言われてしまう。

FacebookSDK.sdkInitialize

そりゃそうですよね。。
https://developers.facebook.com/docs/facebook-login/android
こちらで探して見たのですが、記載なく。。(スタートガイドにもない!!)
なので、以下のFacebookSDKのGithubから
https://github.com/facebook/facebook-android-sdk

FacebookSdkのsdkInitializeの関数ヘッダーコメントに

* As part of SDK initialization basic auto logging of app events will occur, this can be
* controlled via 'com.facebook.sdk.AutoLogAppEventsEnabled' manifest setting

と記載があったので、manifestを変更してみる。

AndroidManifest.xml
<meta-data android:name="com.facebook.sdk.AutoLogAppEventsEnabled" android:value="true" />

これで初期化ができ、実行することができた。
これはスタートガイドラインに記載した方がいいと思う。
と、ここまではKotlinはほぼ関係ない・・・:sweat_smile:

今回は、FacebookLoginButtonは使用しなかったので、以下の用に実装してみた。
それなりにKotlinっぽくなっている気がする。。。

AppLoginActivity.kt
private val fbCallback = CallbackManager.Factory.create()
// 以下の[loginFacebook]をクリックのListenerに登録しています
val loginFacebook : (v : View) -> Unit = {
    val fbInfo = SNSLoginUser.shared().fbInfo
    LoginManager.getInstance().apply {
        registerCallback(fbCallback, object:FacebookCallback<LoginResult> {
            override fun onSuccess(result: LoginResult?) {
                Log.e("INFO", "[Facebook Login Success]")
                // result?.accessToken?.token -> トークン
                // val fbProfile = Profile.getCurrentProfile() -> プロフィール情報
                // fbProfile.name -> ユーザー名(firstName/middleName/lastNameが一緒になったもの)
                // fbProfile.id -> result?.accessToken?.userIdと同じ
                // Profile.getCurrentProfile().getProfilePictureUri(300, 300).toString() -> プロフィール写真(今回は300x300のサイズで取得)
            }
            override fun onCancel() {
                Log.e("INFO", "[Facebook Login Cancel]")
            }
            override fun onError(error: FacebookException?) {
                Log.e("ERROR", "[Facebook Login Error]" + error.toString())
            }
        })
        logInWithReadPermissions(presentActivity, setOf("public_profile"))
        // 今回は"email"は不要だったので要求していない
    }
}

※上記に記載がない部分
onActivityResultにて結果を待ち、CallbackManager.onActivityResultを通してFacebookCallbackが呼ばれる

※FacebookSDKはiOSもAndroidも結構な頻度で更新は入っているので要注意です。更新履歴は見ておくことをオススメします。

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away