一步一步教你在 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;}@Overridepublic int getCount() {return mAccounts != null ? mAccounts.length : 0;}@Overridepublic Object getItem(int position) {return mAccounts[position];}@Overridepublic long getItemId(int position) {return 0;}@Overridepublic 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,例如以下
<serviceandroid:name="com.kifile.account.app.account.AccountService"android:enabled="true"android:exported="true"><intent-filter><action android:name="android.accounts.AccountAuthenticator"/></intent-filter><meta-dataandroid: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-authenticatorxmlns: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);}@Overridepublic Bundle editProperties(AccountAuthenticatorResponse response, String accountType) {return null;}@Overridepublic Bundle addAccount(AccountAuthenticatorResponse response, String accountType, String authTokenType, String[] requiredFeatures, Bundle options) throws NetworkErrorException {return null;}@Overridepublic Bundle confirmCredentials(AccountAuthenticatorResponse response, Account account, Bundle options) throws NetworkErrorException {return null;}@Overridepublic Bundle getAuthToken(AccountAuthenticatorResponse response, Account account, String authTokenType, Bundle options) throws NetworkErrorException {return null;}@Overridepublic String getAuthTokenLabel(String authTokenType) {return null;}@Overridepublic Bundle updateCredentials(AccountAuthenticatorResponse response, Account account, String authTokenType, Bundle options) throws NetworkErrorException {return null;}@Overridepublic Bundle hasFeatures(AccountAuthenticatorResponse response, Account account, String[] features) throws NetworkErrorException {return null;}}
从上面的代码中。我们能够看出,Android 须要从我们自己定义的 Service 中获取一个 AbstractAccountAuthenticator 对象,然后再调用对象中的方法来实现账号系统的详细操作,每个方法的意义。我们在本文中就不详细探讨了,假设你有兴趣,能够去看看 API 文档。
当我们创建好了一个AbstractAccountAuthenticator 类后。我们须要从 Service 中取得这个类的对象,代码例如以下:
private Authenticator authenticator;@Overridepublic void onCreate() {super.onCreate();authenticator = new Authenticator(this);}@Overridepublic 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);
使用之后,你就会发如今设置页面出现你所建立的账户。点击进去,会发现账户名什么的也已经成功设置:
本文临时就到这里了,通过本文,你能够初步了解到 Android 的账户信息的建立流程。希望对大家有所帮助。
一步一步教你在 Android 里创建自己的账号系统(一)相关推荐
- 华南x79主板u盘装系统教程_学不会不收费 几步教你安装Android x86
1安装Android x86其实并不困难 话说最近操作系统这个话题的确是非常火爆.也许是借助于Windows 8消费者预览版的光芒,凡是与系统搭边的东西大家好像都喜欢与Windows 8进行比较.不管 ...
- 一步一步教你如何在AndroidStudio查看Android源码(AOSP源码)
一步一步教你如何在AndroidStudio查看Android源码(AOSP源码) idegen工具 要将Android系统源代码工程导入到Eclipse或者IntelliJ IDEA,关键是要有相应 ...
- 2020最新版Android一步一步教轻松通过ArcSoft虹软平台实现人脸识别功能,保姆级别教程?
Android实现人脸识别功能 第一步:注册并认证成为开发者. 第二步:创建应用 1.认证成功后,我们就可以开始创建应用. 2,填写信息 3.点击添加SDK 4.选择人脸识别 5.选择情况,如图所示. ...
- Android自定义View教你一步一步实现薄荷健康滑动卷尺
前言 前几天写了一篇一步一步教你实现即刻点赞效果后,实现点赞效果主要是自己对自定义View的一些canvas绘制,缩放知识,位移的理解.而朋友说HenCoder还有给出薄荷健康滑动卷尺,小米运动记录界 ...
- android实现推送功能实现,android教你怎么轻松实现手机推送功能,一步一步教你Mob+MobPush...
mob平台实现推送功能 第一步:Mob平台账号 第二步:在mob平台配置MobPush环境 1.点击下图蓝色圆圈处的产品中心. 2.点击立即进入. 3.点击创建应用. 4.同意隐私服务. 5.创建应用 ...
- Android一步一步教你实现Emoji表情键盘
背景: 说到聊天,就离不开文字.表情和图片,表情和图片增加了聊天的趣味性,让原本无聊的文字瞬间用表情动了起来,今天给大家带来的是表情键盘,教你一步一步实现,先来看下效果图: 效果图 功能: 1.如何控 ...
- android 分时图x轴宽度,一步一步教你写股票走势图——分时图二(自定义xy轴)...
目录 一步一步教你写股票走势图--分时图一(概述) 一步一步教你写股票走势图--分时图二(自定义xy轴) 一步一步教你写股票走势图--分时图三(对齐图表.自定义柱状图高亮) 一步一步教你写股票走势图- ...
- 谷歌 android 4.42,一步一步教你如何使4.42版本ROOT并且安装Viper4Android音效软件
相信好多朋友已经更新到了安卓4.42版本,也即EMUI2.3了,这个时候大家都发现根本不能ROOT了,而且新安装的好多软件会自动启动,且去除不掉,内置的系统也删除不了,更可恶的是Viper4Andro ...
- 教你一步一步实现图标无缝变形切换
我的简书同步发布:教你一步一步实现图标无缝变形切换 ☺欢迎打赏☺ 转载请注明出处:[huachao1001的专栏:http://blog.csdn.net/huachao1001] *本篇文章已授权微 ...
最新文章
- memcache的分布式缓存问题
- UPDATE ORACLE(9i OR 10G) USER'S PASSWORD AND GET ORACLE VERSION MESSAGE
- linux shell 编程 12 重定向
- Linkedin工程师是如何优化他们的Java代码的
- ZooKeeper 集群:集群概念、选举流程、机器数量
- Mac下提示APP已损坏,打不开,请移至废纸篓
- OpenCV学习笔记:基础结构
- MySQL终端(Terminal)命令基本操作(转)
- 中如何输入越南拼音_幼小衔接中,我们如何给孩子做拼音启蒙?
- kali 解压rar
- linux中pe中文名称,原来如此,Linux系统也有PE,不过它叫...
- 《排列字母》把字符串中的字母按其在字母表中的顺序排列。
- 数字图像处理学习路线大体介绍
- Vue一个案例引发「内容分发slot」的最全总结
- 在Proteus新建项目
- VUE 表单input 框使用@blur事件
- shell脚本获取当前时间和1分钟/1小时前时间
- margin塌陷如何解决
- 实践是检验真理的唯一标准
- 单片机STC89C52RC实现时钟(汇编语言)