为什么我无法检索用户的Gmail?

时间:2016-04-20 16:55:59

标签: android email in-app-billing accountmanager

使用以下代码检索用户的Google帐户gmail,我想知道为什么我从像我这样的设备上获取null(当然是在我的gmail上运行),而它对我的妈妈有效。设备:

public class MainActivity extends AppCompatActivity {

    final String TAG = "Sample2";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        String test = getEmail(getApplicationContext());
        Log.d(TAG, "Email is: " + test);
        TextView emailTxt = (TextView)findViewById(R.id.emailTxt);
        emailTxt.setText(test);
    }

    private String getEmail(Context context) {
        AccountManager accountManager = AccountManager.get(context);
        Account account = getAccount(accountManager);

        if (account == null) {
            return null;
        } else {
            return account.name;
        }
    }

    private static Account getAccount(AccountManager accountManager) {
        Account[] accounts = accountManager.getAccountsByType("com.google");
        Account account;
        if (accounts.length > 0) {
            account = accounts[0];
        } else {
            account = null;
        }
        return account;
    }
}

我还在我的清单文件中包含以下权限:

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

显然,这是因为我的设备...但它不能成为唯一一个返回null的设备,所以我不知道这是不是一个好方法在使用应用内结算验证有效内容时获取唯一字符串令牌。

哦,这是我在帐户&amp;中找到的内容的屏幕截图同步设置:

enter image description here

......我在这里找不到任何东西?

2 个答案:

答案 0 :(得分:0)

基于文件Set the developer payload string。在发出购买请求时,您不应在有效内容字符串中使用用户的电子邮件地址,因为地址可能会更改。

您应该传入一个字符串令牌,以帮助您的应用程序识别进行购买的用户,以便您以后可以验证这是该用户的合法购买。对于消耗品,您可以使用随机生成的字符串,但对于非消耗品,您应该使用唯一标识用户的字符串。

答案 1 :(得分:0)

https://developer.android.com/about/versions/oreo/android-8.0-changes.html

帐户访问权限和可发现性 在Android 8.0(API级别26)中,除非身份验证者拥有帐户或用户授予该访问权限,否则应用程序将无法再访问用户帐户。 GET_ACCOUNTS权限不再足够。要授予对帐户的访问权限,应用应使用AccountManager.newChooseAccountIntent()或特定于身份验证器的方法。访问帐户后,应用程序可以调用AccountManager.getAccounts()来访问它们。

Android 8.0弃用了LOGIN_ACCOUNTS_CHANGED_ACTION。应该使用addOnAccountsUpdatedListener()代替应用程序在运行时获取有关帐户的更新。

有关为帐户访问和可发现性添加的新API和方法的信息,请参阅本文档新API部分中的帐户访问和可发现性

也许你可以试试这个

public class MainActivity extends AppCompatActivity {

private static final String TAG = "MainActivity";
private static final int PICK_ACCOUNT_REQUEST = 0;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);


    Intent googlePicker = AccountManager.newChooseAccountIntent(null, null,
            new String[] { "com.google"}, true, null, null, null, null);
    startActivityForResult(googlePicker, PICK_ACCOUNT_REQUEST);
}

@Override
protected void onActivityResult(final int requestCode, final int resultCode, final Intent data) {
    if (requestCode == PICK_ACCOUNT_REQUEST && resultCode == RESULT_OK) {
        String accountName = data.getStringExtra(AccountManager.KEY_ACCOUNT_NAME);
        Log.d(TAG, "Account Name=" + accountName);
        String accountType = data.getStringExtra(AccountManager.KEY_ACCOUNT_TYPE);
        Log.d(TAG, "Account type=" + accountType);

        AccountManager accountManager = AccountManager.get(this);
        Account[] accounts = accountManager.getAccounts();
        for (Account a :
                accounts) {
            Log.d(TAG, "type--- " + a.type + " ---- name---- " + a.name);
        }
    }
}

}