android - 解决 Device admin api does not own profile

标签 android kotlin device-admin

我正在通过设备管理 api 工作,在调用 DevicePolicyManager 上的 setPermissionGrantState 函数时,我得到了

Unable to start receiver com.xx.admin.receivers.AdminReceiver: java.lang.SecurityException: Admin ComponentInfo{com.xx/com.xx.admin.receivers.AdminReceiver} does not own the profile.

我了解某些功能只能由设备/配置文件所有者运行。此外,NFC 配置和 dpm 命令 是通过它的方式。但这不是我分发应用程序时想要进行的方式。有什么方法可以通过请求用户允许我的应用程序使用具有/不具有 root 的配置文件所有权来自动执行此授权。

这是我的接收器

class AdminReceiver : DeviceAdminReceiver() {

    var manager: DevicePolicyManager? = null
    override fun onEnabled(context: Context?, intent: Intent?) {
        super.onEnabled(context, intent)
        manager = getManager(context)
        manager!!.setPermissionGrantState(getComponentName(context!!)
                , "com.abc.app"
                , Manifest.permission.WRITE_EXTERNAL_STORAGE
                , DevicePolicyManager.PERMISSION_GRANT_STATE_DENIED)


    }

    fun getComponentName(context: Context): ComponentName {
        return ComponentName(context.applicationContext, AdminReceiver::class.java)
    }

}

最佳答案

NFC 配置仅在设置设备所有者时需要。

我会说 dpm 命令通常也用于测试/设置设备所有者(这就是我用它的目的),但您也可以设置配置文件所有者。

您可以使用以下代码以编程方式设置托管配置文件。您要管理的应用程序必须安装在此配置文件中。此代码基于 android-AppRestrictionEnforcer。

/**
 * Initiates the managed profile provisioning. If we already have a managed profile set up on
 * this device, we will get an error dialog in the following provisioning phase.
 */
private void provisionManagedProfile() {
    Activity activity = getActivity();
    if (null == activity) {
        return;
    }
    Intent intent = new Intent(ACTION_PROVISION_MANAGED_PROFILE);
    if (Build.VERSION.SDK_INT >= 24) {
        intent.putExtra(EXTRA_PROVISIONING_DEVICE_ADMIN_COMPONENT_NAME,
                CustomDeviceAdminReceiver.getComponentName(activity));
    } else {
        //noinspection deprecation
        intent.putExtra(EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_NAME,
                activity.getApplicationContext().getPackageName());
        intent.putExtra(EXTRA_DEVICE_ADMIN, CustomDeviceAdminReceiver.getComponentName(activity));
    }
    if (intent.resolveActivity(activity.getPackageManager()) != null) {
        startActivityForResult(intent, REQUEST_PROVISION_MANAGED_PROFILE);
        activity.finish();
    } else {
        Toast.makeText(activity, "Device provisioning is not enabled. Stopping.",
                Toast.LENGTH_SHORT).show();
    }
}

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == REQUEST_PROVISION_MANAGED_PROFILE) {
        if (resultCode == Activity.RESULT_OK) {
            Toast.makeText(getActivity(), "Provisioning done.", Toast.LENGTH_SHORT).show();
        } else {
            Toast.makeText(getActivity(), "Provisioning failed.", Toast.LENGTH_SHORT).show();
        }
        return;
    }
    super.onActivityResult(requestCode, resultCode, data);
}

关于android - 解决 Device admin api does not own profile,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45548476/

相关文章:

firebase - Firestore 在失去并重新获得互联网连接后停止更新

Android:以编程方式从设备管理员中删除我的应用程序?

android - Jetpack Compose 带按钮的倾斜行

android - 操作栏 - 操作项的定位

带有 BroadcastReceiver 内部类的 Android AlarmManager

java - Android三元运算符对自定义 View 的自定义颜色属性

android - 用于android人脸识别的openCV显示 "mat not continuous"错误

gradle - Gradle:从根项目任务中的子项目中读取变量 block

java - 启动 Activity 时未显示 "Enable Device Admin"的对话框

android - 检测正在从电话/设备管理员中删除的应用程序