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 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.
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
Code: Select all
set-profile-owner
zurückgegeben
Code: Select all
"Calling Identity is not authorized"- 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).
- 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.
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": {
}
}
PROVISIONING_DEVICE_ADMIN_COMPONENT_NAME:
Ich habe versucht, beides so zu schreiben
Code: Select all
com.mycompany.marcatempo/com.mycompany.marcatempo.MyDeviceAdminReceiver
Code: Select all
com.mycompany.marcatempo/.MyDeviceAdminReceiver
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 '='
Code: Select all
Get-FileHash -Path "C:\path\to\release-app.apk" -Algorithm SHA256
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">
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();
}
}
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();
}
}
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);
}
}
Code: Select all
Code: Select all
Code: Select all
Code: Select all
false
Code: Select all
true
Mobile version