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)(示例代码)相关推荐

  1. [导入]Asp.net 2.0 自定义控件开发[创建自定义浮动菜单FloadMenu控件][示例代码下载]...

    Asp.net 2.0 自定义控件开发[创建自定义浮动菜单FloadMenu控件][示例代码下载] 文章来源:http://blog.csdn.net/chengking/archive/2007/0 ...

  2. android 蓝牙相关广播,Android 蓝牙相关的广播

    Android 蓝牙相关的广播 监听蓝牙相关的广播并获得相关的信息,蓝牙相关的广播主要集中在BluetoothAdapter和BluetoothDevice类中, 可以通过在AndroidManife ...

  3. 《阿里巴巴Android开发手册》v1.0.1更新,优化部分内容和示例代码

    摘要: 春节余味尚未消,我们为移动开发者准备了一份迟到的新年礼物--<阿里巴巴Android开发手册>,继<阿里巴巴Java开发手册>之后,阿里巴巴开发规范家族又添一丁,「阿里 ...

  4. Android studio低版本让3.0编译通过,更好的用studio看代码(找不到原作者那个网址链接了,望见谅!)

    最近下载大神们的demo都是用studio3.0的gradle4以上的了,本人电脑太差不想升级 为了更好的看代码百度寻得次办法,在此做个标记(前个月看到的刚才又忘记,一阵好找才找到) 在项目目录下的g ...

  5. android 未找到命令,ANDROID NDK – android:命令未找到

    我试图通过 Android NDK中提供的第一个示例练习.我试图在cygwin上运行以下命令 android update project –p 但是,我得到android:命令未找到错误. 我检查了 ...

  6. android 蓝牙相关广播,Android通过广播接收器BroadcastReceiver监听蓝牙连接变化

    上一篇介绍了通过广播对蓝牙的打开关闭等变化的监听,这一篇将对蓝牙连接状态的变化进行封装. 首先是广播接收器BlueToothConnectReceiver 类 import android.bluet ...

  7. android 5.0 创建多用户 双开多开应用(1)

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

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

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

  9. android+动画打包命令,Android 开机动画客制化

    Android开机动画总共有三个过程.第一个开机动画是在Kenel启动时显示的,第二个开机动画是在init进程启动时显示的,这两个都是静态图片.第三个动画是在系统服务启动过程中显示的,他是一个动态图片 ...

最新文章

  1. error C2065: “M_PI”: 未声明的标识符
  2. 直播 | 脑血管斑块磁共振成像:技术研发、临床转化和数据挑战
  3. 爬虫python需要什么软件-学python爬虫能做什么
  4. ios 自定义加载动画效果
  5. 把2018年所有踩过的坑都记在这里。
  6. PHP+MySQL登录注册,完整版,详细注释
  7. php基础教程 第六步 学习数组以及条件判断switch补充
  8. 利用空余时间在完成一个Outlook框架控件,还有些Bug,完善中
  9. 大数据之-Hadoop_推荐系统框架图---大数据之hadoop工作笔记0015
  10. Jmeter系列之Jmeter+Grafana+InfluxDB实时监控
  11. Java继承,接口,抽象类
  12. [UESTC SC T4] Chika 的烦恼
  13. 远程桌面控制软件Teamviewer免费版安装
  14. maplibre显示经纬线,(动态若干条)
  15. 图片如何转化为pdf格式?
  16. Ansible Inventory详细使用介绍
  17. c语言扑克牌同花顺比大小,为什么打扑克时“同花顺”最大
  18. XmlHttp是什么
  19. codeforces1119B. Alyona and a Narrow Fridge 贪心
  20. 从梁飞的微型rpc 细节说起--Dubbo源码系列解读(5)

热门文章

  1. 论DNS地址8.8.8.8和114.114.114.114
  2. C语言32位正整数作为id进程,SOJ4453 Excel列数 进制转换
  3. 三种快排及四种优化方式
  4. SpringBoot中注入RedisTemplate实例异常解决
  5. 软件测试性能工程师工资,软件测试工程师工资一般多少 前景怎么样
  6. python制作浏览器 脚本之家_基于Python打造账号共享浏览器功能
  7. BH1750FVI调试
  8. 分类任务如何用逻辑回归实现_【机器学习面试总结】—— LR(逻辑回归)
  9. java玫瑰花代码_教小白用Html代码做玫瑰花
  10. 美国这几年的人口死亡数据