设备管理员 api 不拥有配置文件的解决方法



我正在通过设备管理员 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 provisioning and dpm command是穿越它的方法。但这不是我在分发应用程序时想要的方式。有什么方法可以通过请求用户允许我的应用程序具有带/没有根的配置文件所有权来自动执行此授权。

这是我的接收器

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 EMM 开发者文档。

在您自己的应用程序中实现这一点非常复杂,相反,您应该考虑使用 Android 管理 API,它提供与更简单的云 API 相同的功能。例如,setPermissionGrantState的等效项是PermissionGrant

相关内容

  • 没有找到相关文章

最新更新