微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

请求范围时,Android SignInHubActivity 挂起并显示空白视图,但进度条除外

如何解决请求范围时,Android SignInHubActivity 挂起并显示空白视图,但进度条除外

Android 应用使用 Google REST API 访问 Google 云端硬盘和日历。播放库提供的活动开始按预期登录工作,但相同的活动开始请求范围仅提供一个正常大小的视图,该视图应显示正在请求的范围,但除了永久循环进度条外是空白的。点击后退按钮会导致启动片段获得“活动取消”结果代码

Hanging Scope Request

探查器显示针对登录和范围的权限请求 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 同意屏幕,并将发布状态从测试更改为生产中,我能够解决类似问题。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。