【问题标题】:No active admin owned ... - locking a screen in Android没有活跃的管理员拥有... - 在 Android 中锁定屏幕
【发布时间】:2015-03-30 16:42:44
【问题描述】:

我只想锁定屏幕。这是我所做的:

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

【问题讨论】:

  • 不清楚下面的答案是否对您有帮助,因为您没有接受答案,也没有留下任何 cmets。您能否查看答案,以便清楚这是有用的答案还是您仍然需要帮助?

标签: java android kotlin


【解决方案1】:

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

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

var dpm: DevicePolicyManager by Delegates.notNull()

当您在设置之前访问 dpm 时,会抛出 NPE。 如果没有,您将不必一直检查 dpm 是否为 null。

【讨论】:

    【解决方案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>
    

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

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

    【讨论】:

      【解决方案3】:

      你需要做三件事:

      1. &lt;receiver&gt; 添加到AndroidManifest
      2. &lt;device-admin&gt;创建新的xml文件
      3. DeviceAdminReceiver 制作新的.kt 文件

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-01-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-04-01
        相关资源
        最近更新 更多