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;/***/

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可以返回对应的数据。

原文:http://www.cnblogs.com/smallrole/p/5640304.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值