我是 Android 开发人员,但我需要回答一些有关其他平台的可能性的问题,我想知道 iOS 提供了哪些与http://developer.android.com/reference/android/accounts/AccountManager.html相当的功能。我找到了https://developer.apple.com/library/ios/documentation/Accounts/Reference/ACAccountClassRef/Reference/Reference.html,但我无法理解全部可能性。
问题:
很高兴收到简短而快速的回复!// 乔纳斯
我确定这是基本的,我错过了一些东西。我已经阅读了关于 SO 的其他答案,我已经谷歌搜索,我已经阅读了资源,但我无法理解我需要做什么。
我试图弄清楚如何编写一个连接到 Twitch 的 API 的应用程序,特别是如何使用 Twitch 的 API 进行身份验证。他们的文档在这里:https : //github.com/justintv/Twitch-API/blob/master/authentication.md
我创建了一个应用程序并存储了我的密钥。
现在是我希望我的用户单击一个按钮在他们的网站上启动身份验证的部分。据我所知,我是通过使用 AccountManager 来做到这一点的。除了......我不知道我应该做什么。
这是我在网上找到的摘录:
AccountManager am = AccountManager.get(this);
Bundle options = new Bundle();
am.getAuthToken(
myAccount_, // Account retrieved using getAccountsByType()
"Manage your tasks", // Auth scope
options, // Authenticator-specific options
this, // Your activity
new OnTokenAcquired(), // Callback called when a token is successfully acquired
new Handler(new OnError())); // Callback called if an error occurs
Run Code Online (Sandbox Code Playgroud)
根据 twitch 的文档,我想将用户发送到:
https://api.twitch.tv/kraken/oauth2/authorize
?response_type=code
&client_id=[your client ID]
&redirect_uri=[your …Run Code Online (Sandbox Code Playgroud) 所以我试图同步到谷歌文档,而不必询问用户他的凭据.我使用此代码获取auth-token:
AccountManager mgr = AccountManager.get(activity);
authToken = mgr.blockingGetAuthToken(account, DocsService.DOCS_SERVICE, true);
Run Code Online (Sandbox Code Playgroud)
这将返回一个看起来格式良好的身份验证令牌.所以在我的DocsService上运行:
service.setAuthSubToken(authToken);
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试使用API时,我只获得了AuthenticationException.有关如何处理此错误的任何想法?
编辑:我确实拥有USE_CREDENTIALS权限.
我的小应用程序在AccountManager中创建一个帐户.但是,如果我将应用程序从内部存储移动到SD卡,如果我卸载SD卡或重新启动计算机,AccountManagerService会自动删除该帐户.
有没有人对此有任何想法?这是否意味着我们无法将应用程序移动到SD卡,还是因为我在配置xml中缺少一些配置属性?
D/AccountManagerService(245):删除帐户XXX,因为类型com.XXX不再具有注册的身份验证器D/ContactsProvider(945):删除已删除帐户的数据帐户{name = XXXX,type = com.XXX}
我的应用程序需要从服务器同步一些数据.我添加了必要的类(类似于SampleSyncAdapter),现在我可以通过"设置/同步和帐户"添加帐户.但是我希望在安装应用程序之后已经添加了我的帐户和工作同步(我不希望用户在设置中进行任何手动更改).这该怎么做?
我正试图从存储在Android设备中的Google帐户中获取一个全新的令牌,但我得到的所有令牌都是我在过去几天一直在缓存的旧令牌.似乎它被缓存在手机的某个地方,甚至互联网请求都没有被发送(我在没有互联网连接的情况下在应用程序中进行了测试,并返回相同的令牌).
invalidateAuthToken在使用getResultfrom 之前我使用了这个方法AccountManagerFuture.请看一下:
public String updateToken(Activity activity) throws Exception {
AccountManager am = AccountManager.get(activity);
Account[] accounts = am.getAccountsByType("com.google");
if (accounts == null ||
accounts.length == 0 ||
"".equals(accounts[0].name.trim()))
{
throw new Exception("Não há contas Google configuradas no smartphone.");
}
else if (!"crsilva@gmail.com".equals(accounts[0].name.trim()) &&
!"cristiano.bezerra@sulamerica.com.br".equals(accounts[0].name.trim()) &&
!"tholiver@gmail.com".equals(accounts[0].name.trim()))
{
Log.w("Util.updateToken","conta obtida: " + accounts[0].name);
throw new Exception("Conta Google não autorizada.");
}
Log.w("Util.updateToken","conta obtida: " + accounts[0].name);
am.invalidateAuthToken("com.google", null);
Log.w("Util.updateToken","Passou do invalidateAuthToken");
AccountManagerFuture<Bundle> future =
am.getAuthToken(accounts[0], "ah", null, …Run Code Online (Sandbox Code Playgroud) 在AccountManager教程中记住您的用户,建议:
如果
Account数组中有多个,则应显示一个对话框,要求用户选择一个.
最好的方法是什么?我有一个解决方案,但如果社区中有其他好的例子,那么这似乎是那种可以共享并且容易被其他人重用的样板代码.
我有两个独立的Android项目,一个是用于管理设备中用户帐户的AbstractAccountAuthenticator的实现,另一个是应该从AccountAuthenticator获取令牌并使用它的推送应用程序.
AbstractAccountAuthenticator的实现正在工作,并在"设置"菜单中的"帐户和同步"部分调用时添加帐户,但是当我从推送应用程序调用addAccount()时,我得到"权限被拒绝:checkComponentPermission()"和应用程序在那里死
我不能提供很多源代码,因为我不能让它公开,但我向你保证他们以"独立"的方式工作.
我搜索了从不同的应用程序正确使用AccountManager的示例,但没有找到.freenode也没有运气.
我发现从AccountAuthenticator中启动活动(使用Intent.FLAG_NEW_TASK和context.startActivity(intent))可以解决问题,但这意味着addAccount()不会返回到AccountManager,我认为不会与开发指南保持一致,因为它打破了AccountManager使用的流程.另一种方法是导出在请求用户凭据时使用的Acitivity.但我认为这可能是一个安全问题,因为它应该由AccountManager调用,而不是外部调用.
感谢您对此有任何想法.
PS:
所有权限都已正确使用,除非我需要一个我不知道可以跨应用程序工作的特殊权限.
我会问我是否可以使用代码片段在这里显示我关注的行.
第一个问题发布在这里,我希望我没有违反(m)这里的任何规则(我在这里和谷歌上搜索过,但我问过,因为我发现没有任何用处.)
谢谢.
深入Google的登录服务并绊倒了Settings类之后,我发现了我认为应该是解决方案:
不要导出东西,我一直认为调用你的实现,服务或活动,绕过AccountManager是一个安全问题.
不要使用Intent.FLAG_NEW_TASK和startActivity()执行AbstractAccountAuthenticator,因为它可能会带你出乎意料的行为.
实现这一点的方法非常简单,实际上:
Intent i = new Intent( Settings.ACTION_ADD_ACCOUNT );
i.putExtra( Settings.EXTRA_AUTHORITIES, new String[] { "com.exaple.yourauth" } );
contextVar.startActivity( i );
Run Code Online (Sandbox Code Playgroud)
这样,您要求设置提升新帐户,总线的可能权限列表,因为您要添加EXTRA_AUTHORITIES参数,一个包含要显示的权限的字符串,它会将选项限制为您想要的选项.如果只有一个与您的额外匹配,则以适当的方式调用客户经理和登录活动.
我真的希望这可以帮助周围的任何人.
当我安装或卸载使用同步服务的应用程序时,我总是遇到崩溃,比如Facebook,whatsup等.
"不幸的是,Exchange服务已停止."
我不知道为什么,但它只是发生在一些设备上,在我的情况下,所有的都是Android 4.4.2.首先我认为这是我的应用程序的错,但是一旦我卸载我的应用程序并且问题继续发生在其他应用程序中,它就没有意义了.
你知道些什么吗?
谢谢.
02-07 14:31:49.864 3015-3015/? E/ActivityThread? Failed to find provider info for com.google.android.email.provider
02-07 14:31:49.864 3015-3015/? E/AndroidRuntime? FATAL EXCEPTION: main
Process: com.google.android.exchange, PID: 3015
java.lang.RuntimeException: Unable to create application com.android.exchange.Exchange: java.lang.IllegalArgumentException: Unknown URI content://com.google.android.email.provider
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4347)
at android.app.ActivityThread.access$1500(ActivityThread.java:135)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5017)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.IllegalArgumentException: Unknown URI content://com.google.android.email.provider
at android.content.ContentResolver.call(ContentResolver.java:1352)
at com.android.exchange.Exchange.onCreate(Exchange.java:34)
at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1007)
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4344)
at android.app.ActivityThread.access$1500(ActivityThread.java:135)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256) …Run Code Online (Sandbox Code Playgroud) 我已经编写了一些代码来在设置中添加我的自定义帐户点击添加帐户后,我可以看到我的自定义帐户,点击时我会显示登录表单.在里面我打电话给下面的代码
if (mAccountManager.addAccountExplicitly(account, password, userData)) {
// worked
System.out.println("Account added");
} else {
// guess not
System.out.println("NOT DONE");
}
Run Code Online (Sandbox Code Playgroud)
第一次显示"添加帐户",但无法在"设置/帐户"中看到任何内容.任何人都可以帮助我.
这是完整的代码
Log.d("AuthenticatorActivity", "onCreate");
mAccountManager = AccountManager.get(getBaseContext());
String accountName = getIntent().getStringExtra(ARG_ACCOUNT_NAME);
mAuthTokenType = getIntent().getStringExtra(ARG_AUTH_TYPE);
if (mAuthTokenType == null)
mAuthTokenType = AccountGeneral.AUTHTOKEN_TYPE_FULL_ACCESS;
accountName= "test55";
findAccount(accountName);
System.out.println(mAuthTokenType + "accountName : " + accountName);
Bundle data = new Bundle();
data.putString(AccountManager.KEY_ACCOUNT_NAME, accountName);
data.putString(AccountManager.KEY_ACCOUNT_TYPE, mAuthTokenType);
data.putString(AccountManager.KEY_AUTHTOKEN, authtoken);
data.putString(PARAM_USER_PASS, password);
Bundle userData = new Bundle();
userData.putString("userObjectId", "2");
data.putBundle(AccountManager.KEY_USERDATA, userData);
final Intent res = new Intent();
res.putExtras(data);
final …Run Code Online (Sandbox Code Playgroud)