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 ...
最新文章
- 根据字符出现频率排序
- Mac OS X的快捷键
- 用MyEclipse自动生成hibernate映射文件和实体类
- Java正則表達式詳解
- SQL Server里一些未公开的扩展存储过程
- GPS使用记录NMEA数据解析、RTK定位以及ntrip协议
- SegmentFault D-Day 2016 年度总结报告
- opencv调取摄像头
- AB工业计算机编程软件,罗克韦尔/AB VersaView 5100 工业监视器
- libcef-常用概念-框架特点
- 石家庄地铁售票系统源代码
- AdGuard 无与伦比的广告拦截
- 《可转债入门十讲》笔记
- 互联网黑话大全 最新词汇 黑话生成器
- Hibernate安装教程
- DBCP C3PO Druid三种数据库连接
- win10系统可禁用的服务器,window10哪些服务可以禁止
- 什么是repo文件?
- 用DVD片刻录多部VCD影片
- 创建算法交易机器人:用MQL4编写Expert Advisor的基础
热门文章
- windbg输出SXS.DLL的调试信息
- 认知升级篇:了解我们的大脑
- 怎么查看Linux系统中的内存?
- 三角函数$y=Asin(\omega x+\phi)$的图像和性质
- Google Earth Engine(GEE)——2015-2019年100米分辨率的动态土地覆盖数据集(CGLS-LC100)
- Clickhouse分享
- 为什么我们需要monad?
- 基于python的论文分析_【论文实现】一篇Sigkdd的弹幕分析论文的python实现【LDA 实践者】...
- 1003 Emergency 题目解析
- Ubuntu 18.04 开机进入emergency mode