尝试从帐户管理器获取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>
有关如何解决此异常的任何想法?
答案 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;
}
}