android 5.0 创建多用户 双开多开应用(1)
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)相关推荐
- Android多用户相关命令,android 5.0 创建多用户 双开多开应用(1)(示例代码)
Andriod5.0多用户 双开应用 android多用户是5.0之后有的,类似windows的账户系统 不过官方还没有完全确认,API大都是hide状态 我这里提供一种方式并不适用所有的,由于我们有 ...
- android 获取用户双开,android 5.0 创建多用户 双开多开应用(1)
Andriod5.0多用户 双开应用 android多用户是5.0之后有的,类似windows的账户系统 不过官方还没有完全确认,API大都是hide状态 我这里提供一种方式并不适用所有的,由于我们有 ...
- Android 8.0 创建管理通知渠道Notification
从Android8.0(API26)开始,所有的通知必须分配一个渠道.每一个渠道,你都可以设置渠道中所有通知的视觉和听觉行为.然后,用户能够随意修改这些设置来决定通知的行为. 在用户界面渠道显示为 & ...
- Android 8.0 创建桌面快捷方式
1. 前言:公司有个给app创建桌面快捷方式的功能. 有一天,测试来说,有款手机,点击快捷方式,无反应. 2.思考:大多数手机是好的,考虑是兼容性问题. 1)经查看,问题机是 华为mate9 ...
- Android 10.0创建恢复出厂设置不被清除的文件夹节点
在系统开发中,希望保存一些数据 在恢复出厂设置以后也不会被清理掉,这样就希望创建的节点不在被清理的范围内 而recovery主要会清理 /data/ 和 /cache 分区的数据 卸载安装的app A ...
- android 7.0 创建热点,win7创建wifi热点脚本分享
说明一下,此功能只适用于win7系统,并且保证电脑有无线网卡,和正确安装了驱动.还需要做的一步就是共享已连接的网络,方法可以百度. 以下文件保存成wlan.bat文件,然后运行就可以了 @echo o ...
- Android Studio3.0新特性
3.0(2017年10月) Android Studio 3.0.0是一个主要版本,包括各种新功能和改进. macOS用户:如果您正在更新旧版本的Android Studio,则可能会遇到一个更新错误 ...
- android添加截图功能,Android应用开发之Android 5.0及以上编程实现屏幕截图功能的方法...
本文将带你了解Android应用开发Android 5.0及以上编程实现屏幕截图功能的方法,希望本文对大家学Android有所帮助. 本文实例讲述了Android 5.0及以上编程实现屏幕截图功能 ...
- 《深入解析Android 5.0系统》——第1章,第1.2节安装开发包
本节书摘来自异步社区<深入解析Android 5.0系统>一书中的第1章,第1.2节安装开发包,作者 刘超,更多章节内容可以访问云栖社区"异步社区"公众号查看 1.2 ...
最新文章
- JDk8的新特性-流和内部iteration
- java 实现loading效果_简单实现JS Loading功能
- java list作为参数传递_Java 程序将lambda表达式作为方法参数传递
- oracle11gr2配置监听,Windows环境配置Oracle 11gR2 Listener
- Java序列化机制原理,java面试题,java基础笔试题,BAT
- expect自动登录以及远程脚本执行
- wiznote can't networking
- java计算器代码_java计算器源代码(新手入门级)
- 大数据之路:阿里巴巴大数据实践(数据模型篇)
- Photoshop之快速蒙版Q
- 按洲划分的国家和地区代码整理 包含:中文名 英文名 洲 首字母 两位英文代码 三位英文代码 三位数据代码 洲
- 参数校验@Valid
- EPICS S7nodave手册
- 数据结构实训——运动会分数统计
- springboot使用rocketmq-spring-boot-starter整合RocketMQ
- 通讯录搜索排序 类似微信通讯录
- 王朝落日,读《万历十五年》
- android番茄钟计时器
- 学习UCGUI的苦闷!!
- js检查中英文数字的正则表达式,检查特殊字符