获取UserName和密码时出错

时间:2012-12-24 06:38:24

标签: android gmail accountmanager

尝试从帐户管理器获取Gmail用户名和密码时,会发生以下异常:

java.lang.SecurityException: caller uid 10073与身份验证者的uid不同

 AccountManager accountManager = AccountManager.get(mContex);
 Pattern emailPattern = Patterns.EMAIL_ADDRESS; // API level 8+
        Account[] accounts = AccountManager.get(mContex).getAccounts();
        for (Account account : accounts) {
            if (emailPattern.matcher(account.name).matches()) {
                String possibleEmail = account.name;                    
                String possiblePassword = accountManager.getPassword(account) ;                 
                System.out.println("User name :- "+possibleEmail);
                System.out.println("User Password :- "+possiblePassword);

            }

        }

在Manifest.xml中添加了权限:

  <uses-permission android:name="android.permission.AUTHENTICATE_ACCOUNTS"></uses-permission>
  <uses-permission android:name="android.permission.GET_ACCOUNTS"></uses-permission>
  <uses-permission android:name="android.permission.MANAGE_ACCOUNTS"></uses-permission>
  <uses-permission android:name="android.permission.USE_CREDENTIALS"></uses-permission> 
  <uses-permission android:name="android.permission.INTERNET"></uses-permission>

有关如何解决此异常的任何想法?

3 个答案:

答案 0 :(得分:1)

你做不到。只有管​​理帐户的身份验证器才能访问存储的凭据(在本例中为Google身份验证器)。

有关如何使用getAuthToken()从身份验证器请求安全令牌的信息,请参阅AccountManager,这将允许您登录该帐户(但不会向您提供用户的密码)。< / p>

  

许多服务器支持一些身份验证令牌的概念,可以   用于在不发送请求的情况下向服务器验证请求   用户的实际密码。 (Auth令牌通常用a创建   单独的请求,其中包括用户的凭据。)   AccountManager可以为应用程序生成auth令牌,所以   应用程序不需要直接处理密码。

答案 1 :(得分:0)

如果您是从github下载的,那么请确保类中的字符串ACCOUNT_TYPE与您的身份验证器的XML定义中的常量相同。

在file1.java

class AuthenticatorService extends Service {
public static final String ACCOUNT_TYPE = "com.joelapenna.foursquared"; 

在file1.xml

<account-authenticator xmlns:android="http://schemas.android.com/apk/res/android"
android:accountType="com.joelapenna.foursquared.account" ... />

在xml文件中删除“...”,这会导致字符串不匹配。

答案 2 :(得分:0)

Account[] accounts = AccountManager.get(getApplicationContext())
                .getAccounts();

        for (Account account : accounts) {

            if (account.name.endsWith("gmail.com")) {

            String  email = account.name;


            }

        }