Andriod5.0多用户 双开应用

android多用户是5.0之后有的,类似windows的账户系统

不过官方还没有完全确认,API大都是hide状态

我这里提供一种方式并不适用所有的,由于我们有定制化手机,所以有定制化的服务可以开发,所以只需要将源码平台化编译一把,将所需要的类抽取出来,打成jar,再通过AIDL方式暴露出相应的接口,当然这个服务也是系统服务。我们再去开发只需要调用相应AIDL提供相应的接口即可。

下面来详细的说明:

1.首先系统服务

android:sharedUserId="android.uid.system"

签名的时候需要平台对应的签名文件需要signapk.jar签名之后生成apk安装即可

2.将需要的类打成jar(5.0以上版本编译后的class)

在out/target/common/obj/Java_Libraries/framework_intermediates..找到相应的对应的class

源文件

IuserMannager.aidlpackageandroid.os;importandroid.os.Bundle;importandroid.content.pm.UserInfo;importandroid.content.RestrictionEntry;importandroid.graphics.Bitmap;/*** {@hide}*/interfaceIUserManager {UserInfocreateUser(in String name, int flags); //创建UserUserInfocreateProfileForUser(in String name, int flags, int userHandle);voidsetUserEnabled(int userHandle);booleanremoveUser(int userHandle); //移除UservoidsetUserName(int userHandle, String name);voidsetUserIcon(int userHandle, in Bitmap icon);BitmapgetUserIcon(int userHandle);List<UserInfo>getUsers(boolean excludeDying); //得到UsersList<UserInfo>getProfiles(int userHandle, boolean enabledOnly);UserInfogetProfileParent(int userHandle);UserInfogetUserInfo(int userHandle);booleanisRestricted();intgetUserSerialNumber(int userHandle);intgetUserHandle(int userSerialNumber);BundlegetUserRestrictions(int userHandle);booleanhasUserRestriction(in String restrictionKey, int userHandle);voidsetUserRestrictions(in Bundle restrictions, int userHandle);voidsetApplicationRestrictions(in String packageName, in Bundlerestrictions,intuserHandle);BundlegetApplicationRestrictions(in String packageName);BundlegetApplicationRestrictionsForUser(in String packageName, intuserHandle);booleansetRestrictionsChallenge(in String newPin);intcheckRestrictionsChallenge(in String pin);booleanhasRestrictionsChallenge();voidremoveRestrictions();voidsetDefaultGuestRestrictions(in Bundle restrictions);BundlegetDefaultGuestRestrictions();booleanmarkGuestForDeletion(int userHandle);}

3.写好相应的方法调用:

<pre name="code" class="java">    /*** 得到 IUserManager* @return IUserManager*/private IUserManager getIUserManager(){IUserManager iUserManager = null;IBinder binder = null;try {if(iUserManager==null){Class<?> ServiceManagerClass = Class.forName("android.os.ServiceManager");Method method = ServiceManagerClass.getMethod("getService", String.class);if(binder==null){binder = (IBinder) method.invoke(ServiceManagerClass, Context.USER_SERVICE);}iUserManager = IUserManager.Stub.asInterface(binder);return iUserManager;}} catch (Exception e) {e.printStackTrace();}return null;        }

public UserInfo createUser(String name, int flags){
                    UserInfo info = null;
                    IUserManager iUserManager = getIUserManager();
                    if(info == null){
                        try {
                            info = iUserManager.createUser(name, flags);
                             loguser(iUserManager);
                            return info;
                        } catch (RemoteException e) {
                            e.printStackTrace();
                        }
                    }
                return null;
    }
    
    public UserInfo getUserInfo(int userHandle){
        UserInfo info = null;
        IUserManager iUserManager = getIUserManager();
        if(info == null){
            try {
                info = iUserManager.getUserInfo(userHandle);
                 loguser(iUserManager);
                return info;
            } catch (RemoteException e) {
                e.printStackTrace();
            }
        }
        return null;
    }
    
    public boolean removeUser(int userHandle){
        IUserManager iUserManager = getIUserManager();
        boolean isremove = false;
        try {
            isremove = iUserManager.removeUser(userHandle);
             loguser(iUserManager);
            return isremove;
        } catch (RemoteException e) {
            e.printStackTrace();
        }
        return false;
    }

4写一个AIDL我这里是通过回调方式写的,不熟悉的同学可以回去看看AIDL

case SERVICE_EXTENDED_API_CREATE_USER_MODE:{
//TODO
if(para!=null){
String name = para.getString(KEY_USER_NAME);
int flags = para.getInt(KEY_USER_FLAG);
UserInfo info = muserPolicy.createUser(name, flags);
if(info!=null){
if (cb != null) {
Bundle data = new Bundle(1);
data.putParcelable(KEY_USER_INFO, info);
try {
cb.onResultOfCallExtendedApi(SERVICE_EXTENDED_API_CREATE_USER_MODE, data);
} catch (RemoteException e) {
e.printStackTrace();
}
}
}
}
return 0;
}
case SERVICE_EXTENDED_API_GET_USER_INFO:{
if(para!=null){
int userHandle = para.getInt(KEY_USER_HANDLER);
UserInfo info = muserPolicy.getUserInfo(userHandle);
if(info !=null){
if (cb != null) {
Bundle data = new Bundle(1);
data.putParcelable(KEY_USER_INFO, info);
try {
cb.onResultOfCallExtendedApi(SERVICE_EXTENDED_API_GET_USER_INFO, data);
} catch (RemoteException e) {
e.printStackTrace();
}
}
}
}
return 0;
}
case SERVICE_EXTENDED_API_REMOVE_USER:{
if(para!=null){
int userHandle = para.getInt(KEY_USER_HANDLER);
boolean isremove = muserPolicy.removeUser(userHandle);
if (cb != null) {
Bundle data = new Bundle(1);
data.putBoolean(KEY_USER_IS_REMOVE, isremove);
try {
cb.onResultOfCallExtendedApi(SERVICE_EXTENDED_API_REMOVE_USER, data);
} catch (RemoteException e) {
e.printStackTrace();
}
}
}
return 0;
}

5.再在需要的应用上调用服务端相应的接口:

启动的时候需要bind系统服务

private void init(){Intent intent1 = new Intent();intent1.setPackage("com.xxx.xxx");intent1.setAction("com.xxx.xxxService");bindService(intent1, conn1, Context.BIND_AUTO_CREATE);}case R.id.btn_create:Bundle create = new Bundle();create.putString("username", "Zeng");try {if(ips!=null){ips.callExtendedApi(22, create, ipsc);}else{Log.e("peng","onclickcreate serviceisnull");}} catch (RemoteException e) {e.printStackTrace();}break;case R.id.btn_get:Bundle get = new Bundle();get.putInt("userHandle", mhandle);try {if(ips!=null){ips.callExtendedApi(23, get, ipsc);}else{Log.e("peng","onclickget serviceisnull");}} catch (RemoteException e) {e.printStackTrace();}break;case R.id.btn_remove:int i = Integer.parseInt(et_text.getText().toString().trim());Bundle remove = new Bundle();remove.putInt("userHandle", i);try {if(ips!=null){ips.callExtendedApi(24, remove, ipsc);}else{Log.e("peng","onclickremove serviceisnull");}} catch (RemoteException e) {e.printStackTrace();}break;

对应的callback可以返回对应的数据。

android 5.0 创建多用户 双开多开应用(1)相关推荐

  1. Android多用户相关命令,android 5.0 创建多用户 双开多开应用(1)(示例代码)

    Andriod5.0多用户 双开应用 android多用户是5.0之后有的,类似windows的账户系统 不过官方还没有完全确认,API大都是hide状态 我这里提供一种方式并不适用所有的,由于我们有 ...

  2. android 获取用户双开,android 5.0 创建多用户 双开多开应用(1)

    Andriod5.0多用户 双开应用 android多用户是5.0之后有的,类似windows的账户系统 不过官方还没有完全确认,API大都是hide状态 我这里提供一种方式并不适用所有的,由于我们有 ...

  3. Android 8.0 创建管理通知渠道Notification

    从Android8.0(API26)开始,所有的通知必须分配一个渠道.每一个渠道,你都可以设置渠道中所有通知的视觉和听觉行为.然后,用户能够随意修改这些设置来决定通知的行为. 在用户界面渠道显示为 & ...

  4. Android 8.0 创建桌面快捷方式

    1. 前言:公司有个给app创建桌面快捷方式的功能.  有一天,测试来说,有款手机,点击快捷方式,无反应.  2.思考:大多数手机是好的,考虑是兼容性问题. 1)经查看,问题机是  华为mate9  ...

  5. Android 10.0创建恢复出厂设置不被清除的文件夹节点

    在系统开发中,希望保存一些数据 在恢复出厂设置以后也不会被清理掉,这样就希望创建的节点不在被清理的范围内 而recovery主要会清理 /data/ 和 /cache 分区的数据 卸载安装的app A ...

  6. android 7.0 创建热点,win7创建wifi热点脚本分享

    说明一下,此功能只适用于win7系统,并且保证电脑有无线网卡,和正确安装了驱动.还需要做的一步就是共享已连接的网络,方法可以百度. 以下文件保存成wlan.bat文件,然后运行就可以了 @echo o ...

  7. Android Studio3.0新特性

    3.0(2017年10月) Android Studio 3.0.0是一个主要版本,包括各种新功能和改进. macOS用户:如果您正在更新旧版本的Android Studio,则可能会遇到一个更新错误 ...

  8. android添加截图功能,Android应用开发之Android 5.0及以上编程实现屏幕截图功能的方法...

    本文将带你了解Android应用开发Android 5.0及以上编程实现屏幕截图功能的方法,希望本文对大家学Android有所帮助. 本文实例讲述了Android   5.0及以上编程实现屏幕截图功能 ...

  9. 《深入解析Android 5.0系统》——第1章,第1.2节安装开发包

    本节书摘来自异步社区<深入解析Android 5.0系统>一书中的第1章,第1.2节安装开发包,作者 刘超,更多章节内容可以访问云栖社区"异步社区"公众号查看 1.2 ...

最新文章

  1. JDk8的新特性-流和内部iteration
  2. java 实现loading效果_简单实现JS Loading功能
  3. java list作为参数传递_Java 程序将lambda表达式作为方法参数传递
  4. oracle11gr2配置监听,Windows环境配置Oracle 11gR2 Listener
  5. Java序列化机制原理,java面试题,java基础笔试题,BAT
  6. expect自动登录以及远程脚本执行
  7. wiznote can't networking
  8. java计算器代码_java计算器源代码(新手入门级)
  9. 大数据之路:阿里巴巴大数据实践(数据模型篇)
  10. Photoshop之快速蒙版Q
  11. 按洲划分的国家和地区代码整理 包含:中文名 英文名 洲 首字母 两位英文代码 三位英文代码 三位数据代码 洲
  12. 参数校验@Valid
  13. EPICS S7nodave手册
  14. 数据结构实训——运动会分数统计
  15. springboot使用rocketmq-spring-boot-starter整合RocketMQ
  16. 通讯录搜索排序 类似微信通讯录
  17. 王朝落日,读《万历十五年》
  18. android番茄钟计时器
  19. 学习UCGUI的苦闷!!
  20. js检查中英文数字的正则表达式,检查特殊字符

热门文章

  1. 一、实现欢迎界面和游戏背景图的滚动(雷霆战机)
  2. ZZULIOJ1019
  3. yarn-cluste问题
  4. S2B2C平台协同管理业务详解 | 数商云S2B2C系统赋能新能源汽车行业高价值增长
  5. boa linux arm修改网卡,移植Boa Web服务器到ARM-Linux系统
  6. 双色球机选号码生成器(java)
  7. 2015年8月淡季成都到稻城亚丁自驾游自己的攻略
  8. 我为何从开发人员转做测试,3年软件测试工程师,带你聊聊这其中的秘辛
  9. 树莓派 4G无线上网卡托+电信/移动4G SIM卡
  10. 怎样grep出匹配组的信息并得到唯一输出