首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何创建COSU应用程序?无活动管理错误

如何创建COSU应用程序?无活动管理错误
EN

Stack Overflow用户
提问于 2017-06-06 01:30:27
回答 1查看 1.7K关注 0票数 6

我目前正在尝试创建一个COSU应用程序。我想锁定用户在应用程序,并禁用所有的功能离开,如主页按钮,菜单按钮,后退按钮,工具栏等。我遵循了这里的指南:https://developer.android.com/work/cosu.html#cosu-solutions

我遇到的问题是,我收到了一个“无活动管理”错误。我不知道如何使我活跃起来。是否有意调用将显示此提示?我直接遵循了开发者的指示,但是我遗漏了一些没有发布在网站上的细节。

由: ComponentInfo{android.example.stage/com.example.app.framework.utilities.kiosk.DeviceAdminReceiver}:android.os.Parcel.readException(Parcel.java:1693)上没有活动管理java.lang.SecurityException引起在android.os.Parcel.readException(Parcel.java:1646) at android.app.admin.IDevicePolicyManager$Stub$Proxy.setUserRestriction(IDevicePolicyManager.java:7977)在android.app.admin.DevicePolicyManager.addUserRestriction(DevicePolicyManager.java:6296) at android.example.activity.RegistrationActivity.setUserRestriction(RegistrationActivity.java:320)在android.example.activity.RegistrationActivity.setDefaultCosuPolicies(RegistrationActivity.java:274) at android.example.activity.RegistrationActivity.onCreate(RegistrationActivity.java:110)在android.app.Activity.performCreate(Activity.java:6942) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1126)在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2880) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2988)在android.app.ActivityThread.-wrap14(ActivityThread.java)公司的android.app.ActivityThread$H.handleMessage(ActivityThread.java:1631)公司Android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:154)在android.app.ActivityThread.main(ActivityThread.java:6682)在java.lang.reflect.Method.invoke(Native )在com.android.internal.os (Native)。ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1520)在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1410)

以下是我的实现方式。

在OnCreate()

代码语言:javascript
运行
复制
    mAdminComponentName = DeviceAdminReceiver.getComponentName(this);
    mDevicePolicyManager = (DevicePolicyManager) getSystemService(
            Context.DEVICE_POLICY_SERVICE);
    mPackageManager = getPackageManager();
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        setDefaultCosuPolicies(true);
    }

在onStart()

代码语言:javascript
运行
复制
    // start lock task mode if it's not already active
    ActivityManager am = (ActivityManager) getSystemService(
            Context.ACTIVITY_SERVICE);
    // ActivityManager.getLockTaskModeState api is not available in pre-M.
    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            if (!am.isInLockTaskMode()) {
                startLockTask();
            }
        }
    } else {
        if (am.getLockTaskModeState() ==
                ActivityManager.LOCK_TASK_MODE_NONE) {
            startLockTask();
        }
    }

我的助手方法

代码语言:javascript
运行
复制
@TargetApi(Build.VERSION_CODES.M)
 private void setDefaultCosuPolicies(boolean active) {
     // set user restrictions
     setUserRestriction(UserManager.DISALLOW_SAFE_BOOT, active);
     setUserRestriction(UserManager.DISALLOW_FACTORY_RESET, active);
     setUserRestriction(UserManager.DISALLOW_ADD_USER, active);
     setUserRestriction(UserManager.DISALLOW_MOUNT_PHYSICAL_MEDIA, active);
     setUserRestriction(UserManager.DISALLOW_ADJUST_VOLUME, active);

     // disable keyguard and status bar
     mDevicePolicyManager.setKeyguardDisabled(mAdminComponentName, active);
     mDevicePolicyManager.setStatusBarDisabled(mAdminComponentName, active);

     // enable STAY_ON_WHILE_PLUGGED_IN
     enableStayOnWhilePluggedIn(active);

     // set System Update policy

     if (active){
         mDevicePolicyManager.setSystemUpdatePolicy(mAdminComponentName,
                 SystemUpdatePolicy.createWindowedInstallPolicy(60,120));
     } else {
         mDevicePolicyManager.setSystemUpdatePolicy(mAdminComponentName, null);
     }

     // set this Activity as a lock task package

     mDevicePolicyManager.setLockTaskPackages(mAdminComponentName,
             active ? new String[]{getPackageName()} : new String[]{});

     IntentFilter intentFilter = new IntentFilter(Intent.ACTION_MAIN);
     intentFilter.addCategory(Intent.CATEGORY_HOME);
     intentFilter.addCategory(Intent.CATEGORY_DEFAULT);

     if (active) {
         // set Cosu activity as home intent receiver so that it is started
         // on reboot
         mDevicePolicyManager.addPersistentPreferredActivity(
                 mAdminComponentName, intentFilter, new ComponentName(
                         getPackageName(), RegistrationActivity.class.getName()));
     } else {
         mDevicePolicyManager.clearPackagePersistentPreferredActivities(
                 mAdminComponentName, getPackageName());
     }
 }

    @TargetApi(Build.VERSION_CODES.LOLLIPOP)
    private void setUserRestriction(String restriction, boolean disallow) {
        if (disallow) {
            mDevicePolicyManager.addUserRestriction(mAdminComponentName,
                    restriction);
        } else {
            mDevicePolicyManager.clearUserRestriction(mAdminComponentName,
                    restriction);
        }
    }

    @TargetApi(Build.VERSION_CODES.LOLLIPOP)
    private void enableStayOnWhilePluggedIn(boolean enabled) {
        if (enabled) {
            mDevicePolicyManager.setGlobalSetting(
                    mAdminComponentName,
                    Settings.Global.STAY_ON_WHILE_PLUGGED_IN,
                    Battery_PLUGGED_ANY);
        } else {
            mDevicePolicyManager.setGlobalSetting(
                    mAdminComponentName,
                    Settings.Global.STAY_ON_WHILE_PLUGGED_IN, DONT_STAY_ON);
        }
    }

我的device_admin.xml

代码语言:javascript
运行
复制
<?xml version="1.0" encoding="utf-8"?>
<device-admin>
    <uses-policies>
        <limit-password/>
        <watch-login/>
        <reset-password/>
        <force-lock/>
        <wipe-data/>
        <expire-password/>
        <encrypted-storage/>
        <disable-camera/>
        <disable-keyguard-features/>
    </uses-policies>
</device-admin>

我在AndroidManifest.xml中的接收器

代码语言:javascript
运行
复制
    <receiver
        android:name="com.example.app.framework.utilities.kiosk.DeviceAdminReceiver"
        android:description="@string/app_name"
        android:label="@string/app_name"
        android:permission="android.permission.BIND_DEVICE_ADMIN">
        <meta-data
            android:name="android.app.device_admin"
            android:resource="@xml/device_admin"/>
        <intent-filter>
            <action android:name="android.intent.action.DEVICE_ADMIN_ENABLED"/>
            <action android:name="android.intent.action.PROFILE_PROVISIONING_COMPLETE"/>
            <action android:name="android.intent.action.BOOT_COMPLETED"/>
        </intent-filter>
    </receiver>
EN

回答 1

Stack Overflow用户

发布于 2021-04-28 20:41:12

  1. 创建设备管理接收器 in MyDeviceAdminReceiver.kt
代码语言:javascript
运行
复制
class MyDeviceAdminReceiver : DeviceAdminReceiver()
  1. 定义并声明您的策略

res/xml/device_admin.xml

代码语言:javascript
运行
复制
<device-admin xmlns:android="http://schemas.android.com/apk/res/android">
    <uses-policies>
        <!-- Put whatever policies you need below -->
        <limit-password />
    </uses-policies>
</device-admin>

AndroidManifest.xml

代码语言:javascript
运行
复制
<receiver android:name=".MyDeviceAdminReceiver"
    android:permission="android.permission.BIND_DEVICE_ADMIN">
    <meta-data android:name="android.app.device_admin"
        android:resource="@xml/device_admin" />
    <intent-filter>
        <action android:name="android.app.action.DEVICE_ADMIN_ENABLED" />
    </intent-filter>
</receiver>
  1. 设备上的确保注销所有帐户设置>帐户。
  2. 运行dpm命令来设置设备所有者。

adb shell dpm set-device-owner com.example.myapp/.MyDeviceAdminReceiver

  1. Allowlist应用 (这次是Java而不是Kotlin):
代码语言:javascript
运行
复制
String[] ALLOWED_PACKAGES = {getPackageName()};
DevicePolicyManager dpm = (DevicePolicyManager) getApplicationContext().getSystemService(Context.DEVICE_POLICY_SERVICE);
ComponentName adminName = new ComponentName(getApplicationContext(), MyDeviceAdminReceiver.class);
dpm.setLockTaskPackages(adminName, ALLOWED_PACKAGES);
  1. 启动锁定任务模式
代码语言:javascript
运行
复制
val dpm = getSystemService(Context.DEVICE_POLICY_SERVICE) as DevicePolicyManager
if (dpm.isLockTaskPermitted(packageName)) {
    startLockTask()
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44380061

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档