Владелец устройства на устройстве без рута (Android L), без NFC, с использованием оболочки adb, dpm set-device-owner

Конечное намерение здесь состоит в том, чтобы иметь устройство в «моде киоска».

Они скажите, что вам не нужен ни NFC, ни рут добиться того, чтобы приложение стало владельцем устройства. Я еще не видел полный пример этого метода, но давайте попробуем:

adb shell dpm set-device-owner <package>/.<ReceiverImplementation>

должен сделать... Итак, я делаю это и получаю:

java.lang.SecurityException: 
Neither user 2000 nor current process has android.permission.BIND_DEVICE_ADMIN.

Поэтому следующий код возвращает false.

((DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE))
   .isDeviceOwnerApp(getApplicationContext().getPackageName())

Этот вопрос STO задает аналогичный вопрос, но не указывает реальный провал..

Файл манифеста и остальная часть исходного кода в основном вдохновлены этим примером Google

<manifest
    package="com.example.android.deviceowner"
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:versionCode="1"
    android:versionName="1.0">

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme">

        <activity
            android:name=".MainActivity"
            android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>

        <receiver
            android:name=".DeviceOwnerReceiver"
            android:description="@string/app_name"
            android:label="@string/app_name"
            android:permission="android.permission.BIND_DEVICE_ADMIN">
            <meta-data
                android:name="android.app.device_admin"
                android:resource="@xml/device_owner_receiver"/>
            <intent-filter>
                <action android:name="android.app.action.ACTION_DEVICE_ADMIN_ENABLED"/>
            </intent-filter>
        </receiver>

    </application>

</manifest>

Устройство, которое я пытаюсь сделать в настоящее время, — это LG G Pad.


person Rin malavi    schedule 23.04.2015    source источник
comment
Просто чтобы уточнить... ваш приемник имеет android.permission.BIND_DEVICE_ADMIN в манифесте, но вы все еще получаете это исключение?   -  person Okas    schedule 23.04.2015
comment
Да, я отредактирую вопрос, чтобы показать это.   -  person Rin malavi    schedule 23.04.2015
comment
Еще один вопрос. Что находится в вашем файле device_owner_receiver.xml?   -  person Okas    schedule 23.04.2015
comment
Не изменился этот ‹device-admin› ‹uses-policies› ‹limit-password/› ‹watch-login/› ‹reset-password/› ‹force-lock/› ‹wipe-data/› ‹expire-password /› ‹зашифрованное-хранилище/› ‹отключить-камеру/› ‹/uses-policies› ‹/device-admin›   -  person Rin malavi    schedule 23.04.2015
comment
Состояние документов Android: To deploy and activate a device owner, you must perform an NFC data transfer... @ developer.android.com/about/versions /   -  person Randy    schedule 23.04.2015
comment
Я заметил эту строку, и общие ссылки указывают этот вариант как один из возможных. Я надеялся, что dpm здесь обойдет это.   -  person Rin malavi    schedule 23.04.2015
comment
Я думаю, вам нужно явно указать <uses-permission> в начале манифеста, чтобы pm (менеджер пакетов) использовал его как разрешение для всего приложения.   -  person Aaron Gillion    schedule 27.04.2015
comment
Нет, пробовал... идея на самом деле отмечает, что это можно передать только системному приложению.   -  person Rin malavi    schedule 27.04.2015
comment
Попробуйте взять исходный код минималистского приложения для владельцев устройств, которое я установил здесь: github.com /florentdupont/AndroidScreenPinning/tree/master/. Я точно знаю, что это приложение можно сделать владельцем устройства с помощью команды dpm на Nexus 9.   -  person Florent Dupont    schedule 28.04.2015
comment
@Rinmalavi У меня была похожая проблема, и я связался со службой поддержки LG. Но еще не получил ответа. Вы можете взглянуть на журналы ошибок и, например, на этот пост. [ссылка] (stackoverflow.com/questions/30163964/)   -  person kash    schedule 11.05.2015
comment
@kash Похоже, это та же проблема.   -  person Rin malavi    schedule 11.05.2015
comment
@Rinmalavi, ты что-то говорил о рутировании? Я связался с разработчиками LG, и ваши предложения могут быть полезны.   -  person kash    schedule 11.05.2015
comment
Есть еще один способ добиться этого. То есть добавить /data/system/device_owner.xml на корневое устройство, но рутирование не входит в объем этой проблемы.   -  person Rin malavi    schedule 11.05.2015
comment
@FlorentDupont в этом репозитории сказано, что вы должны разрешить администратору устройства правильно использовать его демонстрацию. Но это не демонстрирует, как включить администрирование устройства или профиль устройства.   -  person portfoliobuilder    schedule 07.06.2017
comment
вы можете ознакомиться с этой статьей florent-dupont.blogspot.fr/2015/02/   -  person Florent Dupont    schedule 07.06.2017


Ответы (2)


Ваш файл манифеста кажется правильным. Вы должны знать, что это может исходить из состояния вашей системы, когда вы выполняете эту команду. Перед успешным выполнением команды dpm следует проверить многие моменты:

  • Убедитесь, что ваше приложение уже установлено, как и любое другое обычное приложение.
  • Перед использованием убедитесь, что для текущего пользователя еще не настроена учетная запись (убедитесь, что учетная запись не настроена в разделе «Настройки» > «Учетные записи»).
  • не должно быть уже зарегистрированного владельца устройства

Лучшее, что можно сделать (это то, что я действительно сделал во время эксперимента), — полностью перезагрузить телефон и избежать большинства шагов настройки (кроме обязательных шагов «настроить Wi-Fi» и «Имя») и выполнить не связывать никакую учетную запись Google.
После инициализации вы обязательно будете в чистом состоянии. Затем,

  1. Активировать отладку
  2. установите приложение с помощью IDE (или с помощью pm install...)
  3. запустите команду adb shell dpm set-device-owner ...

Я написал статью, объясняющую большинство из этих шагов в моем блоге, взгляните на него, это может быть полезно в вашем случае.

person Florent Dupont    schedule 28.04.2015
comment
Я следовал инструкциям, заводской сброс, учетные записи не установлены, пользователи... владельцы... Проблема, кажется, не устранена, и на данный момент я уверен, что это связано с выбором устройства. Спасибо за ваш ответ. - person Rin malavi; 28.04.2015
comment
Не могли бы вы поделиться минималистичным исходным кодом тестового примера (например, через github), который не работает в вашем случае? Мне было бы интересно протестировать Nexus 9 (и подтвердить, действительно ли это зависит от реализации поставщиком приложения подготовки). - person Florent Dupont; 01.05.2015
comment
Одним из тестовых случаев был ваш github.com/florentdupont/AndroidScreenPinning/tree/master/DeviceOwnerApp с упомянутым исключением при вызове dpm, конечно. - person Rin malavi; 01.05.2015
comment
ХОРОШО. Тогда нет другой идеи.. Может быть, вам стоит обратиться в службу поддержки LG? - person Florent Dupont; 04.05.2015

Я не уверен, поможет ли это вам, но если не вы, возможно, кто-то другой воспользуется этим решением. У меня была очень похожая проблема с Samsung Tab A. Я не мог установить право собственности на свое приложение. Всегда во время бега:

adb shell dpm set-device-owner cy.com.myapp/.AdminReceiver

Я получал:

java.lang.SecurityException: Neither user 2000 nor current process has 
com.sec.enterprise.permission.MDM_PROXY_ADMIN_INTERNAL.

После долгих поисков я наконец обнаружил, что мне нужно добавить в свои разрешения манифеста специальные разрешения Samsung:

<uses-permission android:name="com.samsung.accessory.permission.ACCESSORY_FRAMEWORK" />

Это сработало, и теперь мое приложение может переходить в режим киоска по требованию. Возможно, вы столкнулись с похожей проблемой — возможно, есть один или несколько параметров разрешений, которые вам нужно установить для вашего LG. Мое решение работало для нерутированного устройства (и, очевидно, без добавления какой-либо учетной записи - свежее после сброса настроек).

person mikeyy    schedule 12.05.2016
comment
У вас есть источник этого разрешения? Я работаю с точно таким же устройством, как и вы, и оно у меня не работает. Кажется странным, что вам нужно разрешение на дополнительную платформу, чтобы включить владельца устройства. - person Niklas Ekman; 03.11.2016
comment
Насколько я помню, я нашел это на форуме разработчиков Samsung, но не могу вспомнить, где именно. Тема не относилась точно к моей проблеме, однако после нескольких дней поиска я был готов попробовать что угодно. И поскольку он работал на планшетах, которые у меня были, я был им доволен. Извините, я не могу быть более полезным. - person mikeyy; 05.10.2017
comment
У нас также была эта ошибка на Samsung Tab A, однако мы использовали неправильное имя пакета для нашего приложения. Это было исправлено, когда мы исправили каталог имени пакета. Вышеупомянутое дополнение к манифесту нам не нужно. - person Codelicious; 02.01.2019