Probleme beim Einrichten einer Android-Gerätebesitzer-App mit QR-BereitstellungAndroid

Forum für diejenigen, die für Android programmieren
Anonymous
 Probleme beim Einrichten einer Android-Gerätebesitzer-App mit QR-Bereitstellung

Post by Anonymous »

Ich habe ernsthafte Kopfschmerzen, weil ich versuche, die QR-Bereitstellung auf einem mobilen Gerät zum Laufen zu bringen, auf dem eine App im Kioskmodus ausgeführt werden soll.
Hier einige erste Haftungsausschlüsse für den Fall, dass Sie fragen:
  • Das Zielgerät ist ein Xiaomi Redmi 14C;
  • Es ist (noch) keine SIM-Karte in einem der beiden Steckplätze eingesetzt);
  • Ich entwickle die App auf Android Studio unter Windows.
Das Problem:
Das Problem, das ich habe, tritt im Setup-Assistenten auf, wenn ich versuche, eine QR-Bereitstellung meiner App durchzuführen, um sie als Geräteeigentümer festzulegen und DPM-Richtlinien durchzusetzen, was einfach eine allgemeine Fehlermeldung zurückgibt: „Gerät kann nicht eingerichtet werden. Wenden Sie sich an Ihren IT-Administrator, um Hilfe zu erhalten.“
Der Weg Ich versuche gerade Folgendes:
  • 6 Mal auf den Bildschirm des Einrichtungsassistenten tippen, bis der Bildschirm „Nach QR-Code scannen“ angezeigt wird.
  • QR-Code scannen.
  • Eine WLAN-Verbindung herstellen.
  • Das Gerät wird eine Weile geladen, bis der Bildschirm „Dieses Gerät gehört zu Ihrer Organisation“ angezeigt wird. Es gibt mir die einzige Möglichkeit, auf „Weiter“ zu klicken.
  • Beim Klicken scheint sich der Bildschirm zu ändern, aber es wird sofort ein Popup mit der Meldung „Gerät kann nicht eingerichtet werden. Wenden Sie sich an Ihren IT-Administrator für Hilfe“ angezeigt.
Alle im folgenden Abschnitt aufgeführten Ergebnisse führten zu genau dem gleichen Ergebnis.
Was ich versucht habe:
Anfangs habe ich es versucht einige andere Möglichkeiten, meine benutzerdefinierte App als Gerätebesitzer auszuführen.
  • Versuch, adb zu verwenden:
    Beide

Code: Select all

set-device-owner
und

Code: Select all

set-profile-owner
werden abgelehnt und ein
zurückgegeben

Code: Select all

"Calling Identity is not authorized"
Fehler. Ich bin zu dem Schluss gekommen, dass dies wahrscheinlich geschieht, weil bereits ein Profil und/oder ein Gerätebesitzer vorhanden ist, der das Gerät schützt.
  • Versuch, adb zu verwenden (nach einem erneuten Zurücksetzen auf die Werkseinstellungen):
    Einfach nicht verfügbar. USB-Debug ist eine Entwicklerfunktion und erfordert eine manuelle Aktivierung nach dem Einrichtungsassistenten, was vom ersten Punkt an die gleichen Probleme verursachen würde.
  • Versuch, Google Cloud-Projekte mit Android Management API-Richtlinie zu verwenden:
    Möglicherweise die modularste Lösung, aber für mich unmöglich. Mit der Richtlinie können nur im Play Store verfügbare Apps heruntergeladen und Richtlinien festgelegt werden, und meine App wird diese Plattform nicht betreten. Für mich ist immer noch nicht klar, ob Play Store-Apps tatsächlich „privat“ oder „nicht gelistet“ gemacht werden können, was für mich notwendig ist, da ich dieses Projekt für eine kleine Branche mache und normale Play Store-Benutzer keinen Zugriff darauf haben sollten, sondern nur die manuell genehmigten Geräte. So oder so, wenn es tatsächlich eine solche Funktion gibt, erfordert die Android Management API-Integration wahrscheinlich ein Google Play Developer-Konto für Organisationen (kein persönliches), das eine D-U-N-S-Nummer erfordert, die mein Unternehmen nicht hat (Korrigieren Sie mich natürlich, wenn ich falsch liege und ob ich eigentlich einfach ein persönliches Konto verwenden kann).
Was ich nicht getan habe (und nicht tun werde) Versuchen Sie Folgendes:
  • Das Android-Gerät rooten, um ADB beim Zurücksetzen auf die Werkseinstellungen standardmäßig zu aktivieren:
    Das habe ich noch nie gemacht, und das Herumspielen mit Systemdateien birgt erhebliche Risiken, die ich nicht eingehen kann, von der Umgehung der Garantie des Geräts bis hin zur vollständigen Zerstörung des Geräts.
Mein aktuelles Setup:
Das ist das aktuelle JSON-Nutzlast, die ich für die QR-Code-Bereitstellung verwende:

Code: Select all

{
"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": {
}
}
Das war für mich sehr verwirrend, da viele Vorlagen auf verschiedenen Referenzseiten tatsächlich unterschiedlich waren:
PROVISIONING_DEVICE_ADMIN_COMPONENT_NAME:
Ich habe versucht, beides so zu schreiben

Code: Select all

com.mycompany.marcatempo/com.mycompany.marcatempo.MyDeviceAdminReceiver
und so

Code: Select all

com.mycompany.marcatempo/.MyDeviceAdminReceiver
Da einige Websites es anders geschrieben zeigten.
PROVISIONING_DEVICE_ADMIN_PACKAGE_CHECKSUM:
Ich habe dies auf unterschiedliche Weise generiert, da einige Websites diesen Schritt auch anders zeigten. Ich habe versucht, die Prüfsumme mit Git Bash zu generieren:

Code: Select all

cat C:/path/to/app-release.apk | "C:/Program Files/OpenSSL-Win64/bin/openssl.exe" dgst -binary -sha256 | openssl base64 | tr '+/' '-_' | tr -d '='
Und mit Windows Powershell:

Code: Select all

Get-FileHash -Path "C:\path\to\release-app.apk" -Algorithm SHA256
Beide lieferten mir sehr unterschiedliche Ergebnisse.
PROVISIONING_SKIP_ENCRYPTION:
Ich habe versucht, dies auf wahr, falsch zu setzen und es sogar vollständig zu entfernen.
PROVISIONING_LEAVE_ALL_SYSTEM_APPS_ENABLED | PROVISIONING_ADMIN_EXTRAS_BUNDLE:
Dies sind zusätzliche Optionen, die harmlos erscheinen. Ich habe sie eingefügt, weil eine der Vorlagen dies tat.
Laut dieser Frage erfordern diese Art von Apps auf Geräten mit Android 12+ einige zusätzliche Klassen und ein erweitertes Manifest-Setup. Ich habe bereits versucht, die in der Lösung aufgeführten Dinge zu implementieren, aber es hat mir nichts gebracht. Unten füge ich die relevanten Dateien hinzu:
AndroidManifest.xml

Code: Select all





















































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






AdminPolicyComplianceActivity.java

Code: Select all

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

Code: Select all

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

Code: Select all

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

Code: Select all










layout/activity_get_provisioning_mode.xml

Code: Select all






layout/activity_policy_compliance.xml

Code: Select all






values/bool.xml

Code: Select all


false

values-v31/bool.xml

Code: Select all


true

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post