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

源文件

package android.os;

import android.os.Bundle;
import android.content.pm.UserInfo;
import android.content.RestrictionEntry;
import android.graphics.Bitmap;

/**
 *  {@hide}
 */
interface IUserManager {
    UserInfo createUser(in String name, int flags);
    UserInfo createProfileForUser(in String name, int flags, int userHandle);
    void setUserEnabled(int userHandle);
    boolean removeUser(int userHandle);
    void setUserName(int userHandle, String name);
    void setUserIcon(int userHandle, in Bitmap icon);
    Bitmap getUserIcon(int userHandle);
    List<UserInfo> getUsers(boolean excludeDying);
    List<UserInfo> getProfiles(int userHandle, boolean enabledOnly);
    UserInfo getProfileParent(int userHandle);
    UserInfo getUserInfo(int userHandle);
    boolean isRestricted();
    int getUserSerialNumber(int userHandle);
    int getUserHandle(int userSerialNumber);
    Bundle getUserRestrictions(int userHandle);
    boolean hasUserRestriction(in String restrictionKey, int userHandle);
    void setUserRestrictions(in Bundle restrictions, int userHandle);
    void setApplicationRestrictions(in String packageName, in Bundle restrictions,
            int userHandle);
    Bundle getApplicationRestrictions(in String packageName);
    Bundle getApplicationRestrictionsForUser(in String packageName, int userHandle);
    boolean setRestrictionsChallenge(in String newPin);
    int checkRestrictionsChallenge(in String pin);
    boolean hasRestrictionsChallenge();
    void removeRestrictions();
    void setDefaultGuestRestrictions(in Bundle restrictions);
    Bundle getDefaultGuestRestrictions();
    boolean markGuestForDeletion(int userHandle);
}

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

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

时间: 2024-11-08 09:35:20

android 5.0 创建多用户 双开多开应用(1)的相关文章

android 5.0 创建多用户 双开多开应用(2)

上一讲 讲了如何创建一个user android 5.0 创建多用户 双开多开应用(1) 为什么要创建User  例如window 系统创建了一个user 会在当前用户下进行操作,而android 多用户体系就像window系统 创建了一个user之后在当前user下进行操作,就可以再安装或者启动一个应用. 有了一个user 之后在这个user下创建一个工作空间,在工作空间下安装 启动apk 就可以双开了. 具体类操作: package android.app.admin; import and

Getting started with &#39;User Accounts&#39; on Android 5.0 Lollipop (android的多用户支持)

With Android 5.0 Lollipop, Google is adding true multi-user support for tablets and smartphones alike. When Google released Android 4.2 it included multiple user accounts for tablets; however, smartphone users were left in the cold. (In Google's defe

android源码探索----多用户下phone进程问题

android4.2增加了多用户功能,终于在迟迟之后与linux保持了一致.但是手机上的多用户其实是相当鸡肋的,试想手机这种移动设备基本 上就是每一个人的唯一id,所以基本上不存在多用户共用设备的情况.也正因为此以及专利的原因,所以电话上的多用户功能是关闭的,只有平板上的多用户是打 开的.但还是要感谢谷歌开发人员引入多用户机制,这样可以帮助开发一些安全系统有极大帮助. 但打开多用户之后,有一个比较蛋疼的地方是无法在多用户中打电话发短信.查看源码的知,这是android对于电话通信这一块根本没有做

Android编程动态创建视图View的方法

在Android开 发中,在Activity中关联视图View是一般使用setContentView方法,该方法一种参数是使用XML资源直接创 建:setContentView (int layoutResID),指定layout中的一个XML的ID即可,这种方法简单.另一个方法是 setContentView(android.view.View),参数是指定一个视图View对象,这种方法可以使用自定义的视图类. 在一些场合中,需要对View进行一些定制处理,比如获取到Canvas进行图像绘制,

android studio 0.8.1使用和遇到问题解决

谷歌6月底发布了五大系统,并且android studio同步升级到了android studio 0.8.1.升级了的android studio确实有一些新的变化,运行速度变快,并且还可以选择开发不同的产品,本着尝试新技术的心情,过了一把瘾.现在和大家一起来看看. 由于GFW封了google,所以现在android studio可能有些同仁下不到,由于公司的原因,无法上传到CSDN上,有点遗憾.不过没关系,我们先睹为快,先看看东西怎么样. JDK的东西和问题我在这里就不重复讲了,直接进入安装

Android开发之深入理解Android 7.0系统权限更改相关文档

摘要: Android 6.0之后的版本增加了运行时权限,应用程序在执行每个需要系统权限的功能时,需要添加权限请求代码(默认权限禁止),否则应用程序无法响应:Android 7.0在Android 6.0的基础上,对系统权限进一步更改,这次的权限更改包括三个方面: APP应用程序的私有文件不再向使用者放宽 Intent组件传递file://URI的方式可能给接收器留下无法访问的路径,触发FileUriExposedException异常,推荐使用FileProvider DownloadMana

Android中用ListView创建应用商店时的几个优化

package com.example.ex01_1; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.net.MalformedURLException; import java.net.URL; import java.net.URLConnection; import java.util.Arra

[Android编译(二)] 从谷歌官网下载android 6.0源码、编译并刷入nexus 6p手机

1 前言 经过一周的奋战,终于从谷歌官网上下载最新的android 6.0.1_r62源码,编译成功,并成功的刷入nexus6p,接着root完毕,现写下这篇博客记录一下实践过程. 2 简介 自己下载android系统源码,修改定制,然后编译刷入安卓手机,想想还有点小激动呢.简单点说一句话--定制我们自己的MIUI,这就是android的魅力,这篇博客博主就来教大家实现自己的定制系统. 首先,要明白下面的基础知识: (1) 什么是aosp? aosp就是android open source p

Android 6.0 动态权限申请注意事项

<span style="font-size:24px;color:#ffff00;background-color: rgb(0, 0, 153);"><strong>Android 6.0 权限区分</strong></span> Android 6.0 为了保护用户隐私,将一些权限的申请放在了应用运行的时候去申请, 比如以往的开发中,开发人员只需要将需要的权限在清单文件中配置即可,安装后用户可以在设置中的应用信息中看到:XX应用以获