问题描述
Android 应用使用 Google REST API 访问 Google 云端硬盘和日历。播放库提供的活动开始按预期登录工作,但相同的活动开始请求范围仅提供一个正常大小的视图,该视图应显示正在请求的范围,但除了永久循环进度条外是空白的。点击后退按钮会导致启动片段获得“活动取消”结果代码。
探查器显示针对登录和范围的权限请求 com.google.android.gms.auth.api.signin.internal.SignInHubActivity
已启动。登录正确绘制,用户可以登录。范围权限请求只是挂起。
测试应用的基本部分如下所示。登录和范围请求实际上比 GoogleSignIn.requestPermissions
便利方法暗示的更相似。下面从 requestScopesDirectly
派生的 GoogleSignIn.requestPermissions
方法显示了实际的等效性。
private fun initiateSignIn() {
val gsic = GoogleSignIn.getClient(requireActivity(),signInoptions)
val signInIntent = gsic.signInIntent
startActivityForResult(signInIntent,requestCodeSignIn)
}
private fun requestScopes() {
val sia = GoogleSignIn.getLastSignedInAccount(requireActivity())
if (sia != null) {
GoogleSignIn.requestPermissions(
this,requestCodeScopes,sia,Scope(DriveScopes.DRIVE_FILE)
)
}
}
private fun requestScopesDirectly() {
val act = requireActivity()
val gsia = GoogleSignIn.getLastSignedInAccount(act)
if (gsia != null) {
val sio = GoogleSignInoptions.Builder().let { b ->
b.requestScopes(Scope(DriveScopes.DRIVE_FILE))
b.setAccountName(gsia.email)
b.build()
}
val gsic = GoogleSignIn.getClient(act,sio)
val signInIntent = gsic.signInIntent
startActivityForResult(signInIntent,requestCodeScopes)
}
}
事实证明,很难调试为什么会发生这种情况。该行为不取决于请求的范围是否来自应用程序已“启用”的 API。如果范围请求仅包含已授予的范围,则启动的 Activity 不会显示 UI,但会按预期返回 OK。
如果由于某种原因不允许应用发出范围请求,那么至少应该返回一些错误指示。
如何进一步调试这个问题?
dependencies {
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
implementation 'androidx.core:core-ktx:1.3.2'
implementation 'androidx.appcompat:appcompat:1.2.0'
implementation 'com.google.android.material:material:1.2.1'
implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
implementation 'androidx.navigation:navigation-fragment-ktx:2.3.2'
implementation 'androidx.navigation:navigation-ui-ktx:2.3.2'
implementation 'com.google.android.gms:play-services-auth:19.0.0'
implementation 'com.google.api-client:google-api-client:1.31.2'
implementation 'com.google.api-client:google-api-client-android:1.31.2'
implementation 'com.google.apis:google-api-services-drive:v3-rev20201130-1.31.0'
implementation 'androidx.legacy:legacy-support-v4:1.0.0'
testImplementation 'junit:junit:4.+'
androidTestImplementation 'androidx.test.ext:junit:1.1.2'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
}
解决方法
通过转到项目、API 和服务的 Google Cloud Platform 控制台 -> OAuth 同意屏幕,并将发布状态从测试更改为生产中,我能够解决类似问题。