Google 迁移到 androidx 的身份验证:SignInHubActivity 未实现生命周期
Google Auth migrating to androidx: SignInHubActivity does not implement Lifecycle
迁移到 AndroidX 后,我面临 Google Auth 库的以下问题:
在 Android 9 API 28:
java.lang.IncompatibleClassChangeError: Class 'com.google.android.gms.auth.api.signin.internal.SignInHubActivity' does not implement interface 'androidx.lifecycle.LifecycleOwner' in call to 'androidx.lifecycle.Lifecycle androidx.lifecycle.LifecycleOwner.getLifecycle()' (declaration of 'androidx.lifecycle.LiveData' appears in /data/app/fourbottles.bsg.workinghours4b-G1onPKgFFE-l3aqjx0qDJw==/split_lib_dependencies_apk.apk)
at androidx.lifecycle.LiveData.observe(LiveData.java:172)
at androidx.loader.app.LoaderManagerImpl$LoaderInfo.setCallback(LoaderManagerImpl.java:100)
at androidx.loader.app.LoaderManagerImpl.createAndInstallLoader(LoaderManagerImpl.java:400)
at androidx.loader.app.LoaderManagerImpl.initLoader(LoaderManagerImpl.java:421)
at com.google.android.gms.auth.api.signin.internal.SignInHubActivity.zzn(Unknown Source:80)
at com.google.android.gms.auth.api.signin.internal.SignInHubActivity.onActivityResult(Unknown Source:68)
at android.app.Activity.dispatchActivityResult(Activity.java:7454)
at android.app.ActivityThread.deliverResults(ActivityThread.java:4353)
at android.app.ActivityThread.handleSendResult(ActivityThread.java:4402)
at android.app.servertransaction.ActivityResultItem.execute(ActivityResultItem.java:49)
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:1808)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6669)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
上 Android 5.0.2 API 22
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'androidx.lifecycle.Lifecycle$State androidx.lifecycle.Lifecycle.getCurrentState()' on a null object reference
at androidx.lifecycle.LiveData.observe(LiveData.java:172)
at androidx.loader.app.LoaderManagerImpl$LoaderInfo.setCallback(LoaderManagerImpl.java:100)
at androidx.loader.app.LoaderManagerImpl.createAndInstallLoader(LoaderManagerImpl.java:400)
at androidx.loader.app.LoaderManagerImpl.initLoader(LoaderManagerImpl.java:421)
at com.google.android.gms.auth.api.signin.internal.SignInHubActivity.zzn(Unknown Source)
at com.google.android.gms.auth.api.signin.internal.SignInHubActivity.onActivityResult(Unknown Source)
at android.app.Activity.dispatchActivityResult(Activity.java:6139)
at android.app.ActivityThread.deliverResults(ActivityThread.java:3535)
at android.app.ActivityThread.handleSendResult(ActivityThread.java:3582)
at android.app.ActivityThread.access00(ActivityThread.java:144)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1327)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5221)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
我正在使用以下库版本:
implementation 'com.google.android.gms:play-services-gcm:16.0.0'
implementation 'com.google.android.gms:play-services-auth:16.0.1'
implementation 'androidx.appcompat:appcompat:1.0.2'
implementation 'androidx.multidex:multidex:2.0.1'
我一开始 activity 的目的是:
,代码就崩溃了
val signInIntent = Auth.GoogleSignInApi.getSignInIntent(googleApiClient)
startActivityForResult(signInIntent, LOGIN_WITH_GOOGLE_CODE)
我在 settings.gradle 文件中添加了以下属性:
android.useAndroidX=true
android.enableJetifier=true
Google Auth 库不支持使用 AndroidX 库进行身份验证?
有没有办法从具有受支持的库行为的 androidX 库启动意图?
我接受 java 和 kotlin 语言的答案。
更新 1:27.12.2017
Google api 客户端创建:
GoogleSignInOptions googleSignInOptions = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestIdToken(getString(R.string.default_web_client_id))
.requestEmail()
.build();
googleApiClient = new GoogleApiClient.Builder(this)
.enableAutoManage(this, this)
.addApi(Auth.GOOGLE_SIGN_IN_API, googleSignInOptions)
.build();
可能是因为 enableAutoManage
?
更新 2:28.12.2018
我使用以下代码成功登录:
Task<GoogleSignInAccount> sign = googleSignInClient.silentSignIn();
GoogleSignInAccount result = sign.getResult();
所以我认为凭据或其他配置文件没有问题。这样用户将无法选择帐户。
我认为 Jetifier 以同样的方式失败。
使用 API 27 我遇到了同样的错误。
我通过将此依赖项添加到我的 gradle:
解决了这个问题
implementation 'androidx.arch.core:core-runtime:2.0.1-alpha01'
编辑
这些是我用过的版本:
应用级别gradle compileSdkVersion = 28, buildToolsVersion = "28.0.3"
:
implementation "com.google.android.gms:play-services-auth:16.0.1"
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
implementation 'androidx.vectordrawable:vectordrawable:1.0.1'
implementation 'androidx.arch.core:core-runtime:2.0.1-alpha01'
所有com.android.support库的版本为:28.0.0
项目级别gradle:
classpath 'com.android.tools.build:gradle:3.3.0'
classpath 'com.google.gms:google-services:4.2.0'
注意 1:如果您有以下行,请尝试在没有它的情况下构建:
implementation "androidx.legacy:legacy-support-v4:1.0.0"
注 2:如果您使用 Android Studio 3.3 构建(我写此答案时的最新版本)
尝试迁移到 androidX 时出现这些错误:
WARNING: API 'variant.getJavaCompiler()' is obsolete and has been
replaced with 'variant.getJavaCompileProvider()'. It will be removed
at the end of 2019. For more information, see
https://d.android.com/r/tools/task-configuration-avoidance. To
determine what is calling variant.getJavaCompiler(), use
-Pandroid.debug.obsoleteApi=true on the command line to display a stack trace. Affected Modules: app
我无法修复它,但 运行 存在此错误的项目令人惊讶地工作。
在找到修复程序或更新库之前,我找到了解决方法:
Task<GoogleSignInAccount> sign = googleSignInClient.silentSignIn();
if(sign.isSuccessful())
{
GoogleSignInAccount resultAccount = sign.getResult();
handleGoogleLogin(resultAccount);
}else
{
Intent signInIntent = googleSignInClient.getSignInIntent();
startActivityForResult(signInIntent, GOOGLE_SIGN_IN_CODE);
}
代码尝试静默登录,如果用户不允许登录,将启动意图。在我的情况下,意图让我选择帐户并在点击该帐户后崩溃。第一次点击后,静默登录将生效。
同样的问题!我刚刚添加了 "core" 依赖项并将 "appcompat" 提升到最新的 alpha 版本并且它有所帮助。
dependencies {
implementation "androidx.core:core:1.1.0-alpha03"
implementation "androidx.legacy:legacy-support-v4:1.0.0"
implementation "androidx.annotation:annotation:1.0.1"
implementation "androidx.recyclerview:recyclerview:1.1.0-alpha01"
implementation "androidx.appcompat:appcompat:1.1.0-alpha01"
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
implementation "androidx.cardview:cardview:1.0.0"
implementation "com.google.android.material:material:1.1.0-alpha02"
implementation "com.google.firebase:firebase-core:16.0.6"
implementation "com.google.firebase:firebase-auth:16.1.0"
implementation "com.google.firebase:firebase-storage:16.0.5"
implementation "com.google.firebase:firebase-perf:16.2.3"
implementation 'com.firebaseui:firebase-ui-database:4.3.0'
implementation "com.google.android.gms:play-services-auth:16.0.1"
implementation "com.google.android.gms:play-services-location:16.0.0"
implementation "com.google.android.gms:play-services-maps:16.0.0"
...
}
我用:
compileSdkVersion 28
buildToolsVersion "28.0.3"
置顶gradle.build:
dependencies {
classpath 'com.android.tools.build:gradle:3.3.0'
classpath 'com.google.gms:google-services:4.2.0'
...
}
gradle.properties:
android.debug.obsoleteApi=true
android.enableR8 = true
android.useAndroidX=true
android.enableJetifier=true
gradle 包装器的 gradle 版本设置为 gradle-4.10.1-all.zip。我还尝试 Invalidate/restart 我的 AS 3.3。希望它能帮助别人。
我使用最新版本的 appcompat 库解决了这个问题:
implementation "androidx.appcompat:appcompat:1.1.0-rc01"
在以前的版本中,class AppCompatActivity 没有实现 LifecycleOwner 接口,因此导致您观察到的错误。
我有同样的问题。我通过更改以下 depedency
来修复它
implementation 'androidx.core:core-ktx:1.1.0-alpha05'
至
implementation 'androidx.core:core-ktx:1.0.1'
所以基本上我现在使用的是稳定版。
最新更新:
android.core:1.2.0-alpha02 在 ComponentActivity.getLifeCycle()
中仍然没有那个方法
我更新到最新版本 android.core:
dependencies {
// ...
def core_version = "1.2.0-alpha04"
implementation "androidx.core:core:$core_version"
implementation "androidx.core:core-ktx:$core_version"
}
最新版本可以在
https://developer.android.com/jetpack/androidx/releases/core
迁移到 AndroidX 后,我面临 Google Auth 库的以下问题:
在 Android 9 API 28:
java.lang.IncompatibleClassChangeError: Class 'com.google.android.gms.auth.api.signin.internal.SignInHubActivity' does not implement interface 'androidx.lifecycle.LifecycleOwner' in call to 'androidx.lifecycle.Lifecycle androidx.lifecycle.LifecycleOwner.getLifecycle()' (declaration of 'androidx.lifecycle.LiveData' appears in /data/app/fourbottles.bsg.workinghours4b-G1onPKgFFE-l3aqjx0qDJw==/split_lib_dependencies_apk.apk)
at androidx.lifecycle.LiveData.observe(LiveData.java:172)
at androidx.loader.app.LoaderManagerImpl$LoaderInfo.setCallback(LoaderManagerImpl.java:100)
at androidx.loader.app.LoaderManagerImpl.createAndInstallLoader(LoaderManagerImpl.java:400)
at androidx.loader.app.LoaderManagerImpl.initLoader(LoaderManagerImpl.java:421)
at com.google.android.gms.auth.api.signin.internal.SignInHubActivity.zzn(Unknown Source:80)
at com.google.android.gms.auth.api.signin.internal.SignInHubActivity.onActivityResult(Unknown Source:68)
at android.app.Activity.dispatchActivityResult(Activity.java:7454)
at android.app.ActivityThread.deliverResults(ActivityThread.java:4353)
at android.app.ActivityThread.handleSendResult(ActivityThread.java:4402)
at android.app.servertransaction.ActivityResultItem.execute(ActivityResultItem.java:49)
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:1808)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6669)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
上 Android 5.0.2 API 22
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'androidx.lifecycle.Lifecycle$State androidx.lifecycle.Lifecycle.getCurrentState()' on a null object reference
at androidx.lifecycle.LiveData.observe(LiveData.java:172)
at androidx.loader.app.LoaderManagerImpl$LoaderInfo.setCallback(LoaderManagerImpl.java:100)
at androidx.loader.app.LoaderManagerImpl.createAndInstallLoader(LoaderManagerImpl.java:400)
at androidx.loader.app.LoaderManagerImpl.initLoader(LoaderManagerImpl.java:421)
at com.google.android.gms.auth.api.signin.internal.SignInHubActivity.zzn(Unknown Source)
at com.google.android.gms.auth.api.signin.internal.SignInHubActivity.onActivityResult(Unknown Source)
at android.app.Activity.dispatchActivityResult(Activity.java:6139)
at android.app.ActivityThread.deliverResults(ActivityThread.java:3535)
at android.app.ActivityThread.handleSendResult(ActivityThread.java:3582)
at android.app.ActivityThread.access00(ActivityThread.java:144)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1327)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5221)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
我正在使用以下库版本:
implementation 'com.google.android.gms:play-services-gcm:16.0.0'
implementation 'com.google.android.gms:play-services-auth:16.0.1'
implementation 'androidx.appcompat:appcompat:1.0.2'
implementation 'androidx.multidex:multidex:2.0.1'
我一开始 activity 的目的是:
,代码就崩溃了val signInIntent = Auth.GoogleSignInApi.getSignInIntent(googleApiClient)
startActivityForResult(signInIntent, LOGIN_WITH_GOOGLE_CODE)
我在 settings.gradle 文件中添加了以下属性:
android.useAndroidX=true
android.enableJetifier=true
Google Auth 库不支持使用 AndroidX 库进行身份验证?
有没有办法从具有受支持的库行为的 androidX 库启动意图?
我接受 java 和 kotlin 语言的答案。
更新 1:27.12.2017
Google api 客户端创建:
GoogleSignInOptions googleSignInOptions = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestIdToken(getString(R.string.default_web_client_id))
.requestEmail()
.build();
googleApiClient = new GoogleApiClient.Builder(this)
.enableAutoManage(this, this)
.addApi(Auth.GOOGLE_SIGN_IN_API, googleSignInOptions)
.build();
可能是因为 enableAutoManage
?
更新 2:28.12.2018
我使用以下代码成功登录:
Task<GoogleSignInAccount> sign = googleSignInClient.silentSignIn();
GoogleSignInAccount result = sign.getResult();
所以我认为凭据或其他配置文件没有问题。这样用户将无法选择帐户。
我认为 Jetifier 以同样的方式失败。
使用 API 27 我遇到了同样的错误。
我通过将此依赖项添加到我的 gradle:
解决了这个问题implementation 'androidx.arch.core:core-runtime:2.0.1-alpha01'
编辑
这些是我用过的版本:
应用级别gradle
compileSdkVersion = 28, buildToolsVersion = "28.0.3"
:implementation "com.google.android.gms:play-services-auth:16.0.1" implementation 'androidx.constraintlayout:constraintlayout:1.1.3' implementation 'androidx.vectordrawable:vectordrawable:1.0.1' implementation 'androidx.arch.core:core-runtime:2.0.1-alpha01'
所有com.android.support库的版本为:28.0.0
项目级别gradle:
classpath 'com.android.tools.build:gradle:3.3.0' classpath 'com.google.gms:google-services:4.2.0'
注意 1:如果您有以下行,请尝试在没有它的情况下构建:
implementation "androidx.legacy:legacy-support-v4:1.0.0"
注 2:如果您使用 Android Studio 3.3 构建(我写此答案时的最新版本) 尝试迁移到 androidX 时出现这些错误:
WARNING: API 'variant.getJavaCompiler()' is obsolete and has been replaced with 'variant.getJavaCompileProvider()'. It will be removed at the end of 2019. For more information, see https://d.android.com/r/tools/task-configuration-avoidance. To determine what is calling variant.getJavaCompiler(), use -Pandroid.debug.obsoleteApi=true on the command line to display a stack trace. Affected Modules: app
我无法修复它,但 运行 存在此错误的项目令人惊讶地工作。
在找到修复程序或更新库之前,我找到了解决方法:
Task<GoogleSignInAccount> sign = googleSignInClient.silentSignIn();
if(sign.isSuccessful())
{
GoogleSignInAccount resultAccount = sign.getResult();
handleGoogleLogin(resultAccount);
}else
{
Intent signInIntent = googleSignInClient.getSignInIntent();
startActivityForResult(signInIntent, GOOGLE_SIGN_IN_CODE);
}
代码尝试静默登录,如果用户不允许登录,将启动意图。在我的情况下,意图让我选择帐户并在点击该帐户后崩溃。第一次点击后,静默登录将生效。
同样的问题!我刚刚添加了 "core" 依赖项并将 "appcompat" 提升到最新的 alpha 版本并且它有所帮助。
dependencies {
implementation "androidx.core:core:1.1.0-alpha03"
implementation "androidx.legacy:legacy-support-v4:1.0.0"
implementation "androidx.annotation:annotation:1.0.1"
implementation "androidx.recyclerview:recyclerview:1.1.0-alpha01"
implementation "androidx.appcompat:appcompat:1.1.0-alpha01"
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
implementation "androidx.cardview:cardview:1.0.0"
implementation "com.google.android.material:material:1.1.0-alpha02"
implementation "com.google.firebase:firebase-core:16.0.6"
implementation "com.google.firebase:firebase-auth:16.1.0"
implementation "com.google.firebase:firebase-storage:16.0.5"
implementation "com.google.firebase:firebase-perf:16.2.3"
implementation 'com.firebaseui:firebase-ui-database:4.3.0'
implementation "com.google.android.gms:play-services-auth:16.0.1"
implementation "com.google.android.gms:play-services-location:16.0.0"
implementation "com.google.android.gms:play-services-maps:16.0.0"
...
}
我用:
compileSdkVersion 28
buildToolsVersion "28.0.3"
置顶gradle.build:
dependencies {
classpath 'com.android.tools.build:gradle:3.3.0'
classpath 'com.google.gms:google-services:4.2.0'
...
}
gradle.properties:
android.debug.obsoleteApi=true
android.enableR8 = true
android.useAndroidX=true
android.enableJetifier=true
gradle 包装器的 gradle 版本设置为 gradle-4.10.1-all.zip。我还尝试 Invalidate/restart 我的 AS 3.3。希望它能帮助别人。
我使用最新版本的 appcompat 库解决了这个问题:
implementation "androidx.appcompat:appcompat:1.1.0-rc01"
在以前的版本中,class AppCompatActivity 没有实现 LifecycleOwner 接口,因此导致您观察到的错误。
我有同样的问题。我通过更改以下 depedency
来修复它implementation 'androidx.core:core-ktx:1.1.0-alpha05'
至
implementation 'androidx.core:core-ktx:1.0.1'
所以基本上我现在使用的是稳定版。
最新更新: android.core:1.2.0-alpha02 在 ComponentActivity.getLifeCycle()
中仍然没有那个方法我更新到最新版本 android.core:
dependencies {
// ...
def core_version = "1.2.0-alpha04"
implementation "androidx.core:core:$core_version"
implementation "androidx.core:core-ktx:$core_version"
}
最新版本可以在 https://developer.android.com/jetpack/androidx/releases/core