Android多用户相关命令,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
源文件
packageandroid.os;importandroid.os.Bundle;importandroid.content.pm.UserInfo;importandroid.content.RestrictionEntry;importandroid.graphics.Bitmap;/*** {@hide}*/
interfaceIUserManager {
UserInfo createUser(in String name,intflags);
UserInfo createProfileForUser(in String name,int flags, intuserHandle);void setUserEnabled(intuserHandle);boolean removeUser(intuserHandle);void setUserName(intuserHandle, String name);void setUserIcon(intuserHandle, in Bitmap icon);
Bitmap getUserIcon(intuserHandle);
List getUsers(booleanexcludeDying);
List getProfiles(int userHandle, booleanenabledOnly);
UserInfo getProfileParent(intuserHandle);
UserInfo getUserInfo(intuserHandle);booleanisRestricted();int getUserSerialNumber(intuserHandle);int getUserHandle(intuserSerialNumber);
Bundle getUserRestrictions(intuserHandle);boolean hasUserRestriction(in String restrictionKey, intuserHandle);void setUserRestrictions(in Bundle restrictions, intuserHandle);voidsetApplicationRestrictions(in String packageName, in Bundle restrictions,intuserHandle);
Bundle getApplicationRestrictions(in String packageName);
Bundle getApplicationRestrictionsForUser(in String packageName,intuserHandle);booleansetRestrictionsChallenge(in String newPin);intcheckRestrictionsChallenge(in String pin);booleanhasRestrictionsChallenge();voidremoveRestrictions();voidsetDefaultGuestRestrictions(in Bundle restrictions);
Bundle getDefaultGuestRestrictions();boolean markGuestForDeletion(intuserHandle);
}
3.写好相应的方法调用:
/**
* 得到 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
caseSERVICE_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;
}
caseSERVICE_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;
}
caseSERVICE_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多用户相关命令,android 5.0 创建多用户 双开多开应用(1)(示例代码)相关推荐
- [导入]Asp.net 2.0 自定义控件开发[创建自定义浮动菜单FloadMenu控件][示例代码下载]...
Asp.net 2.0 自定义控件开发[创建自定义浮动菜单FloadMenu控件][示例代码下载] 文章来源:http://blog.csdn.net/chengking/archive/2007/0 ...
- android 蓝牙相关广播,Android 蓝牙相关的广播
Android 蓝牙相关的广播 监听蓝牙相关的广播并获得相关的信息,蓝牙相关的广播主要集中在BluetoothAdapter和BluetoothDevice类中, 可以通过在AndroidManife ...
- 《阿里巴巴Android开发手册》v1.0.1更新,优化部分内容和示例代码
摘要: 春节余味尚未消,我们为移动开发者准备了一份迟到的新年礼物--<阿里巴巴Android开发手册>,继<阿里巴巴Java开发手册>之后,阿里巴巴开发规范家族又添一丁,「阿里 ...
- Android studio低版本让3.0编译通过,更好的用studio看代码(找不到原作者那个网址链接了,望见谅!)
最近下载大神们的demo都是用studio3.0的gradle4以上的了,本人电脑太差不想升级 为了更好的看代码百度寻得次办法,在此做个标记(前个月看到的刚才又忘记,一阵好找才找到) 在项目目录下的g ...
- android 未找到命令,ANDROID NDK – android:命令未找到
我试图通过 Android NDK中提供的第一个示例练习.我试图在cygwin上运行以下命令 android update project –p 但是,我得到android:命令未找到错误. 我检查了 ...
- android 蓝牙相关广播,Android通过广播接收器BroadcastReceiver监听蓝牙连接变化
上一篇介绍了通过广播对蓝牙的打开关闭等变化的监听,这一篇将对蓝牙连接状态的变化进行封装. 首先是广播接收器BlueToothConnectReceiver 类 import android.bluet ...
- 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+动画打包命令,Android 开机动画客制化
Android开机动画总共有三个过程.第一个开机动画是在Kenel启动时显示的,第二个开机动画是在init进程启动时显示的,这两个都是静态图片.第三个动画是在系统服务启动过程中显示的,他是一个动态图片 ...
最新文章
- error C2065: “M_PI”: 未声明的标识符
- 直播 | 脑血管斑块磁共振成像:技术研发、临床转化和数据挑战
- 爬虫python需要什么软件-学python爬虫能做什么
- ios 自定义加载动画效果
- 把2018年所有踩过的坑都记在这里。
- PHP+MySQL登录注册,完整版,详细注释
- php基础教程 第六步 学习数组以及条件判断switch补充
- 利用空余时间在完成一个Outlook框架控件,还有些Bug,完善中
- 大数据之-Hadoop_推荐系统框架图---大数据之hadoop工作笔记0015
- Jmeter系列之Jmeter+Grafana+InfluxDB实时监控
- Java继承,接口,抽象类
- [UESTC SC T4] Chika 的烦恼
- 远程桌面控制软件Teamviewer免费版安装
- maplibre显示经纬线,(动态若干条)
- 图片如何转化为pdf格式?
- Ansible Inventory详细使用介绍
- c语言扑克牌同花顺比大小,为什么打扑克时“同花顺”最大
- XmlHttp是什么
- codeforces1119B. Alyona and a Narrow Fridge 贪心
- 从梁飞的微型rpc 细节说起--Dubbo源码系列解读(5)
热门文章
- 论DNS地址8.8.8.8和114.114.114.114
- C语言32位正整数作为id进程,SOJ4453 Excel列数 进制转换
- 三种快排及四种优化方式
- SpringBoot中注入RedisTemplate实例异常解决
- 软件测试性能工程师工资,软件测试工程师工资一般多少 前景怎么样
- python制作浏览器 脚本之家_基于Python打造账号共享浏览器功能
- BH1750FVI调试
- 分类任务如何用逻辑回归实现_【机器学习面试总结】—— LR(逻辑回归)
- java玫瑰花代码_教小白用Html代码做玫瑰花
- 美国这几年的人口死亡数据