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
相关产品推荐
相关产品推荐

