Android AccountManager帐号管理(一)

AccountManager简介

AccountManager帐号管理器,集中管理apps注册的不同类型的帐号。
不同类型的帐号服务会使用不同的帐号登录和鉴权方式,所以AccountManager为不同类型的帐号提供一个插件式authenticator模块,authenticators自己处理帐号登录/认证的具体细节,也可以自己存储帐号信息

简言之,AccountManager是一个面向应用程序开发的组件,它提供了一套对应于IAccountManager协议的应用程序接口;这组接口通过Binder机制与系统服务AccountManagerService进行通信,协作完成帐号相关的操作。同时,AccountManager接收authenticators提供的回调,以便在帐号操作完成之后向调用此帐号服务的业务返回对应的接口,同时触发这个业务对结果的处理。
- authenticators 即注册帐号服务的app;
- 业务调用方 即使用authenticators提供的帐号服务的第三方,也可以是authenticator自己

使用AccountManager注册帐号服务

如果应用想要注册一个新的帐号服务,必须实现AbstractAccountAuthenticator类,这是创建一个account authenticator的抽象基础类;然后新建一个authenticator service,注册action必须为”android.accounts.AccountAuthenticator”,且该service要实现onBinder(android.content.Intent)方法,返回AbstractAccountAuthenticator实现类的实例

说下必须要注册一个action为”android.accounts.AccountAuthenticator”的authenticator service
首先,AbstractAccountAuthenticator是创建一个account authenticator必须实现的抽象基础类,接口协议定义在IAccountAuthenticator中,是一个authenticator自定义自己登录/认证等的接口协议;
那如何将authenticator的实现回调给AccountManagerService,供其调起authenticator的具体实现呢?
就是通过action注册为”android.accounts.AccountAuthenticator”的authenticator service了:
这个action即为AccountManager#ACTION_AUTHENTICATOR_INTENT的常量值,系统服务AccountManagerService是通过bind到action为AccountManager#ACTION_AUTHENTICATOR_INTENT的intent service上来调起某个账号类型的authenticator service,然后通过调用这个service的getBinder()方法来获取AbstractAccountAuthenticator的实现实例,进而调用authenticator对帐号登录认证等服务的具体实现
至于每个帐号服务都定义一个action为”android.accounts.AccountAuthenticator”的service,那AccountManagerService是如何区分的呢?
当然是通过账号类型了,每个accountType只能对应一个authenticator
那系统是如何知道每个authenticator service对应的账号类型?
在AndroidManifest.xml中注册authenticator service时声明帐号属性的meta-data配置,声明的meta-data是一个name为 “android.accounts.AccountAuthenticator”的xml 资源(AccountManager#AUTHENTICATOR_META_DATA_NAME),该XML资源文件定义了account-authenticator用到的一些属性:如accountType;系统解析authenticator service info之后,loadXmlMetaData获取authenticator 的xml属性,然后利用 Xml.asAttributeSet即

final PackageManager pm = mContext.getPackageManager();
final  List<ResolveInfo> resolveInfos =  pm.queryIntentServicesAsUser(new Intent(
  • 0
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是一个基于 Android 的钉钉服务器 CalDAV 账号验证 Demo 的示例代码: ```java import android.accounts.Account; import android.accounts.AccountManager; import android.content.Context; import android.os.AsyncTask; import android.os.Bundle; import android.widget.Toast; import com.github.scribejava.apis.DingTalkApi; import com.github.scribejava.core.builder.ServiceBuilder; import com.github.scribejava.core.model.OAuth2AccessToken; import com.github.scribejava.core.oauth.OAuth20Service; import java.io.IOException; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.Response; public class CalDavAccountVerificationTask extends AsyncTask<Void, Void, Boolean> { private final Context mContext; private final Account mAccount; public CalDavAccountVerificationTask(Context context, Account account) { mContext = context; mAccount = account; } @Override protected Boolean doInBackground(Void... params) { try { // 获取钉钉 OAuth2 认证 AccessToken OAuth20Service service = new ServiceBuilder("YOUR_CLIENT_ID") .apiSecret("YOUR_CLIENT_SECRET") .callback("YOUR_REDIRECT_URI") .build(DingTalkApi.instance()); OAuth2AccessToken accessToken = service.getAccessToken(mAccount.name); // 构建 CalDAV 账号验证请求 String url = "https://oapi.dingtalk.com/caldav/principal"; Request request = new Request.Builder() .url(url) .addHeader("Authorization", "Bearer " + accessToken.getAccessToken()) .addHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3") .build(); // 发送 CalDAV 账号验证请求 OkHttpClient client = new OkHttpClient(); Response response = client.newCall(request).execute(); // 判断响应状态码是否为 200 return response.isSuccessful(); } catch (IOException e) { e.printStackTrace(); return false; } } @Override protected void onPostExecute(Boolean success) { String message = success ? "验证成功" : "验证失败"; Toast.makeText(mContext, message, Toast.LENGTH_SHORT).show(); // 更新 CalDAV 账号验证状态 AccountManager accountManager = AccountManager.get(mContext); accountManager.setUserData(mAccount, "calDavVerified", String.valueOf(success)); } } ``` 使用方法: ```java AccountManager accountManager = AccountManager.get(context); Account[] accounts = accountManager.getAccountsByType("com.dingtalk"); if (accounts.length > 0) { Account account = accounts[0]; new CalDavAccountVerificationTask(context, account).execute(); } ``` 其中,`YOUR_CLIENT_ID`、`YOUR_CLIENT_SECRET`、`YOUR_REDIRECT_URI` 分别替换为你的钉钉开放平台应用的 Client ID、Client Secret 和 Redirect URI。同时,也需要在 AndroidManifest.xml 文件中添加以下权限: ```xml <uses-permission android:name="android.permission.INTERNET" /> ``` 另外,上述代码中的 `calDavVerified` 是自定义的一个用于记录 CalDAV 账号验证状态的 User Data Key,你可以根据实际情况进行更改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小燕子的空间

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值