Java 如何在Android应用程序中切换用户?

Java 如何在Android应用程序中切换用户?,java,android,Java,Android,如果我想在两个android用户(Alice(所有者)和Bob)之间切换,我正在尝试构建一个应用程序。当Alice是当前用户时,我想打开应用程序并按下按钮,然后切换到Bob的帐户,反之亦然。) 我使用DevicePolicyManager类将应用程序设置为设备管理员,这样我就可以使用switchUser方法,但我不明白如何设置userHandler以便切换用户 public class DevicePolicyAdmin extends Activity { protected stat

如果我想在两个android用户(Alice(所有者)和Bob)之间切换,我正在尝试构建一个应用程序。当Alice是当前用户时,我想打开应用程序并按下按钮,然后切换到Bob的帐户,反之亦然。)

我使用
DevicePolicyManager
类将应用程序设置为设备管理员,这样我就可以使用
switchUser
方法,但我不明白如何设置
userHandler
以便切换用户

public class DevicePolicyAdmin extends Activity {
    protected static final int REQUEST_ENABLE = 1;
    DevicePolicyManager appDevicePolicyManager;
    ComponentName appDevicePolicyAdmin;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_device_policy_admin);
        appDevicePolicyManager = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);
        appDevicePolicyAdmin = new ComponentName(this,
                MyDevicePolicyReceiver.class);
        Intent intent = new Intent(
                DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);
        intent.putExtra(
                DevicePolicyManager.EXTRA_DEVICE_ADMIN,
                appDevicePolicyAdmin);
        intent.putExtra(
                DevicePolicyManager.EXTRA_ADD_EXPLANATION,
                getString(R.string.admin_explanation));
        startActivityForResult(intent, REQUEST_ENABLE);
    }

    @Override
    protected void onResume() {
        super.onResume();
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        appDevicePolicyManager.switchUser(appDevicePolicyAdmin, android.os.Process.myUserHandle());
    }
}
我尝试的另一种方法是使用
AccountManager
类,但我只能获取当前用户的电子邮件。这个类似乎没有
switchUser
方法

AccountManager manager = (AccountManager) getSystemService(ACCOUNT_SERVICE);
Account[] list = manager.getAccountsByType("com.google");

StringBuilder builder = new StringBuilder();

for (Account s : list)
{
    builder.append(s + " ");
}
setContentView(R.layout.activity_device_policy_admin);
TextView txt = (TextView) findViewById(R.id.textView);
txt.setText(builder.toString());
下面是我试图实现的一幅图

它基本上是一个应用程序,它的功能与我们进入“设置”菜单>“用户”的功能相同

现在我只是想了解android是否允许我以编程方式切换用户帐户

好的,我只想回答问题的这一部分,因为您没有提到任何关于远程服务器及其作用的内容

答案是:是的,您可以通过编程方式更改帐户。您可以将帐户数据存储在SQLite数据库中(困难的方法),也可以在内部使用
AccountManager
(更困难的方法)

困难的方法:使用SQLite表管理帐户数据

如果你不需要更复杂的功能,比如后台的远程数据同步,你可以自己定义“帐户”对你的应用程序意味着什么。没有任何东西要求您在应用程序中使用
AccountManager
功能。您可以使用SQLite表来保存用户名以及需要与该用户关联的任何其他数据。请记住,您的应用程序将需要一些管理功能来维护account表,因此您还必须对其进行编码

一旦您拥有每个用户帐户的数据,您甚至可以创建一个活动来列出所有用户并选择要登录的用户(如果需要)

更难的方法是:编写一个帐户验证器,插入到
AccountManager

我这样做是为了我的应用程序,这是一个真正的挑战。我不推荐像你这样刚开始使用Android的人使用它,但如果你想使用Android的远程数据同步功能,你可能需要这样做

我建议大家将本文作为使用Android身份验证的最佳指南:

你的应用程序应该有自己的帐户类型(“com.whatever”);你不必使用谷歌账户。拥有自定义身份验证器还可以让您通过设备上的设置(帐户)管理帐户,因此您甚至不必运行应用程序。本文对此进行了描述

AccountManager
和friends还提供一个内置活动,从设备上已有的帐户列表中选择一个帐户



这只是一个概述;正如他们所说的,魔鬼在于细节。您必须了解用户和管理员的流程,应用程序如何与远程服务器协同工作(例如,使用会话),以及您的设计是否解决了所有安全风险(如果设备上存储了密码,我会暴露多少风险?

听起来您想作为管理员这样做。让Alice注销以便Bob登录是否足够?或者管理员必须进行切换?每个用户都应该能够进行切换。示例:Alice打开应用程序,单击按钮并切换到用户bob。Bob还可以打开应用程序并切换回Alice。我可以试试你的方法。让Alice注销以便Bob可以登录。关于我如何实现这一点的任何想法。昨天刚开始学习android,我对API不太了解。你的应用程序的“帐户”概念是什么?用户是否必须针对服务器进行身份验证?您是否有自己的应用服务器和帐户/密码?或者你在使用第三方,比如Facebook或谷歌?或者用户根本不需要密码?如何为设备创建帐户?你怎么决定,“好吧,艾丽丝有账户,鲍勃有账户”。对不起,所有的问题,这是所有的东西,必须考虑制作应用程序。对于刚开始使用Android的人来说,这是一个很高的要求!我可以向你展示两种方式:一种是艰难的方式,另一种是更艰难的方式。目前,账户是本地创建的,也可以手工创建。我有一部手机,它以用户(所有者)开始,然后手动创建其他帐户。未来的想法是,该应用程序显示二维码。用户用手机扫描二维码,我检查存储在is phone中的用户凭据,然后将验证多个用户在手机is帐户中的用户的凭据发回。但现在我只是想了解android是否允许我以编程方式切换用户帐户。可能吗?怎么用?我喜欢艰巨的任务。这是学习的唯一方法……等等——只是想弄清楚——以下陈述正确吗?1.您只想更改应用程序中的用户帐户。2.您不想更改整个设备的用户帐户。非常感谢您提供如此详细的答案。“更难的方法”在我项目的第二阶段会非常有用。有一件事我仍然不知道,那就是我如何获得第二个用户的详细信息。例如,如果Alice登录,我就看不到Bob的详细信息(帐户)。(我使用链接中提供的示例进行了测试)。但是,现在,我将把身份验证留到以后。我将尝试实施“艰难之路”,因为它似乎更符合我现在的需要。它必须是一个谷歌帐户吗?你的应用程序可以有自己的帐户类型吗?如果你的应用程序有自己的帐户类型,那么你可以设置它,以便Alice可以登录到你的应用程序,但你仍然可以看到Bob的帐户详细信息