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

时间:2015-03-30 16:42:44

标签: java android kotlin

我想简单地锁定屏幕。这是我做的:

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”时,我没有获得足够的权限吗?如果不是如何解决它?

3 个答案:

答案 0 :(得分:2)

为了能够锁定屏幕,您需要添加设备管理员 正如here所述。

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

var dpm: DevicePolicyManager by Delegates.notNull()

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

答案 1 :(得分:2)

(之前的回答链接正确的教程)

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

(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);
}

答案 2 :(得分:0)

你需要做三件事:

  1. <receiver> 添加到 AndroidManifest
  2. <device-admin> 制作新的 xml 文件
  3. DeviceAdminReceiver 制作新的 .kt 文件

这是我已经做过的答案(使用 Kotlin 中的代码):stackoverflow.com