赛马林 | Android |科苏错误
Xamarin | Android | COSU Error
我正在尝试创建 COSU 设备。我公司销售的硬件将运行我们开发的单个应用程序。我浏览了许多教程,试图为此建立一个概念证明。
我目前有以下内容。
在我的 AndroidManaifest.xml
然后……
<application android:allowBackup="true" android:label="@string/app_name" android:keepScreenOn="true" >
<receiver android:name="DeviceAdmin"
android:label="@string/sample_device_admin"
android:description="@string/sample_device_admin_description"
android:permission="android.permission.BIND_DEVICE_ADMIN">
<intent-filter>
<action android:name="android.app.action.DEVICE_ADMIN_ENABLED" />
</intent-filter>
<device-admin>
<uses-policies>
<limit-password />
<watch-login />
<reset-password />
<force-lock />
<wipe-data />
</uses-policies>
</device-admin>
</receiver>
<uses-permission android:name="android.permission.MANAGE_DEVICE_ADMINS" />
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.HOME" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</application>
在device_admin_receiver.xml
<?xml version="1.0" encoding="utf-8"?>
<device-admin xmlns:android="http://schemas.android.com/apk/res/android">
<uses-policies>
<limit-password />
<watch-login />
<reset-password />
<force-lock />
<wipe-data />
</uses-policies>
</device-admin>
DeviceAdmin.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Android.App;
using Android.App.Admin;
using Android.Content;
using Android.OS;
using Android.Runtime;
using Android.Views;
using Android.Widget;
namespace CB.App
{
public class DeviceAdmin : DeviceAdminReceiver
{
}
}
最后 MainActivity.cs
的 OnCreate
protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
Window.DecorView.SystemUiVisibility = (StatusBarVisibility)flags;
// Setup the collection and register implementations
IServiceCollection coll = new ServiceCollection();
RegisterDependencies(coll);
// Build the global services
ServiceRegistrationHelper.RegisterCoreServices(coll);
// Register the provide with the GlobalServices
GlobalServices.RegisterServiceProvider(coll.BuildServiceProvider(new ServiceProviderOptions()));
// Set our view from the "main" layout resource
SetContentView(Resource.Layout.Main);
DevicePolicyManager myDevicePolicyManager = (DevicePolicyManager)this.GetSystemService(Activity.DevicePolicyService);
// get this app package name
ComponentName mDPM = new ComponentName(this, typeof(DeviceAdmin).Name);
if( myDevicePolicyManager.IsDeviceOwnerApp(this.PackageName))
{
//myDevicePolicyManager.ClearDeviceOwnerApp(this.PackageName);
String[] packages = { this.PackageName };
myDevicePolicyManager.SetLockTaskPackages(mDPM, packages);
StartLockTask();
SetUpClock();
DisplayHome();
}
else
{
Toast.MakeText(this.ApplicationContext, "Not Owner", ToastLength.Long).Show();
}
}
在 ADB Shell 我 运行 命令 dpm set-device-owner com.companyname.productname/.DeviceAdmin 并收到 Success: Device owner set to package componentinfo{com.companyname.productname/com.companyname.productname.DeviceAdmin} 活动管理员设置为组件 {com.companyname.productname/com.companyname.productename.DeviceAdmin}
它构建并部署,但是当它到达行时
myDevicePolicyManager.SetLockTaskPackages(mDPM, packages);
它抛出错误 Java.Lang.SecurityException: 没有活动的管理员 ComponentInfo(com.lathem.cumberland/DeviceAdmin
我错过了什么?
从您的 receiver
中删除 <device-admin>
部分,这应该通过单独的 xml 资源引用,或者通过硬编码接收者的 meta-data
部分清单部分或通过 class 属性:
[BroadcastReceiver(
Name = "com.sushihangover.cosu.DeviceAdminReceiver",
Label = "Whosebug",
Permission = "android.permission.BIND_DEVICE_ADMIN",
Exported = true
)]
[MetaData("android.app.device_admin", Resource = "@xml/device_admin_receiver")]
[IntentFilter(new[] {
"android.intent.action.DEVICE_ADMIN_ENABLE",
"android.intent.action.PROFILE_PROVISIONING_COMPLETE",
"android.intent.action.BOOT_COMPLETED"
})]
public class MyDeviceAdminReceiver : DeviceAdminReceiver {}
使用 Java class 名称,而不是 C# 名称:
ComponentName mDPM = new ComponentName(this, Java.Lang.Class.FromType(typeof(DeviceAdminReceiver)));
注意:根据我对 DeviceAdminReceiver
子 class 使用的 Java 名称,dpm set-device-owner
将是:
adb shell dpm set-device-owner com.sushihangover.cosu/com.sushihangover.cosu.DeviceAdminReceiver
我正在尝试创建 COSU 设备。我公司销售的硬件将运行我们开发的单个应用程序。我浏览了许多教程,试图为此建立一个概念证明。
我目前有以下内容。
在我的 AndroidManaifest.xml
然后……
<application android:allowBackup="true" android:label="@string/app_name" android:keepScreenOn="true" >
<receiver android:name="DeviceAdmin"
android:label="@string/sample_device_admin"
android:description="@string/sample_device_admin_description"
android:permission="android.permission.BIND_DEVICE_ADMIN">
<intent-filter>
<action android:name="android.app.action.DEVICE_ADMIN_ENABLED" />
</intent-filter>
<device-admin>
<uses-policies>
<limit-password />
<watch-login />
<reset-password />
<force-lock />
<wipe-data />
</uses-policies>
</device-admin>
</receiver>
<uses-permission android:name="android.permission.MANAGE_DEVICE_ADMINS" />
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.HOME" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</application>
在device_admin_receiver.xml
<?xml version="1.0" encoding="utf-8"?>
<device-admin xmlns:android="http://schemas.android.com/apk/res/android">
<uses-policies>
<limit-password />
<watch-login />
<reset-password />
<force-lock />
<wipe-data />
</uses-policies>
</device-admin>
DeviceAdmin.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Android.App;
using Android.App.Admin;
using Android.Content;
using Android.OS;
using Android.Runtime;
using Android.Views;
using Android.Widget;
namespace CB.App
{
public class DeviceAdmin : DeviceAdminReceiver
{
}
}
最后 MainActivity.cs
的 OnCreateprotected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
Window.DecorView.SystemUiVisibility = (StatusBarVisibility)flags;
// Setup the collection and register implementations
IServiceCollection coll = new ServiceCollection();
RegisterDependencies(coll);
// Build the global services
ServiceRegistrationHelper.RegisterCoreServices(coll);
// Register the provide with the GlobalServices
GlobalServices.RegisterServiceProvider(coll.BuildServiceProvider(new ServiceProviderOptions()));
// Set our view from the "main" layout resource
SetContentView(Resource.Layout.Main);
DevicePolicyManager myDevicePolicyManager = (DevicePolicyManager)this.GetSystemService(Activity.DevicePolicyService);
// get this app package name
ComponentName mDPM = new ComponentName(this, typeof(DeviceAdmin).Name);
if( myDevicePolicyManager.IsDeviceOwnerApp(this.PackageName))
{
//myDevicePolicyManager.ClearDeviceOwnerApp(this.PackageName);
String[] packages = { this.PackageName };
myDevicePolicyManager.SetLockTaskPackages(mDPM, packages);
StartLockTask();
SetUpClock();
DisplayHome();
}
else
{
Toast.MakeText(this.ApplicationContext, "Not Owner", ToastLength.Long).Show();
}
}
在 ADB Shell 我 运行 命令 dpm set-device-owner com.companyname.productname/.DeviceAdmin 并收到 Success: Device owner set to package componentinfo{com.companyname.productname/com.companyname.productname.DeviceAdmin} 活动管理员设置为组件 {com.companyname.productname/com.companyname.productename.DeviceAdmin}
它构建并部署,但是当它到达行时
myDevicePolicyManager.SetLockTaskPackages(mDPM, packages);
它抛出错误 Java.Lang.SecurityException: 没有活动的管理员 ComponentInfo(com.lathem.cumberland/DeviceAdmin
我错过了什么?
从您的 receiver
中删除 <device-admin>
部分,这应该通过单独的 xml 资源引用,或者通过硬编码接收者的 meta-data
部分清单部分或通过 class 属性:
[BroadcastReceiver(
Name = "com.sushihangover.cosu.DeviceAdminReceiver",
Label = "Whosebug",
Permission = "android.permission.BIND_DEVICE_ADMIN",
Exported = true
)]
[MetaData("android.app.device_admin", Resource = "@xml/device_admin_receiver")]
[IntentFilter(new[] {
"android.intent.action.DEVICE_ADMIN_ENABLE",
"android.intent.action.PROFILE_PROVISIONING_COMPLETE",
"android.intent.action.BOOT_COMPLETED"
})]
public class MyDeviceAdminReceiver : DeviceAdminReceiver {}
使用 Java class 名称,而不是 C# 名称:
ComponentName mDPM = new ComponentName(this, Java.Lang.Class.FromType(typeof(DeviceAdminReceiver)));
注意:根据我对 DeviceAdminReceiver
子 class 使用的 Java 名称,dpm set-device-owner
将是:
adb shell dpm set-device-owner com.sushihangover.cosu/com.sushihangover.cosu.DeviceAdminReceiver