You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

所有者安装带Admin权限的APK后,如何让全设备用户可用?

解决方案:让应用及后台服务对所有设备用户可用

没问题,这个需求完全可以实现!结合你手里的设备管理员权限,以及支持Android 5.0(Lollipop)及以上系统的条件,咱们可以通过以下几个关键步骤搞定:

1. 用设备管理员权限设置跨用户可见

Android从Lollipop开始支持多用户模式,设备管理员有权限把应用标记为跨用户可见的系统级应用——这意味着不管是主用户、访客还是新创建的用户,都能看到并使用你的应用和后台服务。

具体代码实现(在你的设备管理员Receiver里添加):

DevicePolicyManager dpm = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);
ComponentName adminComponent = new ComponentName(this, YourAdminReceiver.class);

// 先确认管理员权限已激活
if (dpm.isAdminActive(adminComponent)) {
    Set<String> crossProfilePackages = new HashSet<>();
    // 添加你的主应用包名
    crossProfilePackages.add(getPackageName());
    // 把3个后台服务的包名也加进去(如果服务和主应用同包,只加主包名就行)
    crossProfilePackages.add("com.your.app.service1");
    crossProfilePackages.add("com.your.app.service2");
    crossProfilePackages.add("com.your.app.service3");
    
    // 设置跨用户可见
    dpm.setCrossProfilePackages(adminComponent, crossProfilePackages);
}

这个操作需要的MANAGE_PROFILE_AND_DEVICE_POLICIES权限,设备管理员默认就有,不用额外申请。

2. 确保后台服务在所有用户下自动启动

用户切换时,系统可能会暂停非当前用户的服务。要让服务在所有用户下持续跑,可以这么做:

  • 在服务的AndroidManifest.xml里加android:persistent="true"属性——这个属性只对系统级应用生效,而我们通过跨用户设置后,应用会被视为系统级应用,刚好适用。
  • 监听用户切换的广播,一旦切换就检查服务状态,没运行就启动它。示例代码(写个广播接收器):
@Override
public void onReceive(Context context, Intent intent) {
    if (Intent.ACTION_USER_SWITCHED.equals(intent.getAction())) {
        // 获取当前切换到的用户ID
        int userId = intent.getIntExtra(Intent.EXTRA_USER_HANDLE, UserHandle.USER_CURRENT);
        // 启动该用户下的服务
        Intent serviceIntent = new Intent(context, YourBackgroundService.class);
        serviceIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        context.startServiceAsUser(serviceIntent, UserHandle.of(userId));
    }
}

别忘了在Manifest里注册这个广播接收器,并声明接收ACTION_USER_SWITCHED的权限。

3. 适配访客模式的特殊场景

访客模式下系统会限制一些操作,但因为你的应用是设备管理员授权的跨用户应用,所以能正常运行。额外注意两点:

  • 访客无法卸载你的应用,刚好符合你的需求;
  • 监听ACTION_USER_ADDED(访客创建时)和ACTION_USER_STARTED(访客登录时)广播,触发服务自动启动,确保访客一进入就能用到服务。
验证建议

做完上面的步骤后,记得多场景测试:

  • 主用户下,确认应用和服务正常运行;
  • 创建新用户,切换过去检查应用是否可见、服务是否在跑;
  • 进入访客模式,验证同样的内容。
总结

完全不需要Root或Kiosk模式,只要用好设备管理员的跨用户包管理能力,再配合用户事件的广播监听,就能让你的应用和后台服务覆盖所有设备用户,包括访客和新增用户。

内容的提问来源于stack exchange,提问作者Lano

火山引擎 最新活动