无法将FirebaseUI与片段一起使用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了无法将FirebaseUI与片段一起使用相关的知识,希望对你有一定的参考价值。

我正在尝试将FirebaseAuth UI应用到我的应用中,但我遇到了一些问题。

我正在尝试将FirebaseUIActivity.kt创建为片段,但是当我调用支持片段管理器时它会崩溃。

  supportFragmentManager.beginTransaction().replace(R.id.fragment_container, FirebaseUIActivity.newInstance()).commit()

这是一些代码:

我激活了。

class MainActivity : AppCompatActivity() {

private lateinit var binding: ActivityMainBinding

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)

    binding = DataBindingUtil.setContentView(this, R.layout.activity_main)

    // Support toolbar
    setSupportActionBar(binding.toolbar)

    supportFragmentManager.beginTransaction().replace(R.id.fragment_container, FirebaseUIActivity.newInstance()).commit()
    }

}

FirebaseUiActivity.kt

class FirebaseUIActivity : Fragment() {
// Choose authentication providers

companion object {
    fun newInstance() = FirebaseUIActivity()
}

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
}

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
    val binding: FirebaseUiFragmentBinding = DataBindingUtil.inflate(inflater, R.layout.firebase_ui_fragment, container, false)

    return binding.root

}

override fun onResume() {
    super.onResume()
}
private val providers = arrayListOf(
    AuthUI.IdpConfig.EmailBuilder().build(),
    AuthUI.IdpConfig.GoogleBuilder().build()
)

override fun startActivityForResult(intent: Intent?, requestCode: Int) {
    super.startActivityForResult(intent, requestCode)

    AuthUI.getInstance().createSignInIntentBuilder()
        .setAvailableProviders(providers)
        .build()

    }
}

错误:

     Caused by: java.lang.IllegalStateException: Check your google-services plugin configuration, the default_web_client_id string wasn't populated.
    at com.firebase.ui.auth.util.Preconditions.checkConfigured(Preconditions.java:90)
    at com.firebase.ui.auth.AuthUI$IdpConfig$GoogleBuilder.<init>(AuthUI.java:957)
    at com.example.katzinbetihot.Firebase.FirebaseUIActivity.<init>(FirebaseUIActivity.kt:40)
    at com.example.katzinbetihot.Firebase.FirebaseUIActivity$Companion.newInstance(FirebaseUIActivity.kt:21)
    at com.example.katzinbetihot.main.MainActivity.onCreate(MainActivity.kt:24)
    at android.app.Activity.performCreate(Activity.java:7149)
    at android.app.Activity.performCreate(Activity.java:7140)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1288)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3031)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3191) 
    at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78) 
    at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108) 
    at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1920) 
    at android.os.Handler.dispatchMessage(Handler.java:106) 
    at android.os.Looper.loop(Looper.java:193) 
    at android.app.ActivityThread.main(ActivityThread.java:6912) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:537) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858) 

感谢你的帮助,Emek!

答案

尝试将此代码行添加到strings.xml文件中

<string name="default_web_client_id" translatable="false">webClientId.apps.googleusercontent.com</string>

您可以从Google控制台获取WEB客户端ID。选择您的项目,然后转到API和服务>凭据,在OAuth 2.0客户端ID下,您将找到名为Web Client的ID。用它复制并替换上面的代码。

如果Web客户端ID不存在,则可以单击“创建凭据”>“OAuth客户端ID”,然后在下一页上选择“Web应用程序”作为应用程序类型,然后单击“创建”。

另一答案

这是为了帮助那些有类似情况的人(更改google-services.json并启动此错误)

TL; DR:将旧版本与新版本进行比较,并将Web客户端ID部分(可在GCP控制台中找到)添加到新文件的oauth-client部分。

我遇到了同样的问题,但是直到最近我用新的google-services.json更新我的代码时,它工作了很长时间。我恢复到旧版本的google-services.json文件,它的工作原理。

所以我检查了两个版本之间的区别,它们只是略有不同。按照@ Totoo的回答,我进入了我的GCP控制台并获得了我的Web客户端ID(称为“Web客户端(由Google服务自动创建)”),我在两个版本的google-services.json文件中搜索了ID,并且它存在于两个文件中在services/appinvite_service/other_platform_oauth_client部分下,但只存在于文件的旧(工作)版本的oauth_client部分下。那部分看起来像这样:

"oauth_client": [
    ...,
    {
         "client_id": "CLIENT_ID (ends with apps.googleusercontent.com)",
         "client_type": 3
    }
]

所以,我将这部分添加到google-services.json文件的新版本中并且它有效。

我只更改了Firebase控制台中的签名SHA签名(这是我去的第一个位置并下载了该文件的新版本的原因),所以我怀疑这是Firebase的一些错误,他们生成了google-services.json文件当然,我可能是错的,所以请随意纠正我。

以上是关于无法将FirebaseUI与片段一起使用的主要内容,如果未能解决你的问题,请参考以下文章

Android:将 savedInstanceState 与片段一起使用

将 FirebaseUI 与 Twitter 登录一起使用(iOS 应用)

片段 - 如何将它们与需要操作的活动一起使用?

将 GraphQL 片段与 Apollo Hooks 一起使用时出错

将 FirebaseUI 与 AngularFire2 一起使用

片段内的片段不能与 ScrollView 一起使用