如何在 Android Xamarin C# 中向用户显示设备管理权限界面?
How to display device admin permissions interface to user in Android Xamarin C#?
我有一个 Android Xamarin 框架应用程序,当 activity 的焦点丢失时我需要锁定设备。我的 class 中有 DevicePolicyManager 对象和 DeviceAdmin 组件。我需要请求设备管理员权限,以便覆盖 onwindowfocuschange
以使用 DevicePolicyManager 对象锁定设备。如何请求设备管理用户界面显示在我的 oncreate 方法中。我已经扩展了 DeviceAdminReceiver class 并在下面的 class
中注册了所有元数据和接收器
[BroadcastReceiver(Permission = "android.permission.BIND_DEVICE_ADMIN",Name="LockScreenAPI.AdminReceiver")]
[MetaData("android.app.device_admin", Resource = "@xml/device_admin_sample")]
[IntentFilter(new[] { "android.app.action.DEVICE_ADMIN_ENABLED", Intent.ActionMain})]
public class AdminReceiver : DeviceAdminReceiver
{
public override void OnEnabled(Context context, Intent intent)
{
base.OnEnabled(context, intent);
Toast.MakeText(context, "Device Admin Enabled", ToastLength.Short).Show();
}
public override void OnLockTaskModeEntering(Context context, Intent intent, string pkg)
{
Toast.MakeText(context,"'Device entering locked mode",ToastLength.Long).Show();
}
public override void OnLockTaskModeExiting(Context context, Intent intent)
{
}
public override void OnDisabled(Context context, Intent intent)
{
Toast.MakeText(context,"Admin mode disabled",ToastLength.Long).Show();
}
}
然后在主要 activity 中声明 DevicePolicyManager 和 deviceAdmin 组件,如下所示
[Activity(Label = "@string/app_name", Theme = "@style/AppTheme", MainLauncher = true)]
public class MainActivity : AppCompatActivity,Preference.IOnPreferenceChangeListener
{
private LockReceiver _lockReceiver;
//declare a devicepolicymanager object
private DevicePolicyManager _devicePolicyManager;
//declare a component name
private ComponentName _deviceAdmin;
private Preference preference;
protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
// Set our view from the "main" layout resource
SetContentView(Resource.Layout.activity_main);
//request device admin permissions from the user
permissions();
_devicePolicyManager = (DevicePolicyManager)GetSystemService(Context.DevicePolicyService);
_deviceAdmin = new ComponentName(this, Java.Lang.Class.FromType(typeof(AdminReceiver)));
//check if admin mode is enabled
if (_devicePolicyManager.IsAdminActive(_deviceAdmin))
{
Toast.MakeText(this,"Device admin is enabled",ToastLength.Long).Show();
}
else
{
//show the device permissions
try
{
Intent devicePolicy = new Intent(DevicePolicyManager.ActionAddDeviceAdmin);
devicePolicy.PutExtra(DevicePolicyManager.ExtraDeviceAdmin,savedInstanceState);
devicePolicy.PutExtra(DevicePolicyManager.ExtraAddExplanation,
"Enable device administration for this app");
StartActivityForResult(devicePolicy,909);
}
catch (Exception p)
{
Toast.MakeText(this,p.Message,ToastLength.Long).Show();
}
if (_devicePolicyManager.IsAdminActive(_deviceAdmin) == true)
{
try
{
_devicePolicyManager.LockNow();
}
catch (Exception m)
{
Toast.MakeText(this, m.Message,ToastLength.Long).Show();
}
}
IntentFilter filter = new IntentFilter(Intent.ActionScreenOn);
//register the receiver
RegisterReceiver(_lockReceiver, filter);
}
不知道我是否明白你的要求。但是你可以试试看这个 link 是关于 native android.
官方文档:https://developer.android.com/guide/topics/admin/device-admin#enabling
本地的类似情况:
使用xamarin.android中的代码:
Intent intent = new Intent(DevicePolicyManager.ActionAddDeviceAdmin);
intent.PutExtra(DevicePolicyManager.ExtraDeviceAdmin, _deviceAdmin);
intent.PutExtra(DevicePolicyManager.ExtraAddExplanation, "some description");
StartActivityForResult(intent, ACTIVATION_REQUEST);//ACTIVATION_REQUEST is a custom int value
更新:
接收器代码:
[BroadcastReceiver(Permission = "android.permission.BIND_DEVICE_ADMIN")]
[MetaData("android.app.device_admin", Resource = "@xml/device_admin_sample")]
[IntentFilter(new[] { "android.app.action.DEVICE_ADMIN_ENABLED", Intent.ActionMain })]
public class AdminReceiver : DeviceAdminReceiver
{
public override void OnEnabled(Context context, Intent intent)
{
base.OnEnabled(context, intent);
Toast.MakeText(context, "Device Admin Enabled", ToastLength.Short).Show();
}
public override void OnLockTaskModeEntering(Context context, Intent intent, string pkg)
{
Toast.MakeText(context, "'Device entering locked mode", ToastLength.Long).Show();
}
public override void OnLockTaskModeExiting(Context context, Intent intent)
{
}
public override void OnDisabled(Context context, Intent intent)
{
Toast.MakeText(context, "Admin mode disabled", ToastLength.Long).Show();
}
}
关于xml的代码:
<device-admin xmlns:android="http://schemas.android.com/apk/res/android" >
<uses-policies>
<limit-password />
<watch-login />
<reset-password />
<force-lock />
<wipe-data />
<expire-password />
<encrypted-storage />
<disable-camera />
</uses-policies>
</device-admin>
我的 OnCreate 方法中的代码:
protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
Xamarin.Essentials.Platform.Init(this, savedInstanceState);
// Set our view from the "main" layout resource
SetContentView(Resource.Layout.activity_main);
ComponentName _deviceAdmin = new ComponentName(this, Java.Lang.Class.FromType(typeof(AdminReceiver)));
Intent intent = new Intent(DevicePolicyManager.ActionAddDeviceAdmin);
intent.PutExtra(DevicePolicyManager.ExtraDeviceAdmin, _deviceAdmin);
intent.PutExtra(DevicePolicyManager.ExtraAddExplanation, "some description");
StartActivityForResult(intent, 47);//ACTIVATION_REQUEST is a custom int value
}
AndroidManifest.xml中的权限:
<uses-permission android:name="android.permission.BIND_DEVICE_ADMIN" />
我有一个 Android Xamarin 框架应用程序,当 activity 的焦点丢失时我需要锁定设备。我的 class 中有 DevicePolicyManager 对象和 DeviceAdmin 组件。我需要请求设备管理员权限,以便覆盖 onwindowfocuschange
以使用 DevicePolicyManager 对象锁定设备。如何请求设备管理用户界面显示在我的 oncreate 方法中。我已经扩展了 DeviceAdminReceiver class 并在下面的 class
[BroadcastReceiver(Permission = "android.permission.BIND_DEVICE_ADMIN",Name="LockScreenAPI.AdminReceiver")]
[MetaData("android.app.device_admin", Resource = "@xml/device_admin_sample")]
[IntentFilter(new[] { "android.app.action.DEVICE_ADMIN_ENABLED", Intent.ActionMain})]
public class AdminReceiver : DeviceAdminReceiver
{
public override void OnEnabled(Context context, Intent intent)
{
base.OnEnabled(context, intent);
Toast.MakeText(context, "Device Admin Enabled", ToastLength.Short).Show();
}
public override void OnLockTaskModeEntering(Context context, Intent intent, string pkg)
{
Toast.MakeText(context,"'Device entering locked mode",ToastLength.Long).Show();
}
public override void OnLockTaskModeExiting(Context context, Intent intent)
{
}
public override void OnDisabled(Context context, Intent intent)
{
Toast.MakeText(context,"Admin mode disabled",ToastLength.Long).Show();
}
}
然后在主要 activity 中声明 DevicePolicyManager 和 deviceAdmin 组件,如下所示
[Activity(Label = "@string/app_name", Theme = "@style/AppTheme", MainLauncher = true)]
public class MainActivity : AppCompatActivity,Preference.IOnPreferenceChangeListener
{
private LockReceiver _lockReceiver;
//declare a devicepolicymanager object
private DevicePolicyManager _devicePolicyManager;
//declare a component name
private ComponentName _deviceAdmin;
private Preference preference;
protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
// Set our view from the "main" layout resource
SetContentView(Resource.Layout.activity_main);
//request device admin permissions from the user
permissions();
_devicePolicyManager = (DevicePolicyManager)GetSystemService(Context.DevicePolicyService);
_deviceAdmin = new ComponentName(this, Java.Lang.Class.FromType(typeof(AdminReceiver)));
//check if admin mode is enabled
if (_devicePolicyManager.IsAdminActive(_deviceAdmin))
{
Toast.MakeText(this,"Device admin is enabled",ToastLength.Long).Show();
}
else
{
//show the device permissions
try
{
Intent devicePolicy = new Intent(DevicePolicyManager.ActionAddDeviceAdmin);
devicePolicy.PutExtra(DevicePolicyManager.ExtraDeviceAdmin,savedInstanceState);
devicePolicy.PutExtra(DevicePolicyManager.ExtraAddExplanation,
"Enable device administration for this app");
StartActivityForResult(devicePolicy,909);
}
catch (Exception p)
{
Toast.MakeText(this,p.Message,ToastLength.Long).Show();
}
if (_devicePolicyManager.IsAdminActive(_deviceAdmin) == true)
{
try
{
_devicePolicyManager.LockNow();
}
catch (Exception m)
{
Toast.MakeText(this, m.Message,ToastLength.Long).Show();
}
}
IntentFilter filter = new IntentFilter(Intent.ActionScreenOn);
//register the receiver
RegisterReceiver(_lockReceiver, filter);
}
不知道我是否明白你的要求。但是你可以试试看这个 link 是关于 native android.
官方文档:https://developer.android.com/guide/topics/admin/device-admin#enabling
本地的类似情况:
使用xamarin.android中的代码:
Intent intent = new Intent(DevicePolicyManager.ActionAddDeviceAdmin);
intent.PutExtra(DevicePolicyManager.ExtraDeviceAdmin, _deviceAdmin);
intent.PutExtra(DevicePolicyManager.ExtraAddExplanation, "some description");
StartActivityForResult(intent, ACTIVATION_REQUEST);//ACTIVATION_REQUEST is a custom int value
更新:
接收器代码:
[BroadcastReceiver(Permission = "android.permission.BIND_DEVICE_ADMIN")]
[MetaData("android.app.device_admin", Resource = "@xml/device_admin_sample")]
[IntentFilter(new[] { "android.app.action.DEVICE_ADMIN_ENABLED", Intent.ActionMain })]
public class AdminReceiver : DeviceAdminReceiver
{
public override void OnEnabled(Context context, Intent intent)
{
base.OnEnabled(context, intent);
Toast.MakeText(context, "Device Admin Enabled", ToastLength.Short).Show();
}
public override void OnLockTaskModeEntering(Context context, Intent intent, string pkg)
{
Toast.MakeText(context, "'Device entering locked mode", ToastLength.Long).Show();
}
public override void OnLockTaskModeExiting(Context context, Intent intent)
{
}
public override void OnDisabled(Context context, Intent intent)
{
Toast.MakeText(context, "Admin mode disabled", ToastLength.Long).Show();
}
}
关于xml的代码:
<device-admin xmlns:android="http://schemas.android.com/apk/res/android" >
<uses-policies>
<limit-password />
<watch-login />
<reset-password />
<force-lock />
<wipe-data />
<expire-password />
<encrypted-storage />
<disable-camera />
</uses-policies>
</device-admin>
我的 OnCreate 方法中的代码:
protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
Xamarin.Essentials.Platform.Init(this, savedInstanceState);
// Set our view from the "main" layout resource
SetContentView(Resource.Layout.activity_main);
ComponentName _deviceAdmin = new ComponentName(this, Java.Lang.Class.FromType(typeof(AdminReceiver)));
Intent intent = new Intent(DevicePolicyManager.ActionAddDeviceAdmin);
intent.PutExtra(DevicePolicyManager.ExtraDeviceAdmin, _deviceAdmin);
intent.PutExtra(DevicePolicyManager.ExtraAddExplanation, "some description");
StartActivityForResult(intent, 47);//ACTIVATION_REQUEST is a custom int value
}
AndroidManifest.xml中的权限:
<uses-permission android:name="android.permission.BIND_DEVICE_ADMIN" />