如何在 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" />