一步一步教你在 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);

使用之后,你就会发现在设置页面出现你所建立的账户,点击进去,会发现账户名什么的也已经成功设置:

本文暂时就到这里了,通过本文,你可以初步了解到 Android 的账户信息的建立流程,希望对大家有所帮助。

时间: 2024-09-29 18:51:39

一步一步教你在 Android 里创建自己的账号系统(一)的相关文章

一步一步教你在 Android 里创建自己的账号系统(二)--同步数据以及设计账号页面

大家如果喜欢我的博客,请关注一下我的微博,请点击这里(http://weibo.com/kifile),谢谢 转载请标明出处(http://blog.csdn.net/kifile),再次感谢 在前一篇文章中(一步一步教你在 Android 里创建自己的账号系统(一)),我向大家介绍了如何在 Android 系统中创建自己的账户系统,接下来我会向大家详细介绍一下如何使用账户系统. (一)同步数据 通常而言,我们会在两种情况下使用我们的账号系统: (1)登陆验证 登陆验证其实是一个很实用的功能,试

手把手教你用android studio创建第一个安卓程序加载html5页面(二)

经过上一篇,我们已经可以打开html页面了,但是有很多细节方面的内容我们还需要调整. 打开链接的问题 细心的网友可能已经发现,打开百度页面后,点击顶部的链接,会在手机的浏览器中打开相应的页面,这显然不是我们希望的. 在onCreate中添加如下代码 webview.setWebViewClient(new WebViewClient()         {             public boolean shouldOverrideUrlLoading(WebView view,Strin

Ace教你一步一步做Android新闻客户端(一)

复制粘贴了那么多博文很不好意思没点自己原创的也说不出去,现在写一篇一步一步教你做安卓新闻客户端,借此机会也是让自己把相关的技术再复习一遍,大神莫笑,专门做给新手看. 手里存了两篇,一个包括软件视图 和新手引导 软件侧滑菜单 滑动主页的GUI篇 一个内容解析篇. 代码里有很详细的注释 所以直接放代码了 有不会的站内信或者评论我会及时回复. MainActivity XML :只有一个ListView布局 <?xml version="1.0" encoding="utf-

Android自定义View(四)----一步一步教你实现QQ健康界面

最近一直在学习自定义View相关的知识,今天给大家带来的是QQ健康界面的实现.先看效果图: 可以设置数字颜色,字体颜色,运动步数,运动排名,运动平均步数,虚线下方的蓝色指示条的长度会随着平均步数改变而进行变化.整体效果还是和QQ运动健康界面很像的. 自定义View四部曲,一起来看看怎么实现的. 1.自定义view的属性: <?xml version="1.0" encoding="utf-8"?> <resources> //自定义属性名,定

教你一步一步实现图标无缝变形切换

我的简书同步发布:教你一步一步实现图标无缝变形切换 ?欢迎打赏? 转载请注明出处:[huachao1001的专栏:http://blog.csdn.net/huachao1001] 本来这篇文章几天前就应该写好并发布出来的,由于要写小论文,被导师劈头盖脸的骂了几天,一直在搞论文,耽误了博文的编写.今天终于把小论文给投出去了,终于可以好好写博客了! 在上一篇文章<酷炫的Activity切换动画,打造更好的用户体验 >中,我们感受到了过渡切换动画带来的不一样的用户体验.如何你还意犹未尽,那么今天我

一步一步教你如何重装笔记本电脑系统?

本文标签:  电脑技巧 重装笔记本电脑系统 重装系统 重装dell联想宏碁电脑系统 原文地址:http://whosmall.com/?post=461 不知不觉中,已在程序猿这个职业中疯狂熬过去了3年时间,这3年虽然苹果技术天天更新,天天进步,但是如计算机常识方面却不忍心看它还是原地踏步! 从事编程时间久了,每次回家的时候,免不了会有朋友说起听说你从事计算机工作的吧,是啊,那帮我装个系统吧,最近电脑卡的要命.我家网线坏了,帮我连下网线吧!更有甚者,说我刚才误删某某重要文件,帮我恢复下吧! 你要

一步一步教你分享开源项目到 Maven 中心仓库

欢迎各位关注我的新浪微博:http://weibo.com/kifile 转载请标明出处(http://blog.csdn.net/kifile) 相信很多程序猿朋友都或多或少写过一些通用库文件,也有很多人会秉着开源的精神将代码分享到类似 Github 之类的代码托管网站去. 其实大家分享代码的时候,目的在于让更多的人使用,但是如果仅仅是放在 Github 这些工具上等人家下载使用,其实很多人是会觉得很麻烦的,那么有什么方法能够帮助我们在不下载 Github 上的源码的时候,使用这些代码吗? 回

Android 从硬件到应用:一步一步向上爬 6 -- 编写APP测试框架层硬件服务(完)

创建Android Application工程:使用Eclipse的Android插件ADT创建Android工程,工程名称为Gpio,创建完成后将工程目录拷贝到packages/apps/文件夹下,并删除工程目录下的gen文件夹,不删除的话会造成类重复的错误. src/com/android/gpio/Gpio.java: package com.android.gpio; import com.android.gpio.R; import android.app.Activity; impo

Android 从硬件到应用:一步一步向上爬 4 -- 使用 JNI 方法调硬件驱动

Android下,java应用程序通过JNI方法调用硬件抽象层模块,在Android 从硬件到应用:一步一步向上爬 3 -- 硬件抽象层访问硬件驱动 中我们已经编译好了硬件抽象层模块,下面就要开始为HAL层编写JNI方法,为上层提供服务. cd到frameworks/base/services/jni目录中,新建一个com_android_server_GpioService.cpp文件: #include "jni.h" #include "JNIHelp.h"