5

我正在开发一个作为Admin. 我可以使用以下代码来做到这一点

DemoDeviceAdminReceiver.jav

public class DemoDeviceAdminReceiver extends DeviceAdminReceiver {
    static final String TAG = "DemoDeviceAdminReceiver";

    /** Called when this application is approved to be a device administrator. */
    @Override
    public void onEnabled(Context context, Intent intent) {
        super.onEnabled(context, intent);

        Toast.makeText(context, R.string.device_admin_enabled, Toast.LENGTH_LONG).show();
        Log.d(TAG, "onEnabled");
    }

    /** Called when disabling device administrator power. */
    @Override
    public CharSequence onDisableRequested(Context context, Intent intent) {
        Toast.makeText(context, R.string.device_admin_requesting_disable, Toast.LENGTH_LONG).show();
        Log.d(TAG, "onDisableRequested");

        return super.onDisableRequested(context, intent);
    }

    /** Called when this application is no longer the device administrator. */
    @Override
    public void onDisabled(Context context, Intent intent) {
        super.onDisabled(context, intent);
        Toast.makeText(context, R.string.device_admin_disabled, Toast.LENGTH_LONG).show();
        Log.d(TAG, "onDisabled");
    }

    @Override
    public void onPasswordChanged(Context context, Intent intent) {
        super.onPasswordChanged(context, intent);
        Log.d(TAG, "onPasswordChanged");
    }

    @Override
    public void onPasswordFailed(Context context, Intent intent) {
        super.onPasswordFailed(context, intent);
        Log.d(TAG, "onPasswordFailed");
    }

    @Override
    public void onPasswordSucceeded(Context context, Intent intent) {
        super.onPasswordSucceeded(context, intent);
        Log.d(TAG, "onPasswordSucceeded");
    }
}

清单

<receiver
    android:name=".DemoDeviceAdminReceiver"
    android:permission="android.permission.BIND_DEVICE_ADMIN" >
    <intent-filter>
        <action android:name="android.app.action.DEVICE_ADMIN_ENABLED" />
    </intent-filter>

    <meta-data
        android:name="android.app.device_admin"
        android:resource="@xml/device_admin_sample" />
</receiver>

res/xml/device_admin_sample.xml

<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 />
    </uses-policies>
</device-admin>

一切正常,但我不知道每当用户点击disable the appfrom时如何要求输入密码admin rights

请帮助解决这个大谜题。谢谢

4

1 回答 1

1

晚了几年,但我遇到了同样的问题并且能够解决它。也许 OP 不需要答案,但其他人——比如我——可能会在寻找解决方案时偶然发现这个问题。

请记住,这仅在用户无法解锁屏幕时才有效。

您需要做的就是在 DeviceAdminReceiver 的 onDisableRequested 方法中锁定屏幕,这样用户就必须输入密码才能解锁。

请记住,此方法旨在显示警告,说明用户不应禁用权限的原因。如果返回 null(super 的默认值),则不显示任何内容,并且无论如何都禁用该权限。因此,如果我们返回任何文本,将显示一个包含该文本的对话框以及一个确定和一个取消按钮。

如果你将它与这样的屏幕锁定结合起来:

public CharSequence onDisableRequested(Context context, Intent intent) {
    DevicePolicyManager deviceManger = (DevicePolicyManager)context.getSystemService(
            Context.DEVICE_POLICY_SERVICE);
    deviceManger.lockNow();
    return "Your warning";
}

当用户尝试禁用权限时屏幕将关闭,当他们解锁屏幕时,他们需要输入密码。一旦他们这样做了,他们就会看到一个带有警告的对话框、取消按钮和一个确定按钮。只有当他们按下确定时,权限才会被禁用。

于 2017-03-27T10:35:35.177 回答