Einstellung des Geräteadministrators Einige Administratorrichtlinien wurden beim Aufrufen als veraltet markiert von einem Geräteadministrator. Weitere Informationen und die Migrationsoptionen finden Sie unter <ph type="x-smartling-placeholder"></ph> Einstellung des Geräteadministrators
Seit Android 2.2 (API-Level 8) bietet die Android-Plattform eine Geräteverwaltung auf Systemebene über die Device Administration APIs nutzen können.
In dieser Lektion erfahren Sie, wie Sie eine sicherheitsbewusste Anwendung erstellen, die den Zugriff auf durch Erzwingen von Richtlinien zur Geräteverwaltung. Insbesondere kann die Anwendung so konfiguriert werden, dass ein ausreichend starkes Passwort für die Displaysperre eingerichtet ist, eingeschränkte Inhalte für den Nutzer.
Richtlinie definieren und deklarieren
Zuerst müssen Sie festlegen, welche Richtlinientypen auf Funktionsebene unterstützt werden sollen. Richtlinien können die Passwortstärke für die Displaysperre, das Ablauf-Zeitlimit, die Verschlüsselung usw. abdecken.
Sie müssen den ausgewählten Richtliniensatz, der von der Anwendung durchgesetzt wird, in der
res/xml/device_admin.xml
-Datei. Das Android-Manifest sollte auch auf die
deklarierte Richtlinie festgelegt.
Jede deklarierte Richtlinie entspricht einer Reihe zugehöriger Geräterichtlinienmethoden in DevicePolicyManager
(d. h. die Mindestlänge des Passworts und die Mindestanzahl von
sind zwei Beispiele). Wenn eine Anwendung versucht, Methoden aufzurufen,
entsprechende Richtlinie nicht in der XML-Datei deklariert ist, führt dies zur SecurityException
-Laufzeit. Weitere Berechtigungen,
wie force-lock
, sind verfügbar, wenn mit der Anwendung
andere Arten von Richtlinien. Sie werden später bei der Aktivierung des Geräteadministrators
Die Liste der deklarierten Richtlinien wird dem Nutzer auf einem Systembildschirm angezeigt.
Das folgende Snippet deklariert die Richtlinie zur Beschränkung von Passwörtern in res/xml/device_admin.xml
:
<device-admin xmlns:android="http://schemas.android.com/apk/res/android"> <uses-policies> <limit-password /> </uses-policies> </device-admin>
XML-Datei zur Richtliniendeklaration, auf die im Android-Manifest verwiesen wird:
<receiver android:name=".Policy$PolicyAdmin" 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>
Empfänger für Geräteverwaltung erstellen
Erstellen Sie einen Übertragungsempfänger für die Geräteverwaltung, der über Ereignisse im Zusammenhang mit den von Ihnen angegebenen Richtlinien benachrichtigt wird. Eine Anwendung kann Callback-Methoden selektiv überschreiben.
Wenn der Geräteadministrator in der Beispielanwendung Device Admin durch den Nutzer, wird die konfigurierte Richtlinie aus der gemeinsamen Einstellung gelöscht. Sie sollten erwägen, die für Ihren Anwendungsfall relevant ist. Zum Beispiel benötigt die Anwendung Maßnahmen zur Minderung von Sicherheitsrisiken durch Implementierung einer Kombination aus dem Löschen sensibler Daten auf der Gerät, Deaktivieren der Remote-Synchronisierung, Benachrichtigung eines Administrators usw.
Damit der Übertragungsempfänger funktioniert, muss er wie im obigen Snippet im Android-Manifest registriert sein.
Kotlin
class PolicyAdmin : DeviceAdminReceiver() { override fun onDisabled(context: Context, intent: Intent) { // Called when the app is about to be deactivated as a device administrator. // Deletes previously stored password policy. super.onDisabled(context, intent) context.getSharedPreferences(APP_PREF, Activity.MODE_PRIVATE).edit().apply { clear() apply() } } }
Java
public static class PolicyAdmin extends DeviceAdminReceiver { @Override public void onDisabled(Context context, Intent intent) { // Called when the app is about to be deactivated as a device administrator. // Deletes previously stored password policy. super.onDisabled(context, intent); SharedPreferences prefs = context.getSharedPreferences(APP_PREF, Activity.MODE_PRIVATE); prefs.edit().clear().commit(); } }
Geräteadministrator aktivieren
Bevor Richtlinien erzwungen werden, muss der Nutzer die Anwendung manuell als Gerät aktivieren
Administrator. Das folgende Snippet veranschaulicht, wie die Einstellungsaktivität ausgelöst wird, in der die
Nutzer Ihre Anwendung aktivieren können. Es empfiehlt sich, den erklärenden Text einzufügen,
warum die Anwendung den Geräteadministrator anfordert, indem Sie die
EXTRA_ADD_EXPLANATION
Extra im Intent.
Abbildung 1: Der Aktivierungsbildschirm für den Nutzer, auf dem Sie eine Beschreibung Ihrer Geräterichtlinien.
Kotlin
if (!policy.isAdminActive()) { val activateDeviceAdminIntent = Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN) activateDeviceAdminIntent.putExtra( DevicePolicyManager.EXTRA_DEVICE_ADMIN, policy.getPolicyAdmin() ) // It is good practice to include the optional explanation text to // explain to user why the application is requesting to be a device // administrator. The system will display this message on the activation // screen. activateDeviceAdminIntent.putExtra( DevicePolicyManager.EXTRA_ADD_EXPLANATION, resources.getString(R.string.device_admin_activation_message) ) startActivityForResult(activateDeviceAdminIntent, REQ_ACTIVATE_DEVICE_ADMIN) }
Java
if (!policy.isAdminActive()) { Intent activateDeviceAdminIntent = new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN); activateDeviceAdminIntent.putExtra( DevicePolicyManager.EXTRA_DEVICE_ADMIN, policy.getPolicyAdmin()); // It is good practice to include the optional explanation text to // explain to user why the application is requesting to be a device // administrator. The system will display this message on the activation // screen. activateDeviceAdminIntent.putExtra( DevicePolicyManager.EXTRA_ADD_EXPLANATION, getResources().getString(R.string.device_admin_activation_message)); startActivityForResult(activateDeviceAdminIntent, REQ_ACTIVATE_DEVICE_ADMIN); }
Wenn der Nutzer „Aktivieren“ auswählt, wird die Anwendung ein Geräteadministrator und kann Konfiguration und Durchsetzung der Richtlinie.
Die Anwendung muss auch auf Situationen vorbereitet sein, in denen der Nutzer den Vorgang abbricht.
des Aktivierungsprozesses durch Drücken der Taste "Abbrechen", der Zurück- oder der Home-Taste. Dementsprechend wird
onResume()
in der Aktivität zur Richtlinieneinrichtung muss eine Logik haben
um den Zustand neu zu bewerten und dem Nutzer die Option zur Aktivierung des Geräteadministrators zu präsentieren,
erforderlich.
Device Policy Controller implementieren
Nachdem der Geräteadministrator aktiviert wurde, konfiguriert die Anwendung das Gerät Richtlinienmanager mit der angeforderten Richtlinie. Denken Sie daran, dass neue Richtlinien Android mit jedem Release. Es empfiehlt sich, Versionsprüfungen in Ihrer Anwendung durchzuführen, wenn Sie neue Richtlinien zu entwickeln und gleichzeitig ältere Versionen der Plattform zu unterstützen. Zum Beispiel ist das Passwortminimum Die Richtlinie für Großbuchstaben ist nur ab API-Level 11 (Honeycomb) verfügbar. Der folgende Code zeigt, wie Sie die Version zur Laufzeit prüfen können.
Kotlin
private lateinit var dpm: DevicePolicyManager private lateinit var policyAdmin: ComponentName dpm = context.getSystemService(Context.DEVICE_POLICY_SERVICE) as DevicePolicyManager policyAdmin = ComponentName(context, PolicyAdmin::class.java) dpm.apply { setPasswordQuality(policyAdmin, PASSWORD_QUALITY_VALUES[passwordQuality]) setPasswordMinimumLength(policyAdmin, passwordLength) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { setPasswordMinimumUpperCase(policyAdmin, passwordMinUpperCase) } }
Java
DevicePolicyManager dpm = (DevicePolicyManager) context.getSystemService(Context.DEVICE_POLICY_SERVICE); ComponentName policyAdmin = new ComponentName(context, PolicyAdmin.class); dpm.setPasswordQuality(policyAdmin, PASSWORD_QUALITY_VALUES[passwordQuality]); dpm.setPasswordMinimumLength(policyAdmin, passwordLength); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { dpm.setPasswordMinimumUpperCase(policyAdmin, passwordMinUpperCase); }
Jetzt kann die Anwendung die Richtlinie erzwingen. Solange die Anwendung keinen Zugriff hat das verwendete Passwort für die Displaysperre über die Device Policy Manager API ob das vorhandene Passwort die erforderliche Richtlinie erfüllt. Wenn sich herausstellt, nicht ausreichend ist, nimmt die Device Administration API nicht automatisch Korrekturmaßnahmen ergreifen. Es liegt in der Verantwortung der App, das System explizit zu starten Bildschirm zum Ändern des Passworts in der App "Einstellungen". Hier einige Beispiele:
Kotlin
if (!dpm.isActivePasswordSufficient) { // Triggers password change screen in Settings. Intent(DevicePolicyManager.ACTION_SET_NEW_PASSWORD).also { intent -> startActivity(intent) } }
Java
if (!dpm.isActivePasswordSufficient()) { ... // Triggers password change screen in Settings. Intent intent = new Intent(DevicePolicyManager.ACTION_SET_NEW_PASSWORD); startActivity(intent); }
Normalerweise kann der Nutzer einen der verfügbaren Sperrmechanismen auswählen, wie z. B. Kein, Muster, PIN (numerisch) oder Passwort (alphanumerisch) Wenn eine Passwortrichtlinie konfiguriert ist, Typen, die schwächer sind als die in der Richtlinie definierten, werden deaktiviert. Wenn zum Beispiel der Parameter Die Passwortqualität „Numerisch“ ist konfiguriert. Der Nutzer kann entweder eine PIN (numerisch) oder ein Passwort auswählen. (alphanumerisches) Passwort.
Sobald das Gerät durch die Einrichtung eines geeigneten Passworts für die Displaysperre geschützt ist, den Zugriff auf die gesicherten Inhalte ermöglicht.
Kotlin
when { !dpm.isAdminActive(policyAdmin) -> { // Activates device administrator. ... } !dpm.isActivePasswordSufficient -> { // Launches password set-up screen in Settings. ... } else -> { // Grants access to secure content. ... startActivity(Intent(context, SecureActivity::class.java)) } }
Java
if (!dpm.isAdminActive(..)) { // Activates device administrator. ... } else if (!dpm.isActivePasswordSufficient()) { // Launches password set-up screen in Settings. ... } else { // Grants access to secure content. ... startActivity(new Intent(context, SecureActivity.class)); }