【问题标题】:Avoid SecurityException because of "No active admin owned by"避免 SecurityException 因为“没有活动管理员拥有”
【发布时间】:2012-06-05 20:57:45
【问题描述】:

如何避免这个异常

E/AndroidRuntime(26113): Caused by: java.lang.SecurityException: No active admin owned by uid XXXX for policy #3

调用时:

public static void lockScreen(Context context) {
    Log.d(TAG, "lockScreen");
    ComponentName mDeviceAdminSample = null;
    DevicePolicyManager dpm = (DevicePolicyManager) context.getSystemService(Context.DEVICE_POLICY_SERVICE);
    Intent intent = new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);
    intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, mDeviceAdminSample);
    dpm.lockNow();
}

【问题讨论】:

    标签: android admin securityexception


    【解决方案1】:

    我遇到了与 OP 相同的错误。由于只有其他答案的组合对我有帮助,所以这是我使 OP 代码示例工作的步骤:

    1. 确保您已按照https://developer.android.com/guide/topics/admin/device-admin.html 中的说明创建了设备管理员接收器和 xml 策略文件
    2. 使用 xml 策略文件引用 Manifest 添加管理员接收器。
    3. 安装您的应用
    4. 在设置>安全>设备管理员>“您的应用管理员接收器标签值”中启用应用作为管理员
    5. 或以编程方式执行 [4]

      mDeviceAdminSample = new ComponentName(this,DeviceAdminSampleReceiver.class);
      Intent intent = new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);
      intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, mDeviceAdminSample);
      currActivity.startActivityForResult(intent, 0);
      

    【讨论】:

      【解决方案2】:

      您必须按照参考文档中的说明安装并启用设备管理员:http://developer.android.com/guide/topics/admin/device-admin.html

      【讨论】:

        【解决方案3】:

        您在下面的行中缺少此内容。

        mDeviceAdminSample = new ComponentName(this, DeviceAdminSampleReceiver.class);
        

        【讨论】:

          【解决方案4】:

          注意线条:

                  Intent it = new         Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);
                  it.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, new ComponentName(this, YourAdminReceiver.class));
                  startActivityForResult(it, 0);
          

          可以跳过。如果您不希望您的用户允许应用锁定屏幕,则可以使用另一种方法:

          adb shell dpm set-device-owner com.package/.YourAdminReceiver
          

          现在这与 OP 遇到的 SecurityException 有什么关系?

          好吧,我已经通过 adb shell 方式将设备所有者设置为 com.package/.YourAdminReceiver,但目的与屏幕锁定不同。当我将<force-lock> 标签添加到我的 device-admin.xml 时:

          <uses-policies>
                  <limit-password />
                  <reset-password />
                  <force-lock />
              </uses-policies>
          

          我自然希望我的locknow() API 调用能够正常工作,但实际上并没有。就像 OP 一样,我得到了 SecurityException。奇怪,因为我的应用程序已经是设备的管理员和所有者。我通过从设备所有者角色中取消设置,将其卸载然后重新安装来使其工作。请注意,一旦通过 adb shell 设置为设备所有者,应用程序只能从代码中取消设置该角色:

          //        mDpm.clearDeviceOwnerApp(getPackageName());
          //        mDpm.removeActiveAdmin(deviceAdmin);
          

          【讨论】:

            【解决方案5】:

            就我而言,设备管理员是仪器测试的一部分,而不是我的应用程序本身。原来是 Android 处理权限的方式中的一个错误。解决方法是将设备管理类、清单和策略移动到目标应用程序中。当然不理想,但我看不出有什么办法。

            【讨论】:

              【解决方案6】:

              你需要做三件事:

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

              这是我已经做过的答案的链接(带有示例代码):stackoverflow.com

              来自developer.android.com的参考

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2015-06-03
                • 1970-01-01
                • 2023-04-08
                • 2020-11-21
                • 1970-01-01
                • 1970-01-01
                • 2012-03-23
                • 2012-12-28
                相关资源
                最近更新 更多