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

