没有活跃的管理员拥有… – 在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); }