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. 根据字符出现频率排序
  2. Mac OS X的快捷键
  3. 用MyEclipse自动生成hibernate映射文件和实体类
  4. Java正則表達式詳解
  5. SQL Server里一些未公开的扩展存储过程
  6. GPS使用记录NMEA数据解析、RTK定位以及ntrip协议
  7. SegmentFault D-Day 2016 年度总结报告
  8. opencv调取摄像头
  9. AB工业计算机编程软件,罗克韦尔/AB VersaView 5100 工业监视器
  10. libcef-常用概念-框架特点
  11. 石家庄地铁售票系统源代码
  12. AdGuard 无与伦比的广告拦截
  13. 《可转债入门十讲》笔记
  14. 互联网黑话大全 最新词汇 黑话生成器
  15. Hibernate安装教程
  16. DBCP C3PO Druid三种数据库连接
  17. win10系统可禁用的服务器,window10哪些服务可以禁止
  18. 什么是repo文件?
  19. 用DVD片刻录多部VCD影片
  20. 创建算法交易机器人:用MQL4编写Expert Advisor的基础

热门文章

  1. windbg输出SXS.DLL的调试信息
  2. 认知升级篇:了解我们的大脑
  3. 怎么查看Linux系统中的内存?
  4. 三角函数$y=Asin(\omega x+\phi)$的图像和性质
  5. Google Earth Engine(GEE)——2015-2019年100米分辨率的动态土地覆盖数据集(CGLS-LC100)
  6. Clickhouse分享
  7. 为什么我们需要monad?
  8. 基于python的论文分析_【论文实现】一篇Sigkdd的弹幕分析论文的python实现【LDA 实践者】...
  9. 1003 Emergency 题目解析
  10. Ubuntu 18.04 开机进入emergency mode