我只需要确保用户在卸载该应用程序时需要输入在我的应用程序中设置的密码。
幸运的是,对于 SDK 应用程序来说,这是不可能实现的。即使是设备管理器应用程序也无法防止用户卸载它。
devicePolicyManager.wipeData(ACTIVATION_REQUEST);
您无法通过编程方式激活它,但您可以要求用户在运行时启用它。以下是完整的解决方案:
var devicePolicyManager: DevicePolicyManager? = null
var deviceAdmin: ComponentName? = null
在需要的地方,在oncreate中调用此方法。
// 调用此方法以检查它是否已启用
checkAndTakeUserToEnableEnableAdminApp()
private fun checkAndTakeUserToEnableEnableAdminApp() {
devicePolicyManager = getSystemService(Context.DEVICE_POLICY_SERVICE) as DevicePolicyManager
deviceAdmin = ComponentName(this, DeviceAdminReceiverClass::class.java)
if (devicePolicyManager!!.isAdminActive(deviceAdmin!!)) {
//do whatever is needed here is its active
} else {
showDeviceAdminPopup(this)
}
}
在哪里 DeviceAdminReceiverClass
import android.app.admin.DeviceAdminReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
import android.widget.Toast;
/**
* This is the component that is responsible for actual device administration.
* It becomes the receiver when a policy is applied. It is important that we
* subclass DeviceAdminReceiverClass class here and to implement its only required
* method onEnabled().
*/
public class DeviceAdminReceiverClass extends DeviceAdminReceiver {
static final String TAG = "DeviceAdminReceiverClass";
/** 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, "Device admin is enabled",
Toast.LENGTH_LONG).show();
Log.d(TAG, "onEnabled");
}
/** 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, "Device admin is 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=".DeviceAdminReceiverClass"
android:permission="android.permission.BIND_DEVICE_ADMIN" >
<intent-filter>
<!-- This action is required -->
<action android:name="android.app.action.DEVICE_ADMIN_ENABLED" />
</intent-filter>
<!-- This is required this receiver to become device admin component. -->
<meta-data
android:name="android.app.device_admin"
android:resource="@xml/device_admin" />
</receiver>
@xml/device_admin
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2010 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<device-admin xmlns:android="http://schemas.android.com/apk/res/android"
android:visible="false">
<uses-policies>
<watch-login />
<force-lock />
</uses-policies>
</device-admin>