Android Lock Task Ui 功能

Android 的 Lock Task UI 功能试用于部分特定场景:全屏游戏、工厂测试等,屏蔽除 BACK 按键以外按键,屏蔽状态栏通知栏等。

使用时需要将应用设置为  DeviceOwner ,系统通过 DevicePolicyManager.setDeviceOwner 设置,或者通过 adb shell dpm set-active-admin pkg/cls

DevicePolicyManager 类主要相关方法:

setDeviceOwner

设置应用为设备管理者

setLockTaskFeatures

设置不同的 flag 来解除状态通知栏、按键的锁定

setLockTaskPackages

设置额外可以启动的应用包名

clearDeviceOwnerApp

清除设备管理应用

import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.ActivityManager;
import android.app.admin.DevicePolicyManager;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.content.pm.ResolveInfo;
import android.os.Bundle;
import android.view.View;

import androidx.annotation.Nullable;

import com.locktaskui.test.receiver.DeviceAdminTestReceiver;

import static android.app.admin.DevicePolicyManager.LOCK_TASK_FEATURE_HOME;
import static android.app.admin.DevicePolicyManager.LOCK_TASK_FEATURE_NOTIFICATIONS;
import static android.app.admin.DevicePolicyManager.LOCK_TASK_FEATURE_OVERVIEW;

public class LockTaskUiTestActivity extends Activity implements View.OnClickListener {

    private static final String TAG = LockTaskUiTestActivity.class.getSimpleName();

    private static final ComponentName ADMIN_RECEIVER = DeviceAdminTestReceiver.getReceiverComponentName();
    ;

    private ActivityManager mAm;

    private DevicePolicyManager mDpm;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.locktask_layout);

        findViewById(R.id.enable_noti).setOnClickListener(this);
        findViewById(R.id.enable_home).setOnClickListener(this);
        findViewById(R.id.enable_over).setOnClickListener(this);
        findViewById(R.id.start_lock).setOnClickListener(this);
        findViewById(R.id.stop_lock).setOnClickListener(this);

        this.mDpm = (DevicePolicyManager) getSystemService(DevicePolicyManager.class);

    }

    private String getCurrentLauncherPackage() {
        @SuppressLint("WrongConstant")
        ResolveInfo resolveInfo = getPackageManager().resolveActivity((new Intent("android.intent.action.MAIN")).addCategory("android.intent.category.HOME"), 65536);
        if (resolveInfo != null) {
            ActivityInfo activityInfo = resolveInfo.activityInfo;
            if (activityInfo != null)
                return activityInfo.packageName;
        }
        return null;
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.enable_noti:
                this.mDpm.setLockTaskFeatures(this.ADMIN_RECEIVER, LOCK_TASK_FEATURE_NOTIFICATIONS | LOCK_TASK_FEATURE_HOME);
                this.mDpm.setLockTaskPackages(this.ADMIN_RECEIVER, new String[]{getPackageName(), getCurrentLauncherPackage()});
                break;
            case R.id.enable_home:
                this.mDpm.setLockTaskFeatures(this.ADMIN_RECEIVER, LOCK_TASK_FEATURE_HOME);
                this.mDpm.setLockTaskPackages(this.ADMIN_RECEIVER, new String[]{getPackageName(), getCurrentLauncherPackage()});
                break;
            case R.id.enable_over:
                this.mDpm.setLockTaskFeatures(this.ADMIN_RECEIVER, LOCK_TASK_FEATURE_OVERVIEW | LOCK_TASK_FEATURE_HOME);
                this.mDpm.setLockTaskPackages(this.ADMIN_RECEIVER, new String[]{getPackageName(), getCurrentLauncherPackage()});
                break;
            case R.id.start_lock:
                this.mDpm.setLockTaskPackages(ADMIN_RECEIVER, new String[]{"com.seuic.seuictest"});
                this.mDpm.setLockTaskFeatures(ADMIN_RECEIVER, 0);
                startLockTask();
                break;
            case R.id.stop_lock:
                stopLockTask();
                LockTaskUiTestActivity.this.mDpm.setLockTaskFeatures(LockTaskUiTestActivity.ADMIN_RECEIVER, 0);
                LockTaskUiTestActivity.this.mDpm.setLockTaskPackages(LockTaskUiTestActivity.ADMIN_RECEIVER, new String[0]);
                DevicePolicyManager dpm = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);
                dpm.clearDeviceOwnerApp(getPackageName());
                break;
        }
    }
}
import android.app.admin.DeviceAdminReceiver;
import android.content.ComponentName;

public class DeviceAdminTestReceiver extends DeviceAdminReceiver {
    private static final ComponentName RECEIVER_COMPONENT_NAME = new ComponentName("com.locktaskui.test", "com.locktaskui.test.receiver.DeviceAdminTestReceiver");
    public static ComponentName getReceiverComponentName() {
        return RECEIVER_COMPONENT_NAME;
    }

}

xml 中需要配置如下内容。 

        <receiver
            android:name=".receiver.DeviceAdminTestReceiver"
            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>
<?xml version="1.0" encoding="utf-8"?>
<device-admin
  xmlns:android="http://schemas.android.com/apk/res/android">
    <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>

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值