facebook-android-sdk icon indicating copy to clipboard operation
facebook-android-sdk copied to clipboard

Crash FacebookSDK Validate.kt line 129

Open michaeltiket opened this issue 1 year ago • 9 comments

Checklist before submitting a bug report

Java version

11

Android version

variance

Android SDK version

14.1.1

Installation platform & version

Gradle

Package

Core & AppEvents

Goals

User not facing the crash

Expected results

User not facing the crash

Actual results

This was not happen when using facebook SDK is 11.2.0, only happen after update to 14.1.1 for supporting Android 12+ and adding client Token

I do not know how to reproduce as the crashlytic dashboard show early crash <1 Second. and there is no code reference to our codebase.

Fatal Exception: java.lang.RuntimeException: Unable to start activity ComponentInfo{com.tiket.gits/com.facebook.FacebookActivity}: The SDK has not been initialized, make sure to call FacebookSdk.sdkInitialize() first.
       at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3763)
       at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3931)
       at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85)
       at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
       at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2356)
       at android.os.Handler.dispatchMessage(Handler.java:106)
       at android.os.Looper.loop(Looper.java:264)
       at android.app.ActivityThread.main(ActivityThread.java:8315)
       at java.lang.reflect.Method.invoke(Method.java)
       at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:632)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1049)
Caused by com.facebook.FacebookSdkNotInitializedException: The SDK has not been initialized, make sure to call FacebookSdk.sdkInitialize() first.
       at com.facebook.internal.Validate.sdkInitialized(Validate.kt:129)
       at com.facebook.FacebookSdk.getApplicationId(FacebookSdk.kt:819)
       at com.facebook.login.LoginMethodHandler.getRedirectUrl(LoginMethodHandler.kt:83)
       at com.facebook.login.CustomTabLoginMethodHandler.getDeveloperDefinedRedirectURI(CustomTabLoginMethodHandler.kt:65)
       at com.facebook.login.CustomTabLoginMethodHandler.<init>(CustomTabLoginMethodHandler.kt:208)
       at com.facebook.login.CustomTabLoginMethodHandler$Companion$CREATOR$1.createFromParcel(CustomTabLoginMethodHandler.kt:226)
       at com.facebook.login.CustomTabLoginMethodHandler$Companion$CREATOR$1.createFromParcel(CustomTabLoginMethodHandler.kt:224)
       at android.os.Parcel.readParcelable(Parcel.java:3298)
       at android.os.Parcel.readParcelableArray(Parcel.java:3415)
       at com.facebook.login.LoginClient.<init>(LoginClient.kt:666)
       at com.facebook.login.LoginClient$Companion$CREATOR$1.createFromParcel(LoginClient.kt:707)
       at com.facebook.login.LoginClient$Companion$CREATOR$1.createFromParcel(LoginClient.kt:705)
       at android.os.Parcel.readParcelable(Parcel.java:3298)
       at android.os.Parcel.readValue(Parcel.java:3191)
       at android.os.Parcel.readArrayMapInternal(Parcel.java:3584)
       at android.os.BaseBundle.initializeFromParcelLocked(BaseBundle.java:296)
       at android.os.BaseBundle.unparcel(BaseBundle.java:240)
       at android.os.Bundle.getSparseParcelableArray(Bundle.java:1079)
       at androidx.fragment.app.FragmentStateManager.restoreState(FragmentStateManager.java:405)
       at androidx.fragment.app.FragmentManager.restoreSaveState(FragmentManager.java:2735)
       at androidx.fragment.app.FragmentController.restoreSaveState(FragmentController.java:198)
       at androidx.fragment.app.FragmentActivity$2.onContextAvailable(FragmentActivity.java:149)
       at androidx.activity.contextaware.ContextAwareHelper.dispatchOnContextAvailable(ContextAwareHelper.java:99)
       at androidx.activity.ComponentActivity.onCreate(ComponentActivity.java:322)
       at androidx.fragment.app.FragmentActivity.onCreate(FragmentActivity.java:273)
       at com.facebook.FacebookActivity.onCreate(FacebookActivity.kt:58)
       at android.app.Activity.performCreate(Activity.java:8151)
       at android.app.Activity.performCreate(Activity.java:8135)
       at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1309)
       at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3732)
       at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3931)
       at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85)
       at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
       at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2356)
       at android.os.Handler.dispatchMessage(Handler.java:106)
       at android.os.Looper.loop(Looper.java:264)
       at android.app.ActivityThread.main(ActivityThread.java:8315)
       at java.lang.reflect.Method.invoke(Method.java)
       at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:632)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1049)

Steps to reproduce

Update Facebook SDK to 14.1.1

Code samples & details

class FacebookAuthImpl(context: Context) : LifecycleObserver, FacebookAuth {

    companion object {
        @Synchronized
        fun initializeSdkIfNeeded(context: Context) {
            if (!FacebookSdk.isInitialized()) {
                FacebookSdk.setClientToken(BuildConfig.FB_CLIENT_ID)
                FacebookSdk.sdkInitialize(context)
            }
        }
    }

    init {
        initializeSdkIfNeeded(context.applicationContext)
    }

    private var mSocialAuthCallback: SocialAuthCallback? = null
    private var fbAuthIntentResult: ActivityResultLauncher<Collection<String>>? = null
    private val facebookCallbackManager by lazy { CallbackManager.Factory.create() }
    private val loginManager by lazy { LoginManager.getInstance() }

    override fun login(fragment: Fragment) {
        val context = fragment.context ?: return
        initializeSdkIfNeeded(context.applicationContext)
        fbAuthIntentResult?.launch(listOf("email", "public_profile"))
    }

    override fun login(activity: Activity) {
        initializeSdkIfNeeded(activity.applicationContext)
        fbAuthIntentResult?.launch(listOf("email", "public_profile"))
    }

    override fun logout() {
        AccessToken.getCurrentAccessToken()?.let {
            LoginManager.getInstance().logOut()
        }
    }

    private fun registerFacebookCallback() {
        loginManager.registerCallback(facebookCallbackManager, object : FacebookCallback<LoginResult> {
            override fun onSuccess(result: LoginResult) {
                val successResult = SocialAuthResult.Facebook(
                    _token = result.accessToken.token
                )
                mSocialAuthCallback?.onSocialAuthSuccess(successResult)
            }

            override fun onCancel() {
                mSocialAuthCallback?.onSocialAuthCancel()
            }

            override fun onError(error: FacebookException) {
                mSocialAuthCallback?.onSocialAuthFail(
                    SocialAuthErrorResult.LoginError(
                        SocialAuthErrorResult.AUTH_SOURCE_FACEBOOK,
                        error.localizedMessage.orEmpty()
                    )
                )
            }
        })
    }

    override fun setup(fragmentActivity: FragmentActivity, socialAuthCallback: SocialAuthCallback) {
        mSocialAuthCallback = socialAuthCallback
        fbAuthIntentResult = fragmentActivity.registerForActivityResult(
            loginManager.createLogInActivityResultContract(facebookCallbackManager)
        ) {
        }
        registerFacebookCallback()
        registerLifecycleOwner(fragmentActivity)
    }

    override fun setup(fragment: Fragment, socialAuthCallback: SocialAuthCallback) {
        mSocialAuthCallback = socialAuthCallback
        fbAuthIntentResult = fragment.registerForActivityResult(
            loginManager.createLogInActivityResultContract(facebookCallbackManager)
        ) {
        }
        registerFacebookCallback()
        registerLifecycleOwner(fragment)
    }

    private fun registerLifecycleOwner(lifecycleOwner: LifecycleOwner) {
        if (lifecycleOwner.lifecycle.currentState == Lifecycle.State.DESTROYED) {
            resetCallback()
            return
        }
        lifecycleOwner.lifecycle.removeObserver(this)
        lifecycleOwner.lifecycle.addObserver(this)
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
    fun resetCallback() {
        fbAuthIntentResult = null
        mSocialAuthCallback = null
    }
}

michaeltiket avatar Jan 09 '23 07:01 michaeltiket