You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android使用CredentialManager实现Google登录时Selector UI启动失败

解决CredentialManager无法启动Google登录Selector UI的问题

问题根源

错误提示已经明确指出:必须使用基于Activity的上下文。你当前代码里用了getApplicationContext(),这是应用级全局上下文,无法用于启动需要界面交互的Selector UI——这类UI组件需要绑定到具体的Activity生命周期,依赖Activity的窗口环境才能正常显示。

修复步骤

直接把代码中两处使用getApplicationContext()的地方替换为当前的Activity实例:

  • 创建CredentialManager时,用MainActivity.this(lambda表达式里this指向点击事件的View,需显式指定Activity实例)
  • 调用getCredentialAsync()时,同样传入MainActivity.this作为上下文参数

修改后的完整代码

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button button = findViewById(R.id.clickme);
        button.setOnClickListener(v -> {
            // 替换为Activity上下文创建CredentialManager
            CredentialManager credentialManager = CredentialManager.create(MainActivity.this);

            GetGoogleIdOption googleIdOption = new GetGoogleIdOption.Builder()
                    .setFilterByAuthorizedAccounts(true)
                    .setServerClientId("clientID")
                    .build();

            GetCredentialRequest request = new GetCredentialRequest.Builder()
                    .addCredentialOption(googleIdOption)
                    .build();

            // 传入Activity上下文启动Selector UI
            credentialManager.getCredentialAsync(MainActivity.this, request, new CancellationSignal(),
                    Executors.newSingleThreadExecutor(),
                    new CredentialManagerCallback<GetCredentialResponse, GetCredentialException>() {
                        @Override
                        public void onResult(GetCredentialResponse getCredentialResponse) {
                            Log.d("onresult", "Happened");
                            // 若后续需处理UI操作,切换到主线程执行
                            runOnUiThread(() -> {
                                // 比如更新界面、跳转页面等
                            });
                        }

                        @Override
                        public void onError(@NonNull GetCredentialException e) {
                            Log.d("onerror", Objects.requireNonNull(e.getMessage()));
                            // 错误提示建议在主线程显示
                            runOnUiThread(() -> {
                                Toast.makeText(MainActivity.this, e.getMessage(), Toast.LENGTH_SHORT).show();
                            });
                        }
                    });
        });
    }
}

额外提示

如果回调中需要执行UI操作(比如显示Toast、更新界面),一定要通过runOnUiThread()切换到主线程——你当前用Executors.newSingleThreadExecutor()作为回调执行线程,非主线程无法操作UI。

内容的提问来源于stack exchange,提问作者gadmtb

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 02:13:26