添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
public void createUser() {
    try {
        UserManager mUserManager = (UserManager) getSystemService(Context.USER_SERVICE);
        mUserManager.createUser("test", 0);            
    } catch (Exception e) {
        e.printStackTrace();
    } catch (NoClassDefFoundError e) {
        e.printStackTrace();

声明相关权限:

    <uses-permission android:name="android.permission.MANAGE_USERS"/>
    <uses-permission android:name="android.permission.CREATE_USERS"/>

编写代码时发现,eclipse根本调用不到createUser这个方法…
在这里插入图片描述
这是为什么呢?可能是系统隐藏了这个方法。
frameworks/base/core/java/android/os/UserManager.java

* Creates a user with the specified name and options. For non-admin users, default user * restrictions are going to be applied. * Requires {@link android.Manifest.permission#MANAGE_USERS} permission. * @param name the user's name * @param flags flags that identify the type of user and other properties. * @see UserInfo * @return the UserInfo object for the created user, or null if the user could not be created. * @hide public UserInfo createUser(String name, int flags) { UserInfo user = null; try { user = mService.createUser(name, flags); // TODO: Keep this in sync with // UserManagerService.LocalService.createUserEvenWhenDisallowed if (user != null && !user.isAdmin() && !user.isDemo()) { mService.setUserRestriction(DISALLOW_SMS, true, user.id); mService.setUserRestriction(DISALLOW_OUTGOING_CALLS, true, user.id); } catch (RemoteException re) { throw re.rethrowFromSystemServer(); return user;

果然,Android源码里面果然声明了@hide,那这个现象就是正常的了。那么,怎样才能调用createUser方法呢?

3.解决问题

3.1 反射调用

直接调用不行,那就尝试反射吧。

public void createUser() {
    try {
        UserManager mUserManager = (UserManager) getSystemService(Context.USER_SERVICE);
        //mUserManager.createUser("test", 0);
        // Class<?> cls = Class.forName("android.os.UserManager");
        Class<?> cls = UserManager.class;
        Method createUser = cls.getMethod("createUser", String.class, int.class);
        Log.d(TAG, "createUser = " + createUser.getName());
        Object objRet1 = createUser.invoke(mUserManager, "test", 0);
        Log.d(TAG, "ret = " + objRet1);
    } catch (Exception e) {
        e.printStackTrace();
    } catch (NoClassDefFoundError e) {
        e.printStackTrace();

经验证,反射调用的这段代码是可以的。

3.2 引入layoutlib.jar

客户反馈不需要反射,应用可以直接调用这个方法。为什么我调用不了呢?继续分析,猜测跟layoutlib.jar有关,尝试eclipse工程引入layoutlib.jar。
在这里插入图片描述

如何引用layoutlib.jar就不多介绍了,很简单。如上图,引用layoutlib.jar。发现还是调用不了。究竟是什么原因呢?

import android.os.UserManager;

跟踪UserManager,发现这个类还是定义在android.jar里面,layoutlib.jar没有生效。
在这里插入图片描述
可能跟jar包的顺序有关,调整一下优先级,把layoutlib.jar调到第一位。
在这里插入图片描述
再看一下引用关系。
在这里插入图片描述
如上图,现在UserManager已经是layoutlib.jar里面的了,说明引用正确了。
现在确认一下能否调用createUser方法。
在这里插入图片描述
eclipse没有报错了,说明layoutlib.jar里面确实有UserManager的createUser方法。

4.为什么需要platform签名

看一下权限是如何定义的。
frameworks/base/core/res/AndroidManifest.xml

   <!-- @SystemApi @hide Allows an application to call APIs that allow it to query and manage
         users on the device. This permission is not available to
         third party applications. -->
    <permission android:name="android.permission.MANAGE_USERS"
        android:protectionLevel="signature|privileged" />
    <!-- @hide Allows an application to create, remove users and get the list of
         users on the device. Applications holding this permission can only create restricted,
         guest, managed, demo, and ephemeral users. For creating other kind of users,
         {@link android.Manifest.permission#MANAGE_USERS} is needed.
         This permission is not available to third party applications. -->
    <permission android:name="android.permission.CREATE_USERS"
        android:protectionLevel="signature" />

signature级别的权限,需要申请者和定义者具有相同的签名。
这两个权限是在framework-res.jar里面定义的,而framework-res.jar是platform签名,所以申请者也需要platform签名,才能得到这两个权限。
关于Android权限管理机制,参考这篇文章:
https://blog.csdn.net/xhaotianshenjian/article/details/81535259

1. 概述当前版本(Android 5.1)下,多用户管理适用于平板模式(手机版本可能受限于版本等原因)。 多用户模式下,不同用户运行在不同的用户空间,共享具体的应用实例(即不同的用户下,其应用版本是一致的),但拥有各自不同的配置。 本文不会对具体的代码进行解读,只会对相关概念、关联性较强的部分加以说明,目的在于对Android下多用户管理进行整体描述。 主要相关的代码路径如下: Android UserManagerService初始化,它主要设置用户类型,得到用户数据。在最开始不存在/data/system/users/userlist.xml的情况下,会回落到单用户模式。生成用户以后,它会将用户信息保存成/data/system/users/id.xml,将用户列表保存成/data/system/users/userlist.xml。他还会得到系统包能被哪些用户类型安装。 直到Android 6.0,Android多用户才比较完善,国内外的厂家也纷纷开始针对多用户这个噱头来做各种 “花里胡哨” 的操作,“手机分身”、“分身应用”、“应用双开” 应运而生,不得不说,国内的厂家在多用户这方面定制化到如今已经非常稳定和完善了。 我们可以感受到,在Android 4.2中的一个比较显著的改变就是加入了多用户的支持。因多用户手机专利早已被Symbian雇员注册,故 android官方的多用户切换目前仅支持我们可以感受到,在Android 4.2中的一个比较显著的改变就是加入了多用户的支持。因多用户手机专利早已被Symbian雇员注册,故 android官方的多用户切换目前仅支持平板设备。多用户模式的启用系统判断当前设备是否支... 访问登记属性 android.permission.ACCESS_CHECKIN_PROPERTIES ,读取或写入登记check-in数据库属性表的权限 获取错略位置 android.permission.ACCESS_COARSE_LOCATION,通过WiFi或移动基站的方式获取用户错略的经纬度信息,定位精度大概误差在30~1500米 获取精确位置 andr 概述最近接到老大安排的任务,评估一下android多用户管理在车载系统上的可行性,并提供评估报告,现把报告总结记录下,便于后期查询。需求及产品应用桌面系统早已提供多用户支持。很多家庭都是“多人共用一台电脑”,支持多用户的功能可谓不得不有。那么车载系统是否存在同样的问题?由于汽车的价格不菲,对于大部分车主及家庭而言,多人共开一辆汽车是再正常不过了。在Android 4.2中加入了多用户的支持,但是只... android从4.2开始便添加了多用户功能,其具体的管理者为UserManager.多用户模式的启用系统判断当前设备是否支持多用户模式的依据是配置文件config.xml 中的config_multiuserMaximumUsers 和config_enableMultiUserUI 配置项。 &lt;!-- Maximum number of supported users --&gt...