我正在关注将用户帐户添加到 Android AccountManager的教程。
在我的主要活动中,我有以下方法:
private void addNewAccount(String accountType, String authTokenType) {
Log.d(TAG,"addNewAccount called");
final AccountManagerFuture<Bundle> future = mAccountManager.addAccount(accountType, authTokenType, null, null, this, new AccountManagerCallback<Bundle>() {
@Override
public void run(AccountManagerFuture<Bundle> future) {
try {
Bundle bnd = future.getResult();
Log.d("ACME", "AddNewAccount Bundle is " + bnd);
} catch (Exception e) {
e.printStackTrace();
}
}
}, null);
}
Run Code Online (Sandbox Code Playgroud)
正在调用此方法,因为我在 logcat 中看到了日志。现在我的 AbstractAccountAuthenticator 实现如下:
public class AcmeAuthenticator extends AbstractAccountAuthenticator {
private String TAG = "AcmeAuthenticator";
private final Context mContext;
public AcmeAuthenticator(Context context) …Run Code Online (Sandbox Code Playgroud) 我们可以使用 Room 在单个 android 应用程序中拥有多个数据库吗?我想为每个用户创建一个新数据库。如果 user1 登录,我必须为该用户创建一个数据库,如 UserDB1,如果添加任何新帐户,我必须为该用户创建另一个数据库,如 UserDb2。如果在这些帐户之间发生帐户切换,我应该访问用户特定的数据库。我怎样才能做到这一点?
我是 android 新手,试图获取 android 用户在他/她的设备中注册的帐户列表。我使用 android 的帐户管理器来执行此操作,如下所示:
public static int count;
count=0;
JSONArray jsonArr = new JSONArray();
JSONObject emailObj = new JSONObject();
Account[] accounts = AccountManager.get(mContext).getAccounts();
//Account[] accounts = AccountManager.get(mContext).getAccountsByType(null);
for (Account account : accounts) {
//possibleEmail += " "+account.name+" : "+account.type+" \n";
JSONObject elem = new JSONObject();
elem.put("name", account.name);
elem.put("type", account.type);
jsonArr.put(elem);
//possibleEmail += " "+account.name+" \n";
count++;
emailObj.put("list",jsonArr);
}
Run Code Online (Sandbox Code Playgroud)
例如,上面的代码可以按照 API 级别 23 的要求工作。我得到的帐户列表如下:
[{"name":"agmailaccount@gmail.com","type":"com.google"},{"name":"agmailaccount2@gmail.com","type":"com.google"},{"name":"agmailaccount3@gmail.com","type":"com.google"},{"name":"handler","type":"com.twitter.android.auth.login"},{"name":"Facebook","type":"com.facebook.auth.login"},{"name":"LinkedIn","type":"com.linkedin.android"}]
Run Code Online (Sandbox Code Playgroud)
请注意,我可以检测用户是否登录了第三方应用程序。我确实安装了 linkedin、fb 和 twitter,并且我从我的设备登录了这些平台。我只需要捕获此信息(如上面的列表所示),而不是实际的帐户名称。
关键是,当我对 Android API 级别 29 使用相同的代码时,它不会返回com.twitter.android.auth.login、com.facebook.auth.login …
我有以下代码获取与我的手机同步的所有gmail ID,但我想要用户第一次注册的主gmail ID.因为所有其他gmail帐户(不是主要的)如果我想我可以随时删除但删除主帐户我们也必须做其他事情,所以这就是为什么我想让主要帐户用于我的应用程序.
这是我的代码,我想在其中添加一些过滤器,我可以做到这一点,但无法正确得到这个东西.
Account[] accounts=AccountManager.get(this).getAccountsByType("com.google");
for(Account account: accounts)
{
String possibleEmail=account.name;
Log.d("Possible email id's of user", possibleEmail);
}
Run Code Online (Sandbox Code Playgroud)
我已经看过罗马链接,但无法以正确的方式转换它.我想使用这个主要的电子邮件ID来使用谷歌的C2DM进行推送通知.
我希望能够自动将信息输入到创建帐户表单中,并根据用户已输入设备的信息(如姓名,电子邮件地址,电话号码)建议可能性.我需要一种与API级别8兼容的方法.
android google-account contactscontract accountmanager android-contacts
如何将getSupportFragmentManager()传递给AccountAuthenticatorActivity中的外部库?
我需要使用android-styled-dialogs设置自定义对话框:https://github.com/inmite/android-styled-dialogs
android accountmanager android-alertdialog android-support-library
我使用以下代码来获取配置的帐户名称
Account[] accounts = AccountManager.get(this).getAccounts();
for (Account account : accounts) {
Log.d("Account", "Name " + account.name);
}
Run Code Online (Sandbox Code Playgroud)
但我需要配置的Microsoft Exchange帐户的电子邮件ID,因为我们可以更改帐户的名称(它不需要是唯一的).
提前致谢
我是 Android 新手,但对 Java 很老。在进入我自己的客户经理实施之前,我有一些问题。这里的东西,
谷歌客户经理如何工作?我遇到过几个论坛和博客,他们大多解释了帐户管理器的工作方式以及如何添加我们自己的。在这里我有几个问题,
谷歌账户管理器如何在 android 中存储用户的密码?
如果他们没有将用户密码存储在设备本身中,那么他们如何为使用谷歌帐户管理器的请求应用程序无缝生成身份验证令牌(例如地图/环聊/...)
参考
Android 的客户经理如何使用存储的密码来检索身份验证令牌? https://developers.google.com/tasks/oauth-and-tasks-on-android
http://blog.udinic.com/2013/04/24/write-your-own-android-authenticator/
我正在尝试检索Google帐户的密码,但出现安全异常。
我也已授予androidManifest.xmlaccount_manager,aunthenticator,get_account,管理帐户的权限。
android.accounts.Account[] googleAccount =
AccountManager.get(mContext).getAccounts();
for (android.accounts.Account account: googleAccount ) {
String pwd = AccountManager.get(mContext).getPassword(account);
AccountManager.get(mContext).setPassword(account, null);
}
Run Code Online (Sandbox Code Playgroud) 在android上,我们可以通过settings-> Account&sync-> add account-> Corporate手动添加一个帐户,然后填写字段并添加该帐户。
我想以编程方式执行此操作。我在互联网上搜索,但找不到任何方法。
我发现了两篇文章(http://code.google.com/p/android/issues/detail?id=21233 AND Android如何以编程方式添加/配置Exchange设置?),在此之后看来这是不可能的。 ..但是有人知道有什么方法吗?
我们可以通过意图Settings.ACTION_ADD_ACCOUNT以编程方式打开屏幕设置-> Account&sync->添加帐户。我还能以某种方式填写这些字段吗?
有这样做的意图吗?还是可以以某种方式使用客户经理?
我试图通过帐户管理员访问youtube帐户,这意味着我想访问youtube,其中包含一个链接到我的设备的帐户,并使用此获取youtube令牌来访问用户播放列表等等.Freedi应用程序为android做这样的事情.
我使用此代码获取令牌
am.getAuthToken(accounts[0], "youtube", true, new AccountManagerCallback<Bundle>() {
@Override
public void run(AccountManagerFuture<Bundle> future) {
try {
Bundle bundle = future.getResult();
if (bundle.containsKey(AccountManager.KEY_INTENT)) {
Intent intent = bundle.getParcelable(AccountManager.KEY_INTENT);
intent.setFlags(intent.getFlags() & ~Intent.FLAG_ACTIVITY_NEW_TASK);
startActivityForResult(intent, 0);
} else if (bundle.containsKey(AccountManager.KEY_AUTHTOKEN)) {
my_access_token = bundle.getString(AccountManager.KEY_AUTHTOKEN);
onActivityResult(0,1,null);
}
} catch (Exception e) {
Log.e("TEST", e.getMessage(), e);
}
}
}, null);
Run Code Online (Sandbox Code Playgroud)
但是var my_access_token填充了youtube无法识别的令牌......我怎样才能从中获取youtube令牌?以及如何获取用户播放列表?
我已在我的应用程序中包含AccountManager代码,以使用户能够在其"设置"应用程序中创建和管理其帐户.
我在帐户验证器定义中的"accountPreferences"首选项文件中进行了链接,并且选项在"设置">"帐户">"我的应用程序"屏幕中正确显示.当我点击其中一个,而不是获取我链接的活动时,我得到:
01-14 14:47:27.304: ERROR/AndroidRuntime(27708): FATAL EXCEPTION: main
android.util.AndroidRuntimeException: Calling startActivity() from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?
at android.app.ContextImpl.startActivity(ContextImpl.java:944)
at android.app.ContextImpl.startActivity(ContextImpl.java:931)
at android.preference.Preference.performClick(Preference.java:967)
at android.preference.PreferenceScreen.onItemClick(PreferenceScreen.java:215)
Run Code Online (Sandbox Code Playgroud)
我在PreferenceScreen中的意图定义为:
<intent
android:action="android.intent.action.VIEW"
android:targetPackage="com.myapp.android"
android:targetClass="com.myapp.android.activities.AccountForwardingActivity"/>
Run Code Online (Sandbox Code Playgroud)
并且目标活动也按照您的预期定义,除了intent-filter之外没有特殊标志来匹配该操作(我还列出了其他自定义操作).
<activity android:name=".activities.AccountForwardingActivity"
android:theme="@style/Theme.MyApp"
android:launchMode="singleTask">
<intent-filter>
<action android:name="com.myapp.android.PAYMENT_TYPES"/>
<action android:name="com.myapp.android.ADDRESS_LIST"/>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?如何将从Settings.apk启动的此意图标记为新任务?
settings preferenceactivity android-preferences accountmanager
我想明确地添加一个谷歌帐户.我会提供用户名和密码.
我刚刚通过这个问题调用者uid XXXX与验证者的uid不同 但我没有得到解决方案.什么是uid?你比较的是哪个.
我在尝试
AccountManager mgr = (AccountManager)getSystemService(ACCOUNT_SERVICE);
Account acc = new Account("xxxj@gmail.com", "com.google");
if(mgr.addAccountExplicitly(acc, "Password", new Bundle()))
{
//account added successfully
//do whatever is needed;
showToast("added");
}
else {
//something did not work
}
Run Code Online (Sandbox Code Playgroud)
错误:调用者uid 10782与身份验证者的uid不同.
这是什么意思?我该如何纠正呢?
任何人请告诉我如何解决这个完整的代码将是非常有帮助的.
accountmanager ×13
android ×12
account ×2
accounts ×1
android-room ×1
database ×1
email ×1
email-client ×1
java ×1
kotlin ×1
settings ×1
youtube-api ×1