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

Android 12及以上版本如何申请应用管理员权限?

问题

开发的应用包含在线触发的前台远程擦除功能,该功能通过ADB分配管理员权限后可正常运行,但尝试在应用内申请权限时遇到问题,执行后返回ActivityResult{resultCode=RESULT_CANCELED, data=null}。以下是相关代码配置:

Manifest配置

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="com.hello.chatreal">

    <uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
    <uses-permission android:name="android.permission.USE_FULL_SCREEN_INTENT"/>
    <uses-permission android:name="android.permission.LOCK_DEVICE" tools:ignore="ProtectedPermissions" />
    <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.CAMERA" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.RECORD_AUDIO" />
    <uses-permission android:name="android.permission.VIBRATE"/>

    <uses-feature android:name="android.hardware.camera" />

    <application
        android:allowBackup="true"
        android:dataExtractionRules="@xml/data_extraction_rules"
        android:fullBackupContent="@xml/backup_rules"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.ChatReal"
        tools:targetApi="31">

        <service android:name=".SampleForegroundService"/>

        <activity
            android:name=".LockscreenActivity"
            android:launchMode="singleTop"
            android:showOnLockScreen="true" />

        <activity
            android:name=".MainActivity"
            android:configChanges="screenSize|smallestScreenSize|screenLayout|orientation"
            android:supportsPictureInPicture="true"
            android:launchMode="singleTask"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <receiver
            android:name=".NotificationReceiver"
            android:enabled="true"
            android:exported="true" />

        <receiver android:name=".HangUp"
            android:enabled="true"
            android:exported="true" >
        </receiver>

        <receiver
            android:name=".DeviceAdminReceiverClass"
            android:description="@string/app_name"
            android:exported="true"
            android:label="@string/app_name"
            android:permission="android.permission.BIND_DEVICE_ADMIN">
            <meta-data
                android:name="android.app.device_admin"
                android:resource="@xml/device_admin" />
            <intent-filter android:priority="1000">
                <action android:name="android.app.action.DEVICE_ADMIN_DISABLED" />
                <action android:name="android.app.action.DEVICE_ADMIN_ENABLED" />
                <action android:name="android.intent.action.DEVICE_ADMIN_ENABLED" />
                <action android:name="android.intent.action.PROFILE_PROVISIONING_COMPLETE" />
                <action android:name="android.intent.action.BOOT_COMPLETED" />
            </intent-filter>
        </receiver>


    </application>

</manifest>

Activity中申请权限的代码

var startActivityIntent: ActivityResultLauncher<Intent> = registerForActivityResult(
        ActivityResultContracts.StartActivityForResult(),
        ActivityResultCallback<ActivityResult> {
            Log.d("debug", it.toString())
        })

fun requestAdminRights() {
    val componentName = ComponentName(this, DeviceAdminReceiver::class.java)
    val chooserIntent = Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN).apply {
        putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, componentName)
        putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION, "Testcase")
    }
    startActivityIntent.launch(chooserIntent)
}
requestAdminRights()

返回结果

ActivityResult{resultCode=RESULT_CANCELED, data=null}

请问在Android 12中使用Kotlin实现该功能,还遗漏了哪些步骤?

解决方案

针对Android 12下的问题,你需要修正以下几个关键问题:

  • ComponentName类名不匹配:你的Manifest中注册的设备管理员Receiver是DeviceAdminReceiverClass,但代码中创建ComponentName时用的是DeviceAdminReceiver::class.java,这会导致系统找不到对应的Receiver,直接返回取消结果。修正代码中的ComponentName:

    val componentName = ComponentName(this, DeviceAdminReceiverClass::class.java)
    
  • 检查device_admin.xml的权限声明:确保res/xml/device_admin.xml中声明了远程擦除所需的权限,否则系统会拒绝你的管理员申请。示例配置如下:

    <device-admin xmlns:android="http://schemas.android.com/apk/res/android">
        <uses-policies>
            <!-- 远程擦除所需权限 -->
            <remote-wipe />
            <!-- 如果需要其他管理员权限,比如锁定设备,也需要声明 -->
            <lock-device />
        </uses-policies>
    </device-admin>
    
  • 确保在合适时机调用权限申请:不要在Activity的初始化阶段直接调用requestAdminRights(),比如不要在成员变量初始化时执行,应该在onCreate()或onStart()方法中调用,确保ActivityResultLauncher已经完成注册。

  • 移除不必要的权限声明:android.permission.LOCK_DEVICE是系统保护权限,当应用获得设备管理员权限后,会自动拥有相关功能,无需单独声明该权限,可以从Manifest中移除。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 20:14:50