【问题标题】:Can't use FirebaseUI with fragments无法将 FirebaseUI 与片段一起使用
【发布时间】:2019-04-04 17:19:14
【问题描述】:

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

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

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

这是一些代码:

MainActivity.kt

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!

【问题讨论】:

标签: android firebase kotlin firebase-authentication firebaseui


【解决方案1】:

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

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

您可以从 Google 控制台获取您的 WEB 客户端 ID。选择您的项目,然后转到 API & Services > Credentials 并在 OAuth 2.0 客户端 ID 下找到一个名为 的 ID网络客户端。复制并用它替换上面的代码。

如果 Web Client ID 不存在,您可以点击 Create Credentials > OAuth client ID 然后选择 Web Application 作为应用程序在下一页输入并点击创建。

【讨论】:

    【解决方案2】:

    这是为了帮助那些与我有类似情况的人(更改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 文件,当然,我可能是错的,所以请随时纠正我。

    【讨论】:

      猜你喜欢
      • 2019-03-04
      • 2017-05-28
      • 2019-03-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-01
      • 2013-03-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多