Проблемы с настройкой приложения Android Device Owner с QR-подготовкойAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Проблемы с настройкой приложения Android Device Owner с QR-подготовкой

Сообщение Anonymous »

У меня серьезные проблемы с попыткой заставить QR-подготовку работать на мобильном устройстве, на котором должно запускаться приложение в режиме киоска.
Вот несколько первоначальных заявлений об отказе от ответственности на случай, если вы спросите:
  • Целевым устройством является Xiaomi Redmi 14C;
  • У него нет SIM-карты, вставленной ни в один из двух слотов (пока);
  • Я разрабатываю приложение в Android Studio с использованием Windows.
Проблема:
Проблема, с которой я столкнулся, возникает в мастере установки, когда я пытаюсь выполнить qr-подготовку моего приложения, чтобы установить его в качестве владельца устройства и применить политики DPM, что просто возвращает общее сообщение «Невозможно настроить устройство. Обратитесь за помощью к своему ИТ-администратору».
Способ В настоящее время я пытаюсь это сделать:
  • Нажмите 6 раз на экране мастера настройки, пока не появится экран «сканирование QR-кода».
  • Сканирование QR-кода.
  • Установка Wi-Fi-соединения.
  • Устройство некоторое время загружается, пока не появится экран «Это устройство принадлежит вашей организации». Это дает мне единственный вариант нажать «Далее».
  • При щелчке экран кажется меняющимся, но сразу же появляется всплывающее окно с сообщением «Невозможно настроить устройство. Обратитесь за помощью к своему ИТ-администратору».
Все, что перечислено в разделе ниже, дало тот же точный результат.
Что я пробовал:
Изначально я пробовал некоторые другие способы запустить мое собственное приложение от имени владельца устройства.
  • Пытаюсь использовать adb:
    Оба
set-device-owner

и
set-profile-owner

отклоняются, возвращая
"Calling Identity is not authorized"
ошибка. Я пришел к выводу, что это, скорее всего, происходит потому, что уже существует существующий профиль и/или владелец устройства, который защищает устройство.
  • Попытка использовать adb (после нового сброса настроек):
    Просто недоступно. Отладка по USB — это функция разработчика, которая требует ручной активации после мастера установки, что приводит к тем же проблемам, что и в первом пункте.
  • Попытка использовать проекты Google Cloud с политикой Android Management API:
    Возможно, самое модульное решение, но для меня это невозможно. Политика позволяет загружать и устанавливать политики только для приложений, доступных в Play Store, и мое приложение не будет работать на этой платформе. Мне до сих пор неясно, можно ли на самом деле сделать приложения Play Store «частными» или «частными», что для меня необходимо, поскольку я делаю этот проект для небольшой отрасли, и обычные пользователи Play Store не должны иметь к нему доступ, а только устройства, одобренные вручную. В любом случае, если такая функция действительно существует, интеграция API управления Android, вероятно, требует учетной записи разработчика Google Play для организаций (а не личной), для которой требуется номер D-U-N-S, которого нет у моей компании (конечно, поправьте меня, если я ошибаюсь, и могу ли я на самом деле просто использовать личную учетную запись).
Чего я не делал (и не буду) попробуйте:
  • Укоренить устройство Android, чтобы включить ADB по умолчанию при сбросе настроек до заводских:
    Это то, чего я никогда не делал, и возиться с системными файлами сопряжено со значительными рисками, на которые я не могу пойти: от уклонения от гарантии устройства до полного его блокировки.
Моя текущая настройка:
Это текущая полезная нагрузка JSON, которую я использую для предоставления QR-кода:
{
"android.app.extra.PROVISIONING_DEVICE_ADMIN_COMPONENT_NAME": "com.mycompany.marcatempo/com.mycompany.marcatempo.MyDeviceAdminReceiver",
"android.app.extra.PROVISIONING_DEVICE_ADMIN_PACKAGE_LOCATION": "https://path-to-my.apk",
"android.app.extra.PROVISIONING_DEVICE_ADMIN_PACKAGE_CHECKSUM": "some-valid-checksum",
"android.app.extra.PROVISIONING_SKIP_ENCRYPTION": true,

"android.app.extra.PROVISIONING_LEAVE_ALL_SYSTEM_APPS_ENABLED": true,
"android.app.extra.PROVISIONING_ADMIN_EXTRAS_BUNDLE": {
}
}

Это меня очень смутило, потому что многие шаблоны на разных справочных сайтах были разными:
PROVISIONING_DEVICE_ADMIN_COMPONENT_NAME:
Я пробовал написать оба варианта так
com.mycompany.marcatempo/com.mycompany.marcatempo.MyDeviceAdminReceiver

и вот так
com.mycompany.marcatempo/.MyDeviceAdminReceiver

Поскольку на некоторых сайтах это показано по-другому.
PROVISIONING_DEVICE_ADMIN_PACKAGE_CHECKSUM:
Я создал это по-разному, так как на некоторых сайтах этот шаг также был показан по-разному. Я попытался сгенерировать контрольную сумму с помощью Git Bash:
cat C:/path/to/app-release.apk | "C:/Program Files/OpenSSL-Win64/bin/openssl.exe" dgst -binary -sha256 | openssl base64 | tr '+/' '-_' | tr -d '='

И использование Windows Powershell:
Get-FileHash -Path "C:\path\to\release-app.apk" -Algorithm SHA256

Оба варианта дали совершенно разные результаты.
PROVISIONING_SKIP_ENCRYPTION:
Я пытался установить это как истинное, ложное и даже полностью удалить.
PROVISIONING_LEAVE_ALL_SYSTEM_APPS_ENABLED | PROVISIONING_ADMIN_EXTRAS_BUNDLE:
Это дополнительные параметры, которые кажется безвредными. Я включил их, потому что это сделал один из шаблонов.
Согласно этому вопросу, на устройствах Android 12+ такого рода приложения требуют некоторых дополнительных классов и расширенной настройки манифеста. Я уже пытался реализовать те вещи, которые перечислены в решении, но для меня это было бесполезно. Ниже я добавлю соответствующие файлы:
AndroidManifest.xml





















































android:name="androidx.core.content.FileProvider"
android:authorities="${applicationId}.provider"
android:exported="false"
android:grantUriPermissions="true">







AdminPolicyComplianceActivity.java
import android.content.Intent;
import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;

public class AdminPolicyComplianceActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_policy_compliance);

Intent intent = getIntent();

setResult(RESULT_OK, intent);
finish();
}
}

ProvisioningModeActivity.java
import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE;

import android.content.Intent;
import android.os.Build;
import android.os.Bundle;
import android.os.PersistableBundle;

import androidx.appcompat.app.AppCompatActivity;

import java.util.List;

public class ProvisioningModeActivity extends AppCompatActivity {

private String EXTRA_PROVISIONING_ALLOWED_PROVISIONING_MODES = "android.app.extra.PROVISIONING_ALLOWED_PROVISIONING_MODES";
private int PROVISIONING_MODE_FULLY_MANAGED_DEVICE = 1;
private int PROVISIONING_MODE_MANAGED_PROFILE = 2;
private String EXTRA_PROVISIONING_MODE = "android.app.extra.PROVISIONING_MODE";

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_get_provisioning_mode);

Intent intent = getIntent();
int provisioningMode = PROVISIONING_MODE_FULLY_MANAGED_DEVICE;
List allowedProvisioningModes = intent.getIntegerArrayListExtra(EXTRA_PROVISIONING_ALLOWED_PROVISIONING_MODES);

if (allowedProvisioningModes != null) {
if (allowedProvisioningModes.contains(PROVISIONING_MODE_FULLY_MANAGED_DEVICE)) {
provisioningMode = PROVISIONING_MODE_FULLY_MANAGED_DEVICE;
} else if (allowedProvisioningModes.contains(PROVISIONING_MODE_MANAGED_PROFILE)) {
provisioningMode = PROVISIONING_MODE_MANAGED_PROFILE;
}
}
//grab the extras (might contain some needed values from QR code) and pass to AdminPolicyComplianceActivity
PersistableBundle extras = intent.getParcelableExtra(EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE);
Intent resultIntent = getIntent();

if (extras != null) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
resultIntent.putExtra(EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE, extras);
}
}
resultIntent.putExtra(EXTRA_PROVISIONING_MODE, provisioningMode);

setResult(RESULT_OK, resultIntent);
finish();
}
}

MyDeviceAdminReceiver.java
import android.app.admin.DeviceAdminReceiver;
import android.content.Context;
import android.content.Intent;

public class MyDeviceAdminReceiver extends DeviceAdminReceiver {
@Override
public void onEnabled(Context context, Intent intent) {
super.onEnabled(context, intent);
}

@Override
public void onDisabled(Context context, Intent intent) {
super.onDisabled(context, intent);
}
}

xml/device_admin_receiver.xml











layout/activity_get_provisioning_mode.xml







layout/activity_policy_compliance.xml







values/bool.xml


false


values-v31/bool.xml


true



Подробнее здесь: https://stackoverflow.com/questions/798 ... ovisioning
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»