You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

设备管理员应用无法停用:按钮禁用且adb命令报错求助

问题分析与解决方案

核心原因

你的应用被设置成了设备所有者(Device Owner)或配置文件所有者(Profile Owner),而非普通的设备管理员。这类高权限角色默认禁止用户手动停用,ADB的remove-active-admin命令也仅对测试型管理员生效——这就是你报错SecurityException: Attempt to remove non-test admin的原因。

而谷歌Find My Device属于普通设备管理员,只申请了基础设备管理权限,没有被设为所有者,所以系统允许用户手动停用。


解决方案分三种情况处理:

1. 测试阶段临时移除权限

  • 先尝试用ADB清除设备所有者身份(仅未加密设备可用):
    adb shell dpm remove-device-owner com.your.package/.YourDeviceAdminReceiver
    
    之后再执行移除管理员命令:
    adb shell dpm remove-active-admin com.your.package/.YourDeviceAdminReceiver
    
  • 如果上述命令无效,直接恢复出厂设置(会清除所有数据,谨慎操作)。

2. 让应用支持手动停用(和Find My Device一致)

修改Manifest和配置,放弃设备所有者身份,仅保留普通设备管理员权限:

  • 移除所有设置设备所有者的逻辑(比如代码里调用dpm.setDeviceOwner,或者Manifest里的android:testOnly="true"测试配置)。
  • 确保设备管理员Receiver的Manifest配置仅绑定普通权限:
    <receiver
        android:name=".YourDeviceAdminReceiver"
        android:permission="android.permission.BIND_DEVICE_ADMIN">
        <meta-data
            android:name="android.app.device_admin"
            android:resource="@xml/device_admin_config" />
        <intent-filter>
            <action android:name="android.app.action.DEVICE_ADMIN_ENABLED" />
        </intent-filter>
    </receiver>
    
  • 在res/xml/device_admin_config.xml中,只声明必要的普通权限,避免所有者专属权限(比如limit-password、wipe-data这类):
    <device-admin xmlns:android="http://schemas.android.com/apk/res/android">
        <uses-policies>
            <watch-login />
            <reset-password /> <!-- 按需添加,普通管理员可申请这类权限 -->
        </uses-policies>
    </device-admin>
    

3. 必须保留所有者权限,但需要允许停用

这种情况只能在应用内主动提供移除入口:

  • 在你的设备管理员Receiver或应用的管理页面中,调用DevicePolicyManager.clearDeviceOwnerApp(getPackageName())方法——这个方法只有应用自身能触发,你需要添加一个仅内部管理员可见的按钮来执行该操作,用户无法通过系统设置直接停用。

内容的提问来源于stack exchange,提问作者tyczj

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 13:42:11