首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Xamarin MonoAndroid DeviceAdmin

Xamarin MonoAndroid DeviceAdmin
EN

Stack Overflow用户
提问于 2017-04-28 19:39:04
回答 1查看 1.3K关注 0票数 1

我正在使用Visual Studio 2017开发一个Android单视图应用程序。应用程序应该是一个kiosk应用程序。我的目标是API 21,在Visual Studio (AVD设备)提供的Emulator上。

我遇到的问题是,我似乎无法创建有效的DeviceAdminReceiver。我使用这个链接作为我的指南:Android Kiosk Mode示例可以工作,但我的代码不能。该示例是针对java的。

我的DeviceAdmiReceiver.cs是这样的:

代码语言:javascript
运行
复制
[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中的代码:

代码语言:javascript
运行
复制
 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中的某些东西有关。我认为清单是从类的属性自动生成的。我说错了吗?

更新:这是我使用的line命令:adb -s model:Android_SDK_built_for_x86 shell dpm set-device-owner atp.egg.app/.AdminReceiver

这是我的AndroidManifest.xml:

代码语言:javascript
运行
复制
<?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>

任何建议都将不胜感激。即使是在Xamarin.Android中运行DeviceAdminReceiver的任何地方的示例也可以。

EN

回答 1

Stack Overflow用户

发布于 2017-04-28 20:27:42

我找到了原因,我把它贴在这里,以防其他人也有类似的问题。

问题是Visual Studio正在生成一个具有用于活动和接收器的md5命名空间的AndroidManifest (android:name="md5e47a6bbf1a64ae14eb7c553dec4a7b66.AdminReceiver"

这不允许Android操作系统工具正确地与我的应用程序一起工作。为了解决这个问题,我必须将"Name“属性添加到类([BroadcastReceiver(Permission = "android.permission.BIND_DEVICE_ADMIN",Name ="atp.egg.app.AdminReceiver")])中。

这样做之后,AndroidManifest就有了我的类的正确名称,一切都正常了。

祝您今天愉快。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43679322

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档