一步一步教你在 Android 里创建自己的账号系统(一)
大家假设喜欢我的博客,请关注一下我的微博,请点击这里(http://weibo.com/kifile),谢谢
转载请标明出处(http://blog.csdn.net/kifile),再次感谢
大家在平时使用 Android 手机的时候,都会发现有些应用(比如 qq,微信,淘宝)为自己创建了账号系统,而且可以在设置页面看到他,但是当自己希望为自己的软件写一个账号系统的时候总是不知从何入手,如今我们就从头開始,一步一步打造属于自己应用的账号系统。
在进行设备账户管理的时候,我们会通过一个 AccountManager 类获取系统的账户管理类,获取的方法例如以下:
AccountManager mAccountManager = (AccountManager) getSystemService(ACCOUNT_SERVICE);
或者
AccountManager accountManager = AccountManager.get(context);
接下来我们须要通过 AccountManager 对象对账号系统进行操作。
1.获取账户信息
首先我们来查看一下怎样获取用户已有的账户信息,假设你希望读取系统当前的账户信息,那么你首先须要在 manifest 文件里申明一个读取账户的权限,例如以下:
<uses-permission android:name="android.permission.GET_ACCOUNTS"/>
(1)获取全部账户信息
假设你希望获取到当前设备全部的账户信息,你能够使用:
accountManager.getAccounts();
(2)获取特定的账户信息
假设你仅仅希望获取自己或者特定的账户信息。你就应该使用:
accountManager.getAccountsByType("com.kifile");
后面的參数是你自定义的账户类型。怎么设置我会在接下来的文章中写出来。
然后,我们就能够通过上面获取到的工具类,读取到手机上的账户信息了。这里我写了一个 ListView 的 Adapter 用于展示当前系统中的账号信息:
public class AccountAdapter extends BaseAdapter {
private Account[] mAccounts;
public AccountAdapter(Account[] accounts) {
this.mAccounts = accounts;
}
@Override
public int getCount() {
return mAccounts != null ? mAccounts.length : 0;
}
@Override
public Object getItem(int position) {
return mAccounts[position];
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
TextView tv = new TextView(getBaseContext());
tv.setText(mAccounts[position].name + " " + mAccounts[position].type);
return tv;
}
}
获取当前全部系统账户信息以及设置 ListView 的 Adapter 的方法例如以下:
mListView.setAdapter(new AccountAdapter(mAccountManager.getAccounts()));
显示效果例如以下:
同你当前设备进行对照,你就会发现我们已经将当前全部的账户信息显示了出来,相同地假设你仅仅希望显示部分的账户信息,你就能够通过 getAccountByType 获取相应的账户列表。
2.建立自己的账号服务
通过上面的部分,我们已经知道了怎样获取 Android 本身现有的账号信息,如今我们就開始着手建立属于自己的账号系统吧。
你须要知道的是。假设你希望建立自己的账号系统,那么你得在 manifest 文件里声明一个关于账号的Service,例如以下
<service
android:name="com.kifile.account.app.account.AccountService"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="android.accounts.AccountAuthenticator"/>
</intent-filter>
<meta-data
android:name="android.accounts.AccountAuthenticator"
android:resource="@xml/authenticator"/>
</service>
在上面的代码中。我们通过设置 intent-filter 告知系统,我们当前应用中有一个账号服务,至于详细的账号信息则放在 meta-data 中的 android:resource 文件里提供, 该文件为authenticator.xml,放置路径为 res/xml,内容例如以下:
<?xml version="1.0" encoding="utf-8"?>
<account-authenticator
xmlns:android="http://schemas.android.com/apk/res/android"
android:accountType="com.kifile"
android:icon="@drawable/ic_launcher"
android:smallIcon="@drawable/ic_launcher"
android:label="@string/app_name"/>
在这里,我们就能够向系统提供相关的账户信息,用于在 Android Setting 文件夹下显示相应的账号信息。比如这里。我们就定义了当前的账户类型为"com.kifile",在账户系统中显示的标签为@string/app_name 相应的 String 对象,显示的 icon 为ic_launcher。
Ok,到了这里,我们已经向系统声明了一个账户相关的服务,如今让我们来详细实现他。
Android 为我们提供了一个叫做 AbstractAccountAuthenticator 的抽象类,也是通过它来实现:
public static class Authenticator extends AbstractAccountAuthenticator {
public Authenticator(Context context) {
super(context);
}
@Override
public Bundle editProperties(AccountAuthenticatorResponse response, String accountType) {
return null;
}
@Override
public Bundle addAccount(AccountAuthenticatorResponse response, String accountType, String authTokenType, String[] requiredFeatures, Bundle options) throws NetworkErrorException {
return null;
}
@Override
public Bundle confirmCredentials(AccountAuthenticatorResponse response, Account account, Bundle options) throws NetworkErrorException {
return null;
}
@Override
public Bundle getAuthToken(AccountAuthenticatorResponse response, Account account, String authTokenType, Bundle options) throws NetworkErrorException {
return null;
}
@Override
public String getAuthTokenLabel(String authTokenType) {
return null;
}
@Override
public Bundle updateCredentials(AccountAuthenticatorResponse response, Account account, String authTokenType, Bundle options) throws NetworkErrorException {
return null;
}
@Override
public Bundle hasFeatures(AccountAuthenticatorResponse response, Account account, String[] features) throws NetworkErrorException {
return null;
}
}
从上面的代码中。我们能够看出,Android 须要从我们自己定义的 Service 中获取一个 AbstractAccountAuthenticator 对象,然后再调用对象中的方法来实现账号系统的详细操作,每个方法的意义。我们在本文中就不详细探讨了,假设你有兴趣,能够去看看 API 文档。
当我们创建好了一个AbstractAccountAuthenticator 类后。我们须要从 Service 中取得这个类的对象,代码例如以下:
private Authenticator authenticator;
@Override
public void onCreate() {
super.onCreate();
authenticator = new Authenticator(this);
}
@Override
public IBinder onBind(Intent intent) {
return authenticator.getIBinder();
}
AccountService 类在 onCreate 的时候创建一个 Authenticator 对象。然后再 bindService 的时候,将 Authenticator 的 IBinder 传递回去,以供调用。
当你完毕上面的步骤之后,你就会发现,在你的设置页面点击加入账户时就会出现你自己定义的账户了,例如以下:
3.加入账户
尽管通过上面的步骤,我们已经可以在加入账户的界面看到属于我们自己的账户类别了,可是你会发现当你点击它们的时候,没有不论什么作用。那么我们应该怎么在设备上完毕加入账户的操作呢?
(1)加入加入账户的权限
加入账户也须要相应的权限。你应该在 manifest 文件里加入
<uses-permission android:name="android.permission.AUTHENTICATE_ACCOUNTS"/>
(2)重写 Authenticator 的 addAccount 方法
当用户在加入账户页面选择账户进行加入或者调用accountManager.addAccount 的时候,系统会默认调用 AbstractAccountAuthenticator 中的 addAccount 方法。因此你须要重写 addAccount 方法。直接加入默认账户,或者跳转到某个页面。让用户填写用户信息,然后加入账户。
(3)使用 addAccountExplicitly 直接加入账户
假设你希望直接加入账户信息,你能够使用下面方法:
Account account = new Account("Kifile,,,,12","com.kifile");
accountManager.addAccountExplicitly(account,password,userdata);
使用之后,你就会发如今设置页面出现你所建立的账户。点击进去,会发现账户名什么的也已经成功设置:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQva2lmaWxl/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
本文临时就到这里了,通过本文,你能够初步了解到 Android 的账户信息的建立流程。希望对大家有所帮助。
一步一步教你在 Android 里创建自己的账号系统(一)的更多相关文章
- 手把手教你用android studio创建第一个安卓程序加载html5页面(二)
经过上一篇,我们已经可以打开html页面了,但是有很多细节方面的内容我们还需要调整. 打开链接的问题 细心的网友可能已经发现,打开百度页面后,点击顶部的链接,会在手机的浏览器中打开相应的页面,这显然不 ...
- Ace教你一步一步做Android新闻客户端(一)
复制粘贴了那么多博文很不好意思没点自己原创的也说不出去,现在写一篇一步一步教你做安卓新闻客户端,借此机会也是让自己把相关的技术再复习一遍,大神莫笑,专门做给新手看. 手里存了两篇,一个包括软件视图 和 ...
- Ace教你一步一步做Android新闻客户端(四) 优化Bitmap大法
我计划着把需要用到的知识分解开来写,趁着我们要开发这款客户端的机会把安卓所有移动客户端开发中的技术贯穿其中,也是我自己成长的过程.By Ace in 20160121 我们开发一款新闻客户端程序,它的 ...
- 一步一步了解Cocos2dx 3.0 正式版本开发环境搭建(Win32/Android)
cocos2d-x 3.0发布有一段时间了,作为一个初学者,我一直觉得cocos2d-x很坑.每个比较大的版本变动,都会有不一样的项目创建方式,每次的跨度都挺大…… 但是凭心而论,3.0RC版本开始 ...
- 一步一步教你如何在linux下配置apache+tomcat(转)
一步一步教你如何在linux下配置apache+tomcat 一.安装前准备. 1. 所有组件都安装到/usr/local/e789目录下 2. 解压缩命令:tar —vxzf 文件名(. ...
- 一步一步教你将普通的wifi路由器变为智能广告路由器
一步一步教你将普通的wifi路由器变为智能广告路由器 相信大家对WiFi智能广告路由器已经不再陌生了,现在很多公共WiFi上网,都需要登录并且验证,这也就是WiFi广告路由器的最重要的功能.大致就是下 ...
- 一步一步学android控件(之十五) —— DegitalClock & AnalogClock
原本计划DigitalClock和AnalogClock单独各一篇来写,但是想想,两个控件的作用都一样,就和在一起写一篇了. DegitalClock和AnalogClock控件主要用于显示当前时间信 ...
- 一步一步学android控件(之十六)—— CheckBox
根据使用场景不同,有时候使用系统默认的CheckBox样式就可以了,但是有时候就需要自定义CheckBox的样式.今天主要学习如何自定义CheckBox样式.在CheckBox状态改变时有时需要做一些 ...
- 一步一步教你使用Git
一步一步教你使用Git 互联网给我们带来方便的同时,也时常让我们感到困惑.随便搜搜就出一大堆结果,然而总是有大量的重复和错误.小妖发出的内容,都是自己实测过的,有问题请留言. 现在,你已经安装了Git ...
随机推荐
- 利用json实现数据传输
JSON:JavaScript 对象表示法(JavaScript Object Notation). JSON 是存储和交换文本信息的语法.类似 XML. JSON 比 XML 更小.更快,更易解析. ...
- Xcode中断点的使用
注:本文由破船译自:albertopasca.本文由HoNooD在iosfeed站点上做了推荐. 这里先推荐两篇Xcode相关的文章: Xcode Code Snippets iOS调试 — 基本技巧 ...
- 基于 K8S 构建数据中心操作系统
在 12 月 22 日 ECUG 的下午场 ,七牛云容器计算部技术总监袁晓沛为大家带来了主题为<基于 K8S 的 DCOS 之路>的精彩分享,向大家介绍了七牛容器云目前 K8S 的状况和产 ...
- HDU——1027Ignatius and the Princess II(next_permutation函数)
Ignatius and the Princess II Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K ( ...
- jenkins使用xvfb插件构建虚拟化显示屏自动化测试
1.linux服务器安装xvfb,并启动 参考我的博客:http://www.cnblogs.com/lincj/p/5468505.html 或者网上搜索一下进行安装 2.jenkins安装xvfb ...
- Zabbix实现短信报警设置(实战)
配置环境: zabbix 2.2.15 1.配置示警媒介类型 此文件所在位置:/usr/lib/zabbix/alertscripts/ 必须拥有执行权限,并且改变所属用户和组 要修改此脚本的路径,需 ...
- vue当中设置全局变量的方法
import fn from 'fn' Vue.prototype.fn = fn; 调用的时候 this.fn.way
- docker的通俗理解
自己买了个服务器,前不久搭建好的一个网站,想要再搞一个站点,无奈只能修改端口后,再部署另外一个站点.繁琐的配置运行环境,迁移网站,是否让你感觉到很繁琐?服务器不想用了,想搬迁到另外一台服务器去部署,先 ...
- WebRTC入门学习之初识WebRTC (转)
一.WebRTC基本架构 图一 WebRTC总体架构,摘自百度百科 先说说WebRTC大致的实现思路:我们创建的web app,然后在app中调用W3C提供的JS API,JS API 会调用浏览器 ...
- 转 Python爬虫入门二之爬虫基础了解
静觅 » Python爬虫入门二之爬虫基础了解 2.浏览网页的过程 在用户浏览网页的过程中,我们可能会看到许多好看的图片,比如 http://image.baidu.com/ ,我们会看到几张的图片以 ...