没有活跃的管理员拥有… – 在Android中锁定屏幕

我想简单地锁定屏幕。 以下是我所做的:

public class MainActivity : ActionBarActivity() { var dpm: DevicePolicyManager? = null override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) dpm = getSystemService(Context.DEVICE_POLICY_SERVICE) as DevicePolicyManager } override fun onCreateOptionsMenu(menu: Menu?): Boolean { getMenuInflater()?.inflate(R.menu.menu_main, menu) dpm?.lockNow() return true } } 

这是在Kotlin,但是Java会理解的。

和清单:

 <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="android.me.com.app123" > <uses-permission android:name="android.permission.USES_POLICY_FORCE_LOCK"> </uses-permission> <application android:allowBackup="true" 

错误是:

 android.me.com.app123 E/AndroidRuntime﹕ FATAL EXCEPTION: main Process: android.me.com.app123, PID: 22964 java.lang.SecurityException: No active admin owned by uid 10121 for policy #3 at android.os.Parcel.readException(Parcel.java:1472) 

当我说“android.permission.USES_POLICY_FORCE_LOCK”时,我没有获得足够的权限吗? 如果不是如何解决它?

为了能够锁定屏幕,您需要按照此处所述添加设备管理员。

第二:如果你有任何属性,你不能在构造函数中赋值,可以使用notNull-Delegate。

 var dpm: DevicePolicyManager by Delegates.notNull() 

在设置之前访问dpm时,会抛出一个NPE。 如果不是,你不必一直检查dpm为空。

(以前的答案链接正确的教程)

您收到的错误,因为您的应用程序未启用设备管理员。

(pof)实施的要点:

策略定义资源(res / xml / ….):

 <device-admin> <uses-policies> <force-lock /> </uses-policies> </device-admin> 

广播接收机:

 <receiver android:name="your.LockDeviceAdminReceiver" 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> 

检查管理员的启用状态(如果没有,则启动活动并处理结果):

 val devicePolicyManager = getSystemService(Context.DEVICE_POLICY_SERVICE) as DevicePolicyManager val deviceAdminReceiver = ComponentName(context, LockDeviceAdminReceiver::class.java) if (devicePolicyManager.isAdminActive(deviceAdminReceiver)) { devicePolicyManager.lockNow() } else { val intent = Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN) intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, deviceAdminReceiver)) startActivityForResult(intent, ENABLE_ADMIN_REQUEST_CODE); }