我想简单地锁定屏幕。这是我做的:
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”时,我没有获得足够的权限吗?如果不是如何解决它?
答案 0 :(得分:2)
为了能够锁定屏幕,您需要添加设备管理员 正如here所述。
第二: 如果你有任何属性,你不能在构造函数中赋值, 使用notNull-Delegate。
var dpm: DevicePolicyManager by Delegates.notNull()
在设置之前访问dpm时,会抛出NPE。 如果没有,你不必一直检查dpm为空。
答案 1 :(得分:2)
(之前的回答链接正确的教程)
您收到的错误,因为您的应用未启用为设备管理员。
政策定义资源(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)
你需要做三件事:
<receiver>
添加到 AndroidManifest<device-admin>
制作新的 xml 文件DeviceAdminReceiver
制作新的 .kt 文件这是我已经做过的答案(使用 Kotlin 中的代码):stackoverflow.com