Xamarin MonoAndroid DeviceAdmin

Я использую Visual Studio 2017 для разработки приложения Android Single-View. Приложение должно быть приложением киоска. Я нацеливаюсь на API 21 на эмуляторе, предоставляемом Visual Studio (AVD Device).

У меня проблема в том, что я не могу сделать действительный DeviceAdminReceiver. В качестве руководства я использовал эту ссылку: Режим Android Kiosk. Пример работает, но мой код - нет. Образец для Java.

Вот как мой DeviceAdmiReceiver.cs:

[BroadcastReceiver(Permission = "android.permission.BIND_DEVICE_ADMIN")]
[MetaData("android.app.device_admin", Resource = "@xml/device_admin")]
[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, Resource.String.AdminEnabled, ToastLength.Short).Show();
        Common.BecomeHomeActivity(context);
    }

    public override void OnLockTaskModeEntering(Context context, Intent intent, string pkg)
    {
        Common.ShowToast(context, "[Kiosk Mode enabled]");
    }

    public override void OnLockTaskModeExiting(Context context, Intent intent)
    {
        Common.ShowToast(context, "[Kiosk Mode disabled]");
    }

    public override void OnDisabled(Context context, Intent intent)
    {
        Toast.MakeText(context, Resource.String.AdminDisabled, ToastLength.Short).Show();
    }
}

Это код из моего MainActivity.cs:

 protected override void OnCreate(Bundle bundle)
    {
        try
        {
            base.OnCreate(bundle);

            // Set our view from the "main" layout resource
            SetContentView(Resource.Layout.Main);

            _deviceAdmin = new ComponentName(this, Java.Lang.Class.FromType(typeof(AdminReceiver)));
            _devPolicyManager = (DevicePolicyManager)GetSystemService(Context.DevicePolicyService);

            if (!_devPolicyManager.IsAdminActive(_deviceAdmin))
                Common.ShowToast(this, "Admin is not active");

            if (_devPolicyManager.IsDeviceOwnerApp(PackageName))
                _devPolicyManager.SetLockTaskPackages(_deviceAdmin, new string[] { PackageName });
            else
                Common.ShowToast(this, "App is not Device Owner");
            //}
        }
        catch (Exception ex)
        {

        }
    }

У меня ошибка в том, что когда я пытаюсь установить приложение как DeviceOwner, я получаю сообщение об ошибке Error: Unknown admin: ComponentInfo{atp.egg.app/atp.egg.app.AdminReceiver, Я предполагаю, что ошибка связана с чем-то в AndroidManifest.xml. Я думал, что манифест был автоматически сгенерирован из атрибутов классов. Я ошибся?

Обновление: это команда строки, которую я использую: adb -s model:Android_SDK_built_for_x86 shell dpm set-device-owner atp.egg.app/.AdminReceiver

Это мой AndroidManifest.xml:

<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android" package="atp.egg.app" android:versionCode="1" android:versionName="1.0" android:installLocation="auto">
<uses-sdk android:minSdkVersion="21" android:targetSdkVersion="21" />
<uses-permission android:name="android.permission.BIND_DEVICE_ADMIN" />
<uses-permission android:name="android.permission.INTERNET" />
<application android:label="KioskApp"></application></manifest>

Любые предложения будут ценны. Даже образец где-нибудь, у которого есть работающий DeviceAdminReceiver, сделанный в Xamarin. Андроид в порядке.

1 ответ

Я нашел причину, и я публикую ее здесь, на случай, если у кого-то еще есть подобные проблемы.

Проблема в том, что Visual Studio генерировала AndroidManifest, который имел пространства имен md5 для Activity и Receiver (android:name="md5e47a6bbf1a64ae14eb7c553dec4a7b66.AdminReceiver",

Это не позволяет Android OS Tools правильно работать с моим приложением. Чтобы это исправить, мне пришлось добавить атрибут "Имя" в классы ([BroadcastReceiver(Permission = "android.permission.BIND_DEVICE_ADMIN",Name ="atp.egg.app.AdminReceiver")])

После этого AndroidManifest имеет правильные имена для моих классов, и все работает.

Хорошего дня.

Другие вопросы по тегам