2016-11-25 3 views
1

Я пытаюсь установить пакеты задач блокировки, но IsAdminActive возвращает false.Не удается включить компонент администратора

Чтобы установить владельца устройства и активного администратора, я использовал команду dpm set-device-owner PinningTest.PinningTest/.AdminReceiverTest из оболочки adb. Это успешно завершено.

Мой MainActivity:

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

     DevicePolicyManager devicePolicyManager = (DevicePolicyManager)GetSystemService(Context.DevicePolicyService); 
     ComponentName testDeviceAdmin = new ComponentName(this, Java.Lang.Class.FromType(typeof(AdminReceiverTest)).Name); 

     if (devicePolicyManager.IsAdminActive(testDeviceAdmin)) 
     { 
      devicePolicyManager.SetLockTaskPackages(testDeviceAdmin, new string[] { PackageName }); 
     } 
    } 

Мои AndroidManifest:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
      package="PinningTest.PinningTest" 
      android:versionCode="1" android:versionName="1.0" 
      android:installLocation="auto"> 
    <uses-sdk android:minSdkVersion="21" /> 
    <uses-permission android:name="android.permission.BIND_DEVICE_ADMIN" /> 
    <application android:label="PinningTest"> 
     <receiver android:name=".AdminReceiverTest" 
       android:label="@string/ApplicationName" 
       android:description="@string/ApplicationName" 
       android:permission="android.permission.BIND_DEVICE_ADMIN"> 
      <meta-data android:name="android.app.device_admin" android:resource="@xml/device_admin" /> 
      <intent-filter> 
       <action android:name="android.app.action.DEVICE_ADMIN_ENABLED" /> 
      </intent-filter> 
     </receiver> 
    </application> 
</manifest> 

AdminReceiverTest.cs:

namespace PinningTest 
{ 
    class AdminReceiverTest : DeviceAdminReceiver 
    { 
    } 
} 

Я следовал учебник here и также смотрели на различные другие, но я не смогли найти полный пример Xamarin.

Любая помощь приветствуется.

Большое спасибо.

+0

Предполагая, что ваше устройство не укоренено и нет учетной записи пользователя, которая была назначена (если вам нужно сбросить заводские настройки), после команды 'dpm' было обновлено'/data/system/device_owner.xml'? Кроме того, какое устройство (?), Поскольку разные производители изменяют ASOP, и у них есть специальные настройки, которые должны быть установлены, то есть Samsung – SushiHangover

+0

Запуск 'devicePolicyManager.IsDeviceOwnerApp (PackageName)' возвращает true, но я получаю разрешение, если я пытаюсь открыть файл. Я вижу, что он создается после запуска set-device-owner, поэтому я думаю, что он настроен правильно. Это вкладка Lenovo3 на 5.0. –

ответ

1

я изначально была такая же проблема, но я только что получил эту работу, используя следующий

[BroadcastReceiver(Name = "com.sceneskope.survey.DeviceAdminReceiver", Enabled = true, Exported = true, Permission = "android.permission.BIND_DEVICE_ADMIN")] 
[MetaData("android.app.device_admin", Resource = "@xml/device_admin_receiver")] 
[IntentFilter(new[] { "android.app.action.DEVICE_ADMIN_ENABLED" })] 
public class DeviceAdminReceiver : Android.App.Admin.DeviceAdminReceiver 
{ 
} 

и настройка владельца устройства с помощью

.\adb.exe shell dpm set-device-owner com.afwsamples.testdpc/.DeviceAdminReceiver 

Это, как представляется, решить свои проблемы, так что я думаю, это было до проблем с именами при вводе в манифесте вручную.

+0

Добавление '[MetaData (" android.app.device_admin ", Resource =" @ xml/device_admin ")]' разрешил проблему. Спасибо! –

0

Похоже, что ваши записи манифеста вручную не учитывают автогенерируемые имена классов (на основе Md5), которые генерируют Xamarin.Android, чтобы избежать конфликтов пространства имен.

Поскольку DeviceAdminReceiver подкласс BroadcastReceiver, используйте атрибут [BroadcastReceiver] класс, чтобы переопределить имена автоматически сгенерированных классов в манифесте:

[BroadcastReceiver(Name = "com.sushihangover.deviceownerapp.adminreceiver", Enabled = true, Exported = true)] 
[IntentFilter(new[] { "android.app.action.DEVICE_ADMIN_ENABLED" })] 
public class AdminReceiverTest : DeviceAdminReceiver 
{ 
    public override void OnReceive(Context context, Intent intent) 
    { 
     base.OnReceive(context, intent); 
    } 
} 

Таким образом, в манифесте, следующее автоматически генерируется:

<receiver android:enabled="true" android:exported="true" android:name="com.sushihangover.deviceownerapp.adminreceiver"> 
    <intent-filter> 
    <action android:name="android.app.action.DEVICE_ADMIN_ENABLED" /> 
    </intent-filter> 
</receiver> 
+0

Спасибо, я протестировал предложенные изменения и по-прежнему имел ту же проблему, но звучит так, как будто это имя класса. С моим кодом выше 'testDeviceAdmin.ClassName' является« md590431f01ea601a54308626715acc602b.AdminReceiverTest », и если я его поменяю на' testDeviceAdmin = новое имя_компьютера (это Java.Lang.Class.FromType (typeof (AdminReceiverTest)). SimpleName); 'then' testDeviceAdmin .ClassName' - это «AdminReceiverTest». Ничего не работают. –

+1

Я получаю следующее исключение безопасности, если я запускаю «SetLockTaskPackages»: нет активного администратора ComponentInfo {PinningTest.PinningTest/md590431f01ea601a54308626715acc602b.AdminReceiverTest}. –

Смежные вопросы