GoogleAccountCredential setSelectedAccountName 但仍然为空

GoogleAccountCredential setSelectedAccountName but still null

账户名设置后还是空

我已经看到 ,但我确实在清单中拥有 GET_ACCOUNTS 权限,并且在 运行 时得到了保护。

以下设置正在 运行 Pixel XL 模拟器 API 25 (Android 7.1.1)。

清单

<uses-permission android:name="android.permission.GET_ACCOUNTS" />

Activity

private void queryAPI() {
    if (mCredential.getSelectedAccountName() == null) {
        if (checkSelfPermission(Manifest.permission.GET_ACCOUNTS) != PackageManager.PERMISSION_GRANTED) {
            requestPermissions(new String[] {Manifest.permission.GET_ACCOUNTS}, RCP_AUTH_CRED);
            return;
        }

        mCredential.setSelectedAccountName("test@gmail.com");
        Log.d(TAG, "queryAPI: account name " + mCredential.getSelectedAccountName());
    }
}

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    switch (requestCode) {
        case RCP_AUTH_CRED:
            if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                queryAPI();
            } else {
                Log.d(TAG, "onRequestPermissionsResult: " + Integer.toString(grantResults[0]));
            }
            break;
    }
}

Logcat

04-18 21:26:47.590 2700-2700/com.package D/MainActivity: queryAPI: account name null

这个 google 帐户 "test@gmail.com" 是在设备帐户中设置的吗?

首先,您需要设置要在您的应用中使用的 google 帐户,方法是在您正在测试它的设备上转到设置/帐户/添加帐户。仅传递帐户名是不够的,该帐户必须存在于设备上。

如果用户需要 google 帐户才能使用您的应用,您可以通过使用 newChooseAccountIntent( ) 方法。

使用 setSelectedAccount() 而不是 setSelectedAccountName()。

 mCredential = GoogleAccountCredential.usingOAuth2(
                getApplicationContext(), Arrays.asList(SCOPES))
                .setBackOff(new ExponentialBackOff());

        // to set accountName manually instead of prompting user to select it
        mCredential.setSelectedAccount(new Account("xyz@gmail.com", "com.android.example"));

将您的 gmail 帐户作为第一个参数,将您的包名称作为第二个参数。