当前位置: 首页 > 面试题库 >

如何在Android中以编程方式添加自定义帐户?

罗翰
2023-03-14
问题内容

我正在尝试为我的应用程序创建一个帐户,在该帐户中我可以与我的帐户建立联系,例如facebook,viber,whatsapp等。我也希望我的帐户在设置的“帐户”部分中可见。有任何想法吗?我已经在Google上搜索了很多,但是找不到正确的答案从哪里开始。请帮忙。我试图创建一个帐户如下。这导致我出错。

Account account = new Account("Title", "com.package.nom");
               String password = "password";

               AccountManager accountManager =
                       (AccountManager) MainPanel.this.getSystemService(
                               ACCOUNT_SERVICE);
               accountManager.addAccountExplicitly(account, password, null);

问题答案:

您需要设置多个组件才能以编程方式创建一个帐户。你需要:

  • AccountAuthenticator
  • 提供访问AccountAuthenticator的服务
  • 一些权限

认证者

验证者是一个对象,它将在有权管理它的帐户类型和授权者(即linux用户)之间进行映射。

声明身份验证器 是在xml中完成的:

  • 创建一个文件 res/xml/authenticator.xml

具有以下内容:

<?xml version="1.0" encoding="utf-8"?>
<account-authenticator xmlns:android="http://schemas.android.com/apk/res/android"
                   android:accountType="com.company.demo.account.DEMOACCOUNT"
                   android:icon="@drawable/ic_launcher"
                   android:smallIcon="@drawable/ic_launcher"
                   android:label="@string/my_custom_account"/>

请注意accountType:创建帐户时,必须在代码中重用它。图标和标签将由“设置”应用使用,以显示该类型的帐户。

实施AccountAuthenticator

您必须扩展AbstractAccountAuthenticator才能做到这一点。第三方应用程序将使用它来访问帐户数据。

以下示例不允许任何对第三方应用程序的访问,因此每种方法的实现都很简单。

public class CustomAuthenticator extends AbstractAccountAuthenticator {

    public CustomAuthenticator(Context context) {
        super(context);
    }

    @Override
    public Bundle addAccount(AccountAuthenticatorResponse accountAuthenticatorResponse, String s, String s2, String[] strings, Bundle bundle) throws NetworkErrorException {
        return null;  //To change body of implemented methods use File | Settings | File Templates.
    }

    @Override
    public Bundle editProperties(AccountAuthenticatorResponse accountAuthenticatorResponse, String s) {
        return null;  //To change body of implemented methods use File | Settings | File Templates.
    }

    @Override
    public Bundle confirmCredentials(AccountAuthenticatorResponse accountAuthenticatorResponse, Account account, Bundle bundle) throws NetworkErrorException {
        return null;  //To change body of implemented methods use File | Settings | File Templates.
    }

    @Override
    public Bundle getAuthToken(AccountAuthenticatorResponse accountAuthenticatorResponse, Account account, String s, Bundle bundle) throws NetworkErrorException {
        return null;  //To change body of implemented methods use File | Settings | File Templates.
    }

    @Override
    public String getAuthTokenLabel(String s) {
        return null;  //To change body of implemented methods use File | Settings | File Templates.
    }

    @Override
    public Bundle updateCredentials(AccountAuthenticatorResponse accountAuthenticatorResponse, Account account, String s, Bundle bundle) throws NetworkErrorException {
        return null;  //To change body of implemented methods use File | Settings | File Templates.
    }

    @Override
    public Bundle hasFeatures(AccountAuthenticatorResponse accountAuthenticatorResponse, Account account, String[] strings) throws NetworkErrorException {
        return null;  //To change body of implemented methods use File | Settings | File Templates.
    }
}

公开帐户类型的服务

创建一个服务来操纵该类型的帐户:

public class AuthenticatorService extends Service {
    @Override
    public IBinder onBind(Intent intent) {
        CustomAuthenticator authenticator = new CustomAuthenticator(this);
        return authenticator.getIBinder();
    }
}

在清单中声明服务

<service android:name="com.company.demo.account.AuthenticatorService" android:exported="false">
        <intent-filter>
            <action android:name="android.accounts.AccountAuthenticator"/>
        </intent-filter>
        <meta-data
            android:name="android.accounts.AccountAuthenticator"
            android:resource="@xml/authenticator"/>
    </service>

这里,引用声明身份验证器的xml资源的过滤器和元数据是关键点。

权限

在清单中,请确保声明以下权限

<uses-permission android:name="android.permission.AUTHENTICATE_ACCOUNTS"/>
<uses-permission android:name="android.permission.GET_ACCOUNTS"/>
<uses-permission android:name="android.permission.MANAGE_ACCOUNTS"/>

(并非本文中提供的示例代码所需的全部,但您可能还会有一些有关帐户管理的代码,最后它们将非常有用)

用代码创建一个帐户

现在一切就绪,您可以使用以下代码创建一个帐户。注意boolean通过返回addAccountExplicitly通知您的成功或失败。

    AccountManager accountManager = AccountManager.get(this); //this is Activity
    Account account = new Account("MyAccount","com.company.demo.account.DEMOACCOUNT");
    boolean success = accountManager.addAccountExplicitly(account,"password",null);
    if(success){
        Log.d(TAG,"Account created");
    }else{
        Log.d(TAG,"Account creation failed. Look at previous logs to investigate");
    }

最后提示

不要在外部存储上安装您的应用

如果您的应用程序安装在外部存储设备上,则很有可能在卸载sdcard时Android删除您的帐户数据(因为该帐户的身份验证器将不再可用)。因此,为避免这种损失(每次重新启动!!!),您必须仅在内部存储上安装声明身份验证器的应用程序:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      android:installLocation="internalOnly"
      ...

万一遇到麻烦

仔细阅读日志,AccountManger将输出许多日志以帮助您调试代码。



 类似资料:
  • 我想以编程方式在liferay中添加站点,因此我创建了一个负责以编程方式添加站点的portlet,但它不起作用,所以请任何人在这方面帮助我。当我单击create site is时,我得到的错误是。这是我的代码: &这是我的sites.java,它是一个操作文件: 我的日志文件是:

  • 我正在使用SpringDoc,并试图以编程方式向OpenApi添加一个模式,但没有成功。 mySchema的描述没有添加到我在生成的YAML文件中看到的模式列表中,如果我试图引用它:

  • 我正在尝试在Android上添加Wifi网络,我想知道如何连接到不广播其SSID的Wifi网络(它是否有空SSID或带有\0s的清晰SSID)。 这是我目前用于广播其SSID的Wifi网络的内容:

  • 问题内容: 我有一个使用动态表单的页面,在该页面上以编程方式创建了组件树(这个问题不值得讨论),我需要呈现的某些输入控件需要ajax处理程序。 xhtml片段(包含在另一个片段中)是: 基于其他SO解答,我有以下Bean代码: 这可以正确渲染,我看到: 但是,单击单选按钮会给我一个JavaScript控制台错误: 现在,如果我修改xhtml以包括“普通” ajax控件,例如 这项工作正常,萤火虫网

  • 问题内容: 我想在头部分中以编程方式添加StyleSheets,但是我看到的示例之一似乎需要多行代码才能仅添加一个样式表,即使我可能需要很多: 示例代码: 我也使用方法,但是它也不起作用。对象null抛出了错误。 我也使用了和东西,但是它们抛出了文字错误,这是我认为的常见错误。 我使用此代码: 起初它起作用,但是当我更改页面时,它停止工作。 我正在使用“母版页”,并且正在文件中编写这些代码,也有人

  • 我试图在logback中动态添加一个appender。这是我的代码。 它工作正常,但仅适用于添加追加器的特定记录器。有没有办法让它适用于应用程序中的所有记录器?我正在寻找一种动态添加和删除追加器的方法。