简体   繁体   English

Android Facebook登录,onActivityResult中callbackManager尚未初始化

[英]Android Facebook login, callbackManager has not been initialized in onActivityResult

I followed the documentation on Facebook API.我遵循了 Facebook API 上的文档。 There was little description about fragment.关于片段的描述很少。

How to solved this error...?如何解决此错误...?

I tried in fragment, [btnFacebook.setFragment(this)]我在片段中尝试过,[btnFacebook.setFragment(this)]

in Activity, [ProfileFragment().onActivityResult(requestCode, resultCode, data)]在 Activity 中,[ProfileFragment().onActivityResult(requestCode, resultCode, data)]

class ProfileFragment : BaseFragment() {
    private lateinit var profileViewModel: ProfileViewModel
    val RC_SIGN_IN = 9001
    val TAG = "@@@ ProfileF"
    lateinit var callbackManager: CallbackManager
    lateinit var firebaseAuth: FirebaseAuth
    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        profileViewModel = ViewModelProviders.of(this).get(ProfileViewModel::class.java)
        val root = inflater.inflate(R.layout.fragment_profile, container, false)
        firebaseAuth = FirebaseAuth.getInstance()
        callbackManager = CallbackManager.Factory.create()
        var btnFacebook = root.findViewById<com.facebook.login.widget.LoginButton>(R.id.btn_profile_facebook)
        btnFacebook.setFragment(this)
        initFacebook(btnFacebook)
        return root
    }
    private fun initFacebook(btnFacebook: LoginButton) {
        btnFacebook.setPermissions("email", "public_profile")
        btnFacebook.registerCallback(callbackManager, object : FacebookCallback<LoginResult> {
            override fun onSuccess(result: LoginResult?) {
                Log.d(TAG, "facebook:onSuccess: $result")
                handleFacebookAccessToken(result!!.accessToken)
            }
            override fun onCancel() {
                Log.d(TAG, "facebook:onCancel...")
            }
            override fun onError(error: FacebookException?) {
                Log.d(TAG, "facebook:onError...${error.toString()}")
            }
        })
    }
    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        callbackManager.onActivityResult(requestCode, resultCode, data)
    }
    private fun handleFacebookAccessToken(token: AccessToken) {
        Log.d(TAG, "handleFacebookAccessToken: $token")
        val credential = FacebookAuthProvider.getCredential(token.getToken());
        firebaseAuth.signInWithCredential(credential)
            .addOnCompleteListener(activity as MainActivity, object : OnCompleteListener<AuthResult> {
                override fun onComplete(task: Task<AuthResult>) {
                    if (task.isSuccessful()) {
                        // 로그인 성공
                        Log.d(TAG, "Facebook Login Success!!!")
                    } else {
                        // 로그인 실패
                        Log.d(TAG, "Facebook Login Fail...")
                    }
                }
            })
    }
}
class MainActivity : BaseActivity() {
    val TAG = "@@@ Main"
    val mContext = this
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        val navView: BottomNavigationView = findViewById(R.id.nav_view)
        val navController = findNavController(R.id.nav_host_fragment)
        navView.setupWithNavController(navController)
    }
    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        Log.d(TAG, "onActivityResult!!! ${requestCode} / ${resultCode} ")
        ProfileFragment().onActivityResult(requestCode, resultCode, data)
    }
}

Caused by: kotlin.UninitializedPropertyAccessException: lateinit property callbackManager has not been initialized引起:kotlin.UninitializedPropertyAccessException:lateinit 属性 callbackManager 尚未初始化

In your main activity's onActivityResult method, you are sending result to newly created ProfileFragment() , not to the already attached fragment.在您的主要活动的 onActivityResult 方法中,您将结果发送到新创建的ProfileFragment() ,而不是发送到已附加的片段。

So do below modification in MainActivity's onActivityResult method.因此在 MainActivity 的onActivityResult方法中进行以下修改。

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
   val navHostFragment = supportFragmentManager.findFragmentById(R.id.nav_host_fragment)
    val currFragment = navHostFragment?.childFragmentManager?.fragments?.get(0)
    if (currFragment is HomeFragment) {
        currFragment.onActivityResult(requestCode, resultCode, data)
    }
   super.onActivityResult(requestCode, resultCode, data)
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 Android Facebook登录onActivityResult - Android Facebook Login onActivityResult 如何在不推荐使用 onActivityResult 的情况下使用 Facebook 登录 CallbackManager? - How to use Facebook Sign in CallbackManager with onActivityResult deprecated? 为什么在使用Facebook登录按钮调用CallbackManager上的onActivityResult()后绝对没有任何反应? - Why absolutely nothing happens after calling onActivityResult() on the CallbackManager using the Facebook Login Button? Facebook登录CallbackManager没有调用FacebookCallback? - Facebook Login CallbackManager FacebookCallback not called? Facebook callbackManager 方法 onActivityResult 未在 Fragment onActivityResult 方法中调用 - Facebook callbackManager method onActivityResult not calling in Fragment onActivityResult method 在Android中使用Facebook登录时未调用onActivityResult - onActivityResult is not calling while using facebook login in android 获取意外的CallbackManager,在facebook集成android - Getting Unexpected CallbackManager, in facebook integration android Facebook登录CallbackManager FacebookCallback每次调用onCancel() - Facebook Login CallbackManager FacebookCallback called onCancel() every time Lateinit 属性尚未初始化(Android、Kotlin) - Lateinit property has not been initialized (Android, Kotlin) 检查Android MediaPlayer是否已初始化 - Check if Android MediaPlayer has been initialized
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM