Entwicklerhandbuch zum Microsoft Intune App SDK für AndroidMicrosoft Intune App SDK for Android developer guide

Hinweis

Lesen Sie am besten zuerst die Übersicht über das Intune App SDK. Dort finden Sie Informationen zu den aktuellen Features des SDK sowie zu den Vorbereitungen, die Sie auf den verschiedenen unterstützten Plattformen für die Integration treffen müssen.You might want to first read the Intune App SDK overview, which covers the current features of the SDK and describes how to prepare for integration on each supported platform.

Mit dem Microsoft Intune App SDK für Android können Sie die Intune-App-Schutzrichtlinien (auch als APP- oder MAM-Richtlinien bezeichnet) in Ihre native Android-App integrieren.The Microsoft Intune App SDK for Android lets you incorporate Intune app protection policies (also known as APP or MAM policies) into your native Android app. Intune-fähige Anwendungen sind in das Intune App SDK integrierte Anwendungen.An Intune-enlightened application is one that is integrated with the Intune App SDK. Intune-Administratoren können ganz einfach App-Schutzrichtlinien für Ihre Intune-fähige App bereitstellen, wenn diese aktiv von Intune verwaltet wird.Intune administrators can easily deploy app protection policies to your Intune-enlightened app when Intune actively manages the app.

Inhalt des SDKWhat's in the SDK

Das Intune App SDK besteht aus den folgenden Dateien:The Intune App SDK consists of the following files:

  • Microsoft.Intune.MAM.SDK.aar: Die SDK-Komponenten, mit Ausnahme der Support.V4- und der Support.V7-JAR-Datei.Microsoft.Intune.MAM.SDK.aar: The SDK components, with the exception of the Support.V4 and Support.V7 JAR files. Diese Datei kann anstelle der einzelnen Komponenten verwendet werden, wenn das Buildsystem AAR-Dateien unterstützt.This file can be used in place of the individual components if your build system supports AAR files.
  • Microsoft.Intune.MAM.SDK.Support.v4.jar: Die Schnittstellen, die zum Aktivieren von MAM in Apps erforderlich sind, die die Unterstützungsbibliothek von Android v4 verwenden.Microsoft.Intune.MAM.SDK.Support.v4.jar: The interfaces necessary to enable MAM in apps that use the Android v4 support library. Apps, die diese Unterstützung benötigen, müssen direkt auf die JAR-Datei verweisen.Apps that need this support must reference the JAR file directly.
  • Microsoft.Intune.MAM.SDK.Support.v7.jar: Die Schnittstellen, die zum Aktivieren von MAM in Apps erforderlich sind, die die Unterstützungsbibliothek von Android v7 verwenden.Microsoft.Intune.MAM.SDK.Support.v7.jar: The interfaces necessary to enable MAM in apps that use the Android v7 support library. Apps, die diese Unterstützung benötigen, müssen direkt auf die JAR-Datei verweisen.Apps that need this support must reference the JAR file directly.
  • proguard.txt: Enthält ProGuard-Regeln, die bei der Erstellung mithilfe von ProGuard angewendet werden müssen.proguard.txt: Contains ProGuard rules which must be applied if building with ProGuard.
  • CHANGELOG.txt: Stellt eine Aufzeichnung der Änderungen bereit, die in den einzelnen SDK-Versionen vorgenommen wurden.CHANGELOG.txt: Provides a record of changes made in each SDK version.
  • THIRDPARTYNOTICES.TXT: Ein Urheberrechtshinweis für Drittanbieter- und/oder OSS-Code, der in Ihrer App kompiliert wird.THIRDPARTYNOTICES.TXT: An attribution notice that acknowledges third-party and/or OSS code that will be compiled into your app.

Wenn Ihr Buildsystem keine AAR-Dateien unterstützt, können Sie die folgenden Dateien anstelle von Microsoft.Intune.MAM.SDK.aar verwenden.If your build system does not support AAR files, you may use the following files in place of Microsoft.Intune.MAM.SDK.aar.

  • Microsoft.Intune.MAM.SDK.jar: Die Schnittstellen, die zum Aktivieren von MAM und Interoperabilität mit der Intune-Unternehmensportal-App erforderlich sind.Microsoft.Intune.MAM.SDK.jar: The interfaces necessary to enable MAM and interoperability with the Intune Company Portal app. In Apps muss sie als Referenz zu einer Android-Bibliothek angegeben werden.Apps must specify it as an Android library reference.
  • Ressourcenverzeichnis: Die Ressourcen (etwa Zeichenfolgen), die das SDK benötigt.The res directory: The resources (like strings) on which the SDK relies.
  • AndroidManifest.xml: Einstiegspunkte und Bibliotheksanforderungen.AndroidManifest.xml: Entry points and the library requirements.

AnforderungenRequirements

Das Intune App SDK ist ein kompiliertes Android-Projekt.The Intune App SDK is a compiled Android project. Daher ist es größtenteils unabhängig von der Version von Android, die die App für ihre API-Mindest- bzw. -Zielversion verwendet.As a result, it is largely unaffected by the version of Android that the app uses for its minimum or target API versions. Das SDK unterstützt Android API 14 (Android 4.0 und höher) bis Android API 25 (Android 7.1).The SDK supports Android API 14 (Android 4.0+) through Android API 25 (Android 7.1).

Unternehmensportal-AppCompany Portal app

Das Intune App SDK für Android ist darauf angewiesen, dass die Unternehmensportal-App auf dem Gerät vorhanden ist, damit App-Schutzrichtlinien aktiviert werden können.The Intune App SDK for Android relies on the presence of the Company Portal app on the device to enable app protection policies. Das Unternehmensportal ruft App-Schutzrichtlinien vom Intune-Dienst ab.The Company Portal retrieves app protection policies from the Intune service. Wenn die App initialisiert wird, lädt sie die entsprechende Richtlinie sowie Code, um diese Richtlinie vom Unternehmensportal zu erzwingen.When the app initializes, it loads policy and code to enforce that policy from the Company Portal.

Hinweis

Wenn sich die Unternehmensportal-App nicht auf dem Gerät befindet, verhält sich eine Intune-fähige App genauso wie eine normale App, die keine Intune-App-Schutzrichtlinien unterstützt.When the Company Portal app is not on the device, an Intune-enlightened app behaves the same as a normal app that does not support Intune app protection policies.

Für einen App-Schutz ohne Registrierung des Geräts muss der Benutzer das Gerät nicht mithilfe der Unternehmensportal-App registrieren.For app protection without device enrollment, the user is not required to enroll the device by using the Company Portal app.

SDK-IntegrationSDK Integration

BuildintegrationBuild integration

Das Intune App SDK ist eine Android-Standardbibliothek ohne externe Abhängigkeiten.The Intune App SDK is a standard Android library with no external dependencies. Microsoft.Intune.MAM.SDK.jar enthält sowohl die Schnittstellen, die für die Aktivierung der App-Schutzrichtlinie erforderlich sind, als auch den für die Zusammenarbeit mit der Unternehmensportal-App von Microsoft Intune erforderlichen Code.Microsoft.Intune.MAM.SDK.jar contains both the interfaces necessary for an app protection policy enablement and the code necessary to interoperate with the Microsoft Intune Company Portal app.

Microsoft.Intune.MAM.SDK.jar muss als Android-Bibliotheksverweis angegeben werden.Microsoft.Intune.MAM.SDK.jar must be specified as an Android library reference. Öffnen Sie dazu Ihr App-Projekt in Android Studio, und wechseln Sie zu File > New > New module (Datei > Neu > Neues Modul), und wählen Sie dann Import .JAR/.AAR Package (JAR/AAR-Paket importieren) aus.To do this, open your app project in Android Studio and go to File > New > New module and select Import .JAR/.AAR Package. Wählen Sie das Android-Archivpaket Microsoft.Intune.MAM.SDK.aar aus.Select our Android archive package Microsoft.Intune.MAM.SDK.aar.

Darüber hinaus enthalten Microsoft.Intune.MAM.SDK.Support.v4 und Microsoft.Intune.MAM.SDK.Support.v7 Intune-Varianten von android.support.v4 und android.support.v7.Additionally, Microsoft.Intune.MAM.SDK.Support.v4 and Microsoft.Intune.MAM.SDK.Support.v7 contain Intune variants of android.support.v4 and android.support.v7 respectively. Sie sind für den Fall nicht in Microsoft.Intune.MAM.SDK.aar integriert, dass eine Anwendung die Unterstützungsbibliotheken nicht einbeziehen möchte.They are not built into Microsoft.Intune.MAM.SDK.aar in case an app does not want to include the support libraries. Dabei handelt es sich anstelle von Android-Bibliotheksprojekten um JAR-Standarddateien.They are standard JAR files instead of Android library projects.

ProGuardProGuard

Wenn ProGuard (oder ein beliebiger anderer Komprimierungs- oder Obfuskationsmechanismus) als Buildschritt verwendet wird, müssen Intune SDK-Klassen ausgeschlossen werden.If ProGuard (or any other shrinking/obfuscation mechanism) is used as a build step, Intune SDK classes must be excluded. Für ProGuard kann dies durch Einbeziehen der Regeln aus der Datei „proguard.txt“ erreicht werden, die mit dem SDK ausgeliefert wird.For ProGuard, this can be accomplished by including the rules from the proguard.txt file distributed with the SDK.

Die Azure Active Directory Authentication Librarys (ADAL) weisen möglicherweise eigene ProGuard-Einschränkungen auf.The Azure Active Directory Authentication Libraries (ADAL) may have its own ProGuard restrictions. Wenn Ihre App ADAL integriert, müssen Sie hinsichtlich dieser Einschränkungen der ADAL-Dokumentation folgen.If your app integrates ADAL, you must follow the ADAL documentation on these restrictions.

EinstiegspunkteEntry points

Die Azure Active Directory Authentication Library (ADAL) verlangt, dass diese Berechtigungen Brokerauthentifizierung ausführen.The Azure Active Directory Authentication Library (ADAL) requires these permissions to perform brokered authentication. Wenn diese Berechtigungen der App nicht gewährt oder vom Benutzer widerrufen werden, werden Authentifizierungsflüsse deaktiviert, die den Broker (die Unternehmensportal-App) erfordern.If these permissions are not granted to the app or are revoked by the user, authentication flows that require the broker (the Company Portal app) will be disabled.

Das Intune App SDK erfordert Änderungen am Quellcode einer App, damit Intune-App-Schutzrichtlinien aktiviert werden können.The Intune App SDK requires changes to an app's source code to enable Intune app protection policies. Zu diesem Zweck werden die Android-Basisklassen durch äquivalente Intune-Basisklassen ersetzt, deren Namen das Präfix MAM haben.This is done through the replacement of the Android base classes with equivalent Intune base classes, whose names have the prefix MAM. Die SDK-Klassen befinden sich zwischen der Android-Basisklasse und der App-eigenen abgeleiteten Version dieser Klasse.The SDK classes live between the Android base class and the app's own derived version of that class. Wenn Sie beispielsweise eine Aktivität verwenden, erhalten Sie eine Vererbungshierarchie, die wie folgt aussieht: Activity > MAMActivity > AppSpecificActivity.Using an activity as an example, you end up with an inheritance hierarchy that looks like: Activity > MAMActivity > AppSpecificActivity.

Wenn AppSpecificActivity z. B. mit dem übergeordneten Element (z. B. durch Aufrufen von super.onCreate()) interagiert, ist MAMActivity die übergeordnete Klasse.For example, when AppSpecificActivity interacts with its parent (for example, calling super.onCreate()), MAMActivity is the super class.

Typische Android-Apps verfügen über einen einzelnen Modus und können über ihr Context-Objekt auf das gesamte System zugreifen.Typical Android apps have a single mode and can access the system through their Context object. Andererseits verfügen Apps, in die das Intune App SDK integriert ist, über zwei Modi.Apps that have integrated the Intune App SDK, on the other hand, have dual modes. Diese Apps greifen auch weiterhin über das Context-Objekt auf das System zu.These apps continue to access the system through the Context object. Abhängig von der verwendeten Basis-Activity wird das Context-Objekt von Android bereitgestellt oder auf intelligente Weise zwischen einer eingeschränkten Ansicht des Systems und dem von Android bereitgestellten Context im Multiplexmodus gesendet.Depending on the base Activity used, the Context object will be provided by Android or will intelligently multiplex between a restricted view of the system and the Android-provided Context. Nachdem Sie die Ableitung von einem der MAM-Einstiegspunkte vorgenommen haben, kann Context wie gewohnt gefahrlos verwendet werden, z. B. zum Starten von Activity-Klassen und Verwenden von PackageManager.After you derive from one of the MAM entry points, it's safe to use Context as you would normally -- for example, starting Activity classes and using PackageManager.

Ersetzen von Klassen, Methoden und Aktivitäten durch das MAM-ÄquivalentReplace classes, methods, and activities with their MAM equivalent

Android-Basisklassen müssen durch ihre jeweiligen MAM-Äquivalente ersetzt werden.Android base classes must be replaced with their respective MAM equivalents. Suchen Sie dazu nach allen Instanzen der in der folgenden Tabelle aufgeführten Klassen, und ersetzen Sie sie durch das Intune App SDK-Äquivalent.To do so, find all instances of the classes listed in the following table and replace them with the Intune App SDK equivalent.

Android-BasisklasseAndroid base class Intune App SDK-ÄquivalentIntune App SDK replacement
android.app.Activityandroid.app.Activity MAMActivityMAMActivity
android.app.ActivityGroupandroid.app.ActivityGroup MAMActivityGroupMAMActivityGroup
android.app.AliasActivityandroid.app.AliasActivity MAMAliasActivityMAMAliasActivity
android.app.Applicationandroid.app.Application MAMApplicationMAMApplication
android.app.DialogFragmentandroid.app.DialogFragment MAMDialogFragmentMAMDialogFragment
android.app.ExpandableListActivityandroid.app.ExpandableListActivity MAMExpandableListActivityMAMExpandableListActivity
android.app.Fragmentandroid.app.Fragment MAMFragmentMAMFragment
android.app.IntentServiceandroid.app.IntentService MAMIntentServiceMAMIntentService
android.app.LauncherActivityandroid.app.LauncherActivity MAMLauncherActivityMAMLauncherActivity
android.app.ListActivityandroid.app.ListActivity MAMListActivityMAMListActivity
android.app.NativeActivityandroid.app.NativeActivity MAMNativeActivityMAMNativeActivity
android.app.PendingIntentandroid.app.PendingIntent MAMPendingIntent (siehe Hinweise unten)MAMPendingIntent (see notes below)
android.app.Serviceandroid.app.Service MAMServiceMAMService
android.app.TabActivityandroid.app.TabActivity MAMTabActivityMAMTabActivity
android.app.TaskStackBuilderandroid.app.TaskStackBuilder MAMTaskStackBuilderMAMTaskStackBuilder
android.app.backup.BackupAgentandroid.app.backup.BackupAgent MAMBackupAgentMAMBackupAgent
android.app.backup.BackupAgentHelperandroid.app.backup.BackupAgentHelper MAMBackupAgentHelperMAMBackupAgentHelper
android.app.backup.FileBackupHelperandroid.app.backup.FileBackupHelper MAMFileBackupHelperMAMFileBackupHelper
android.app.backup.SharePreferencesBackupHelperandroid.app.backup.SharePreferencesBackupHelper MAMSharedPreferencesBackupHelperMAMSharedPreferencesBackupHelper
android.content.BroadcastReceiverandroid.content.BroadcastReceiver MAMBroadcastReceiverMAMBroadcastReceiver
android.content.ContentProviderandroid.content.ContentProvider MAMContentProviderMAMContentProvider
android.os.Binderandroid.os.Binder MAMBinder (Nur erforderlich, wenn der Binder nicht von einer Schnittstelle der Android Interface Definition Language (AIDL) generiert wird.)MAMBinder (Only necessary if the Binder is not generated from an Android Interface Definition Language (AIDL) interface)
android.provider.DocumentsProviderandroid.provider.DocumentsProvider MAMDocumentsProviderMAMDocumentsProvider
android.preference.PreferenceActivityandroid.preference.PreferenceActivity MAMPreferenceActivityMAMPreferenceActivity

Microsoft.Intune.MAM.SDK.Support.v4.jar:Microsoft.Intune.MAM.SDK.Support.v4.jar:

Android-Klasse – Intune MAMAndroid Class Intune MAM Intune App SDK-ÄquivalentIntune App SDK replacement
android.support.v4.app.DialogFragmentandroid.support.v4.app.DialogFragment MAMDialogFragmentMAMDialogFragment
android.support.v4.app.FragmentActivityandroid.support.v4.app.FragmentActivity MAMFragmentActivityMAMFragmentActivity
android.support.v4.app.Fragmentandroid.support.v4.app.Fragment MAMFragmentMAMFragment
android.support.v4.app.TaskStackBuilderandroid.support.v4.app.TaskStackBuilder MAMTaskStackBuilderMAMTaskStackBuilder
android.support.v4.content.FileProviderandroid.support.v4.content.FileProvider MAMFileProviderMAMFileProvider

Microsoft.Intune.MAM.SDK.Support.v7.jar:Microsoft.Intune.MAM.SDK.Support.v7.jar:

Android-KlasseAndroid Class Intune App SDK-ÄquivalentIntune App SDK replacement
android.support.v7.app.ActionBarActivityandroid.support.v7.app.ActionBarActivity MAMActionBarActivityMAMActionBarActivity

Umbenannte MethodenRenamed Methods

In vielen Fällen wurde eine in der Android-Klasse verfügbare Methode in der äquivalenten MAM-Klasse als abgeschlossen gekennzeichnet.In many cases, a method available in the Android class has been marked as final in the MAM replacement class. In diesem Fall stellt die äquivalente MAM-Klasse eine Methode mit ähnlichem Namen (normalerweise mit dem Suffix MAM) bereit, die stattdessen überschrieben werden sollte.In this case, the MAM replacement class provides a similarly named method (generally suffixed with MAM) that you should override instead. Wenn z. B. von MAMActivity abgeleitet wird, anstatt onCreate() zu überschreiben und super.onCreate() aufzurufen, muss Activity onMAMCreate() überschreiben und super.onMAMCreate() aufrufen.For example, when deriving from MAMActivity, instead of overriding onCreate() and calling super.onCreate(), Activity must override onMAMCreate() and call super.onMAMCreate(). Der Java-Compiler sollte die abgeschlossenen Einschränkungen erzwingen, um zu verhindern, dass die ursprüngliche Methode anstelle des MAM-Äquivalents überschrieben wird.The Java compiler should enforce the final restrictions to prevent accidental override of the original method instead of the MAM equivalent.

PendingIntentPendingIntent

Anstelle von PendingIntent.get* müssen Sie die MAMPendingIntent.get*-Methode verwenden.Instead of PendingIntent.get*, you must use the MAMPendingIntent.get* method. Anschließend können Sie den sich ergebenden PendingIntent wie gewohnt verwenden.After this, you can use the resultant PendingIntent as usual.

ManifestersetzungenManifest Replacements

Beachten Sie, dass es möglicherweise erforderlich ist, einige der oben aufgeführten Klassenersetzungen im Manifest als auch in Java-Code vorzunehmen.Please note that it may be necessary to perform some of the above class replacements in the manifest as well as in Java code. Besonderer Hinweis:Of special note:

  • Manifestverweise auf android.support.v4.content.FileProvider müssen durch com.microsoft.intune.mam.client.support.v4.content.MAMFileProvider ersetzt werden.Manifest references to android.support.v4.content.FileProvider must be replaced with com.microsoft.intune.mam.client.support.v4.content.MAMFileProvider.
  • Wenn Ihre Anwendung keine eigene abgeleitete Anwendungklasse benötigt, muss com.microsoft.intune.mam.client.app.MAMApplication als Name der Anwendungsklasse festgelegt werden, die im Anwendungsmanifest verwendet wird.If your application does not have a need for its own derived Application class, com.microsoft.intune.mam.client.app.MAMApplication must be set as the name of the Application class used in the manifest.

SDK-BerechtigungenSDK permissions

Das Intune App SDK erfordert drei Android-Systemberechtigungen für Apps, die es integrieren:The Intune App SDK requires three Android system permissions on apps that integrate it:

  • android.permission.GET_ACCOUNTS (zur Laufzeit angefordert, wenn erforderlich)android.permission.GET_ACCOUNTS (requested at runtime if required)

  • android.permission.MANAGE_ACCOUNTS

  • android.permission.USE_CREDENTIALS

Die Azure Active Directory Authentication Library (ADAL) verlangt, dass diese Berechtigungen Brokerauthentifizierung ausführen.The Azure Active Directory Authentication Library (ADAL) requires these permissions to perform brokered authentication. Wenn diese Berechtigungen der App nicht gewährt oder vom Benutzer widerrufen werden, werden Authentifizierungsflüsse deaktiviert, die den Broker (die Unternehmensportal-App) erfordern.If these permissions are not granted to the app or are revoked by the user, authentication flows that require the broker (the Company Portal app) will be disabled.

LoggingLogging

Die Protokollierung sollte früh initialisiert werden, um die protokollierten Daten optimal nutzen zu können.Logging should be initialized early to get the most value out of logged data. Application.onMAMCreate() ist in der Regel der beste Ort zum Initialisieren der Protokollierung.Application.onMAMCreate() is typically the best place to initialize logging.

Erstellen Sie einen Java-Handler, und fügen Sie ihn zum MAMLogHandlerWrapper hinzu, um MAM-Protokolle in Ihrer App zu erhalten.To receive MAM logs in your app, create a Java Handler and add it to the MAMLogHandlerWrapper. Dadurch wird publish() für den Anwendungshandler für jede Protokollnachricht aufgerufen.This will invoke publish() on the application handler for every log message.

/**
 * Global log handler that enables fine grained PII filtering within MAM logs.  
 *
 * To start using this you should build your own log handler and add it via
 * MAMComponents.get(MAMLogHandlerWrapper.class).addHandler(myHandler, false);  
 *
 * You may also remove the handler entirely via
 * MAMComponents.get(MAMLogHandlerWrapper.class).removeHandler(myHandler);
 */
public interface MAMLogHandlerWrapper {
    /**
     * Add a handler, PII can be toggled.
     *
     * @param handler handler to add.
     * @param wantsPII if PII is desired in the logs.    
     */
    void addHandler(final Handler handler, final boolean wantsPII);

    /**
     * Remove a handler.
     *
     * @param handler handler to remove.
     */
    void removeHandler(final Handler handler);
}

Aktivieren von Funktionen, die App-Beteiligung erfordernEnable features that require app participation

Es gibt verschiedene App-Schutzrichtlinien, die das SDK nicht selbst implementieren kann.There are several app protection policies the SDK cannot implement on its own. Die App kann ihr Verhalten zum Bereitstellen dieser Features mit mehreren APIs steuern, die Sie in der folgenden AppPolicy-Schnittstelle finden.The app can control its behavior to achieve these features by using several APIs that you can find in the following AppPolicy interface. Verwenden Sie MAMPolicyManager.getPolicy, um eine AppPolicy-Instanz abzurufen.To retrieve an AppPolicy instance, use MAMPolicyManager.getPolicy.

/**
 * External facing application policies.
 */
public interface AppPolicy {

/**
 * Restrict where an app can save personal data.
 * This function is now deprecated. Please use getIsSaveToLocationAllowed(SaveLocation, String) instead
 * @return True if the app is allowed to save to personal data stores; false otherwise.
 */
@Deprecated
boolean getIsSaveToPersonalAllowed();

/**
 * Check if policy prohibits saving to a content provider location.
 *
 * @param location
 *            a content URI to check
 * @return True if location is not a content URI or if policy does not prohibit saving to the content location.
 */
boolean getIsSaveToLocationAllowed(Uri location);

/**
 * Determines if the SaveLocation passed in can be saved to by the username associated with the cloud service.
 *
 * @param service
 *           see {@link SaveLocation}.
 * @param username
 *           the username/email associated with the cloud service being saved to. Use null if a mapping between
 *           the AAD username and the cloud service username does not exist or the username is not known.
 * @return true if the location can be saved to by the identity, false if otherwise.
 */
boolean getIsSaveToLocationAllowed(SaveLocation service, String username);

/**
 * Whether the SDK PIN prompt is enabled for the app.
 *
 * @return True if the PIN is enabled. False otherwise.
 */
boolean getIsPinRequired();

/**
 * Whether the Intune Managed Browser is required to open web links.
 * @return True if the Managed Browser is required, false otherwise
 */
boolean getIsManagedBrowserRequired();

/**
 * Check if policy allows Contact sync to local contact list.
 *
 * @return True if Contact sync is allowed to save to local contact list; false otherwise.
 */
boolean getIsContactSyncAllowed();

/**
 * Return the policy in string format to the app.
 *  
 * @return The string representing the policy.
 */
String toString();

}

Hinweis

MAMPolicyManager.getPolicy gibt stets eine App-Richtlinie ungleich NULL zurück. Dies gilt selbst dann, wenn das Gerät oder die App keiner Intune-Verwaltungsrichtlinie unterliegt.MAMPolicyManager.getPolicy will always return a non-null App Policy, even if the device or app is not under an Intune management policy.

Beispiel: Ermittlung, ob eine PIN für die App erforderlich istExample: Determine if PIN is required for the app

Verfügt die App über eine eigene PIN-Benutzererfahrung, können Sie diese deaktivieren, wenn der IT-Administrator das SDK so konfiguriert hat, das eine App-PIN angefordert wird.If the app has its own PIN user experience, you might want to disable it if the IT administrator has configured the SDK to prompt for an app PIN. Um festzustellen, ob der IT-Administrator die App-PIN-Richtlinie für diese App bereitgestellt hat, rufen Sie die folgende Methode für den aktuellen Endbenutzer auf:To determine if the IT administrator has deployed the app PIN policy to this app, for the current end user, call the following method:

MAMComponents.get(AppPolicy.class).getIsPinRequired();

Beispiel: Ermitteln des primären Intune-BenutzersExample: Determine the primary Intune user

Zusätzlich zu den in AppPolicy bereitgestellten APIs wird der Benutzerprinzipalname (User Principal Name, UPN) auch von der getPrimaryUser()-API in der MAMUserInfo-Schnittstelle verfügbar gemacht.In addition to the APIs exposed in AppPolicy, the user principal name (UPN) is also exposed by the getPrimaryUser() API defined inside the MAMUserInfo interface. Rufen Sie Folgendes auf, um den UPN abzurufen:To get the UPN, call the following:

MAMUserInfo info = MAMComponents.get(MAMUserInfo.class);
if (info != null) return info.getPrimaryUser();

Die vollständige Definition der MAMUserInfo-Schnittstelle folgt unten:The full definition of the MAMUserInfo interface is below:

/**
 * External facing user informations.
 *
 */
public interface MAMUserInfo {
       /**
        * Get the primary user name.
        *
        * @return the primary user name or null if the device is not enrolled.
        */
       String getPrimaryUser();
}

Beispiel: Ermittlung, ob das Speichern auf dem Gerät oder im Cloudspeicher zulässig istExample: Determine if saving to device or cloud storage is permitted

Viele Apps implementieren Funktionen, die dem Endbenutzer ermöglichen, Dateien lokal oder bei einem Cloudspeicherdienst zu speichern.Many apps implement features that allow the end user to save files locally or to a cloud storage service. Mit dem Intune App SDK können IT-Administratoren dafür sorgen, dass keine Datenpreisgabe erfolgt, indem sie Richtlinieneinschränkungen entsprechend den Anforderungen ihrer Organisation anwenden.The Intune App SDK allows IT administrators to protect against data leakage by applying policy restrictions as they see fit in their organization. Eine der durch die IT steuerbaren Richtlinien betrifft das Speichern in einem „persönlichen“, nicht verwalteten Datenspeicher durch den Endbenutzer.One of the policies that IT can control is whether the end user can save to a "personal," unmanaged data store. Darunter fällt das Speichern an einem lokalen Speicherort, auf einer SD-Karte und bei Sicherungsdiensten von Drittanbietern.This includes saving to a local location, SD card, or third-party backup services.

Damit die Funktion aktiviert werden kann, ist App-Beteiligung erforderlich.App participation is needed to enable the feature. Wenn Ihre App das direkte Speichern aus der App an einem persönlichen oder Cloudspeicherort ermöglicht, müssen Sie diese Funktion implementieren, damit IT-Administratoren steuern können, ob das Speichern an einem Speicherort erlaubt ist oder nicht.If your app allows saving to personal or cloud locations directly from the app, you must implement this feature to ensure that the IT administrator can control whether saving to a location is allowed. Die folgende API informiert die App darüber, ob das Speichern in einem persönlichen Speicher gemäß der aktuellen Intune-Administratorrichtlinie zulässig ist.The API below lets the app know whether saving to a personal store is allowed by the current Intune administrator's policy. Die App kann dann die Richtlinie erzwingen, da sie über den persönlichen Datenspeicher informiert ist, der dem Endbenutzer über die App zur Verfügung steht.The app can then enforce the policy, since it is aware of personal data store available to the end user through the app.

Rufen Sie Folgendes auf, um zu ermitteln, ob die Richtlinie erzwungen wird:To determine if the policy is enforced, make the following call:

MAMComponents.get(AppPolicy.class).getIsSaveToLocationAllowed(
SaveLocation service, String username);

Dabei entspricht service einem der folgenden Werte für SaveLocations:... where service is one of the following SaveLocations:

* <span data-ttu-id="2cb39-280">SaveLocation.ONEDRIVE_FOR_BUSINESS</span><span class="sxs-lookup"><span data-stu-id="2cb39-280">SaveLocation.ONEDRIVE_FOR_BUSINESS</span></span>
* <span data-ttu-id="2cb39-281">SaveLocation.LOCAL</span><span class="sxs-lookup"><span data-stu-id="2cb39-281">SaveLocation.LOCAL</span></span>
* <span data-ttu-id="2cb39-282">SaveLocation.SHAREPOINT</span><span class="sxs-lookup"><span data-stu-id="2cb39-282">SaveLocation.SHAREPOINT</span></span>

Die vorherige Methode zur Ermittlung, ob die Richtlinie eines Benutzers das Speichern von Daten an verschiedenen Speicherorten gestattet, war getIsSaveToPersonalAllowed() innerhalb derselben AppPolicy-Klasse.The previous method of determining whether a user’s policy allowed them to save data to various locations was getIsSaveToPersonalAllowed() within the same AppPolicy class. Diese Funktion ist jetzt veraltet und sollte nicht verwendet werden. Der folgende Aufruf entspricht getIsSaveToPersonalAllowed():This function is now deprecated and should not be used, the following invocation is equivalent to getIsSaveToPersonalAllowed():


MAMPolicyManager.getPolicy(currentActivity).getIsSaveToLocationAllowed(SaveLocation.LOCAL, userNameInQuestion);

Hinweis

Verwenden Sie SaveLocation.OTHER, wenn der betreffende Speicherort nicht in der SaveLocations-Enumeration aufgeführt ist.Use SaveLocation.OTHER if the location in question is not listed in the SaveLocations enum.

Registrieren für Benachrichtigungen vom SDKRegister for notifications from the SDK

ÜbersichtOverview

Das Intune App SDK erlaubt Ihrer App die Steuerung des Verhaltens bestimmter Richtlinien, z. B. zur selektiven Zurücksetzung, wenn sie vom IT-Administrator bereitgestellt werden.The Intune App SDK allows your app to control the behavior of certain policies, such as selective wipe, when they are deployed by the IT administrator. Wenn ein IT-Administrator eine solche Richtlinie bereitstellt, sendet der Intune-Dienst eine Benachrichtigung an das SDK.When an IT administrator deploys such a policy, the Intune service sends down a notification to the SDK.

Ihre App muss sich für Benachrichtigungen vom SDK registrieren, indem ein MAMNotificationReceiver erstellt und mit MAMNotificationReceiverRegistry registriert wird.Your app must register for notifications from the SDK by creating a MAMNotificationReceiver and registering it with MAMNotificationReceiverRegistry. Zu diesem Zweck werden der Empfänger und der Typ der Benachrichtigung in App.onCreate angegeben, wie das folgende Beispiel veranschaulicht:This is done by providing the receiver and the type of notification desired in App.onCreate, as the example below illustrates:

@Override
public void onCreate() {
    super.onCreate();
    MAMComponents.get(MAMNotificationReceiverRegistry.class)
        .registerReceiver(
            new ToastNotificationReceiver(),
            MAMNotificationType.WIPE_USER_DATA);
    }

MAMNotificationReceiverMAMNotificationReceiver

Die MAMNotificationReceiver-Schnittstelle empfängt lediglich Benachrichtigungen vom Intune-Dienst.The MAMNotificationReceiver interface simply receives notifications from the Intune service. Einige Benachrichtigungen werden direkt vom SDK verarbeitet, andere erfordern die Beteiligung der App.Some notifications are handled by the SDK directly, while others require the app's participation. Eine App muss „true“ oder „false“ von einer Benachrichtigung zurückgeben.An app must return either true or false from a notification. Sie muss immer "true" zurückgeben, es sei denn, eine von ihr aufgrund der Benachrichtigung ausgeführte Aktion schlägt fehl.It must always return true unless some action it tried to take as a result of the notification failed.

  • Dieser Fehler kann beim Intune-Dienst gemeldet werden.This failure may be reported to the Intune service. Ein Beispiel für ein zu berichtendes Szenario ist, wenn die Anwendung Benutzerdaten nicht zurücksetzt, nachdem der IT-Administrator eine Zurücksetzung initiiert hat.An example of a scenario to report is if the app fails to wipe user data after the IT administrator initiates a wipe.

Hinweis

Ein Blockieren in MAMNotificationReceiver.onReceive ist sicher, weil der zugehörige Rückruf nicht im Benutzeroberflächenthread ausgeführt wird.It is safe to block in MAMNotificationReceiver.onReceive because its callback is not running on the UI thread.

Die MAMNotificationReceiver-Schnittstelle (gemäß der Definition im SDK) ist nachfolgend enthalten:The MAMNotificationReceiver interface as defined in the SDK is included below :

/**
 * The SDK is signaling that a MAM event has occurred.
 *
 */
public interface MAMNotificationReceiver {

    /**
     * A notification was received.
     *
     * @param notification
     *            The notification that was received.
     * @return The receiver should return true if it handled the
     *   notification without error (or if it decided to ignore the
     *   notification). If the receiver tried to take some action in
     *   response to the notification but failed to complete that
     *   action it should return false.
     */
    boolean onReceive(MAMNotification notification);
}

Arten von BenachrichtigungenTypes of notifications

Folgende Benachrichtigungen werden an die App gesendet; für manche ist ggf. App-Beteiligung erforderlich:The following notifications are sent to the app and some of them may require app participation:

  • WIPE_USER_DATA: Diese Benachrichtigung wird in einer MAMUserNotification-Klasse gesendet.WIPE_USER_DATA: This notification is sent in a MAMUserNotification class. Beim Empfang dieser Benachrichtigung sollte die App alle Daten im Zusammenhang mit der mit MAMUserNotification übergebenen „Unternehmensidentität“ löschen.When this notification is received, the app is expected to delete all data associated with the "corporate" identity passed with the MAMUserNotification. Diese Benachrichtigung wird zurzeit bei der Aufhebung der Registrierung beim APP-WE-Dienst gesendet.This notification is currently sent during APP-WE service unenrollment. Der primäre Name des Benutzers wird in der Regel während der Registrierung angegeben.The user's primary name is typically specified during the enrollment process. Wenn Sie sich für diese Benachrichtigung registrieren, muss Ihre App sicherstellen, dass alle Benutzerdaten gelöscht wurden.If you register for this notification, your app must ensure that all the user's data has been deleted. Wenn Sie sich nicht für sie registrieren, wird das Standardverhalten für die selektive Zurücksetzung ausgeführt.If you don't register for it, the default selective wipe behavior will be performed.

  • WIPE_USER_AUXILIARY_DATA: Apps können sich für diese Benachrichtigung registrieren, wenn das Intune App SDK die standardmäßige selektive Zurücksetzung ausführen soll, aber bei der Zurücksetzung weitere Daten entfernt werden sollen.WIPE_USER_AUXILIARY_DATA: Apps can register for this notification if they'd like the Intune App SDK to perform the default selective wipe behavior, but would still like to remove some auxiliary data when the wipe occurs.

  • REFRESH_POLICY: Diese Benachrichtigung wird in einer MAMUserNotification gesendet.REFRESH_POLICY: This notification is sent in a MAMUserNotification. Bei Empfang dieser Benachrichtigung muss jegliche zwischengespeicherte Intune-Richtlinie für ungültig erklärt und aktualisiert werden.When this notification is received, any cached Intune policy must be invalidated and updated. In der Regel wird diese Aufgabe vom SDK ausgeführt, sollte aber von der App ausgeführt werden, wenn die Richtlinie beständig verwendet wird.This is generally handled by the SDK; however, it should be handled by the app if the policy is used in any persistent way.

  • MANAGEMENT_REMOVED: Diese Benachrichtigung wird in einer MAMUserNotification gesendet und informiert die App darüber, dass sie bald zu einer nicht verwalteten App wird.MANAGEMENT_REMOVED: This notification is sent in a MAMUserNotification and informs the app that it is about to become unmanaged. Nachdem sie nicht mehr verwaltet wird, kann die App keine verschlüsselten Dateien und keine mit MAMDataProtectionManager verschlüsselten Daten mehr lesen sowie nicht mehr mit der verschlüsselten Zwischenablage interagieren bzw. anderweitig am Ökosystem der verwalteten Apps teilnehmen.Once unmanaged, it will no longer be able to read encrypted files, read data encrypted with MAMDataProtectionManager, interact with the encrypted clipboard, or otherwise participate in the managed-app ecosystem.

Hinweis

Eine App sollte niemals gleichzeitig für WIPE_USER_DATA- und für WIPE_USER_AUXILIARY_DATA-Benachrichtigungen registriert werden.An app should never register for both the WIPE_USER_DATA and WIPE_USER_AUXILIARY_DATA notifications.

Konfigurieren der Authentifizierungsbibliothek von Azure Active Directory (Active Directory Authentication Library, ADAL)Configure Azure Active Directory Authentication Library (ADAL)

Lesen Sie zunächst die ADAL-Integrationsrichtlinien im ADAL-Repository auf GitHub.First, please read the ADAL integration guidelines found in the ADAL repository on GitHub.

Das SDK ist für seine Szenarien, die die Authentifizierung und den bedingten Start betreffen, auf ADAL angewiesen. Dazu müssen Apps mit Azure Active Directory konfiguriert sein.The SDK relies on ADAL for its authentication and conditional launch scenarios, which require apps to be configured with Azure Active Directory. Die Konfigurationswerte werden dem SDK über AndroidManifest-Metadaten übermittelt.The configuration values are communicated to the SDK via AndroidManifest metadata.

Zum Konfigurieren der App und zum Aktivieren der geeigneten Authentifizierung fügen Sie dem App-Knoten in der Datei „AndroidManifest.xml“ Folgendes hinzu.To configure your app and enable proper authentication, add the following to the app node in AndroidManifest.xml. Einige dieser Konfigurationen sind nur erforderlich, wenn Ihre App für die Authentifizierung im Allgemeinen ADAL verwendet. In diesem Fall benötigen Sie die speziellen Werte, die die App verwendet, um sich selbst bei AAD zu registrieren.Some of these configurations are only required if your app uses ADAL for authentication in general; in that case, you will need the specific values your app uses to register itself with AAD. Damit wird sichergestellt, dass der Endbenutzer nicht zweimal zur Authentifizierung aufgefordert wird, weil AAD zwei separate Registrierungswerte erkennt: einen von der App und einen vom SDK.This is done to ensure that the end user does not get prompted for authentication twice, due to AAD recognizing two separate registration values: one from the app and one from the SDK.

<meta-data
    android:name="com.microsoft.intune.mam.aad.Authority"
    android:value="https://AAD authority/" />
<meta-data
    android:name="com.microsoft.intune.mam.aad.ClientID"
    android:value="your-client-ID-GUID" />
<meta-data
    android:name="com.microsoft.intune.mam.aad.NonBrokerRedirectURI"
    android:value="your-redirect-URI" />
<meta-data
    android:name="com.microsoft.intune.mam.aad.SkipBroker"
    android:value="[true | false]" />

ADAL-MetadatenADAL metadata

  • Authority ist die derzeit verwendete AAD-Autorität.Authority is the current AAD authority in use. Sofern vorhanden, sollten Sie dort Ihre eigene Umgebung verwenden, wo AAD-Konten konfiguriert wurden.If present, you should use your own environment where AAD accounts have been configured. Wenn dieser Wert nicht vorhanden ist, wird der Intune-Standard verwendet.If this value is absent, an Intune default is used.

  • ClientID ist die zu verwendende AAD-ClientID.ClientID is the AAD ClientID to be used. Sie sollten die ClientID Ihrer eigenen App verwenden, sofern diese bei Azure AD registriert ist.You should use your own app's ClientID if it is registered with Azure AD. Wenn dieser Wert nicht vorhanden ist, wird der Intune-Standard verwendet.If this value is absent, an Intune default is used.

  • NonBrokerRedirectURI ist der Umleitungs-URI von AAD, der in brokerfreien Fällen verwendet wird.NonBrokerRedirectURI is the AAD redirect URI to use in broker-less cases. Erfolgt keine Angabe, wird der Standardwert urn:ietf:wg:oauth:2.0:oob verwendet.If none is specified, a default value of urn:ietf:wg:oauth:2.0:oob is used. Dieser Standardwert ist für die meisten Apps geeignet.This default is suitable for most apps.

  • SkipBroker wird für den Fall verwendet, dass die Client-ID nicht für die Verwendung des Broker-Umleitungs-URI konfiguriert wurde.SkipBroker is used in case the ClientID has not been configured to use the broker redirect URI. Der Standardwert ist „false“.The default value is "false."

    • Für Apps, die ADAL nicht integrieren und nicht an der geräteübergreifenden Brokerauthentifizierung/SSO teilnehmen möchten, sollte dieser Wert auf „true“ festgelegt werden.For apps that do not integrate ADAL and do not want to participate in device-wide brokered authentication/SSO, this should be set to "true." Wenn dieser Wert „true“ ist, wird „NonBrokerRedirectURI“ als einziger Umleitungs-URI verwendet.When this value is "true," the only redirect URI that will be used is NonBrokerRedirectURI.

    • Für Apps, die das geräteübergreifende SSO-Brokering unterstützen, sollte dieser Wert „false“ sein.For apps that do support device-wide SSO brokering, this should be "false." Wenn der Wert „false“ ist, wählt das SDK auf Basis der Verfügbarkeit des Brokers auf dem System einen Broker aus dem Ergebnis von com.microsoft.aad.adal.AuthenticationContext.getRedirectUriForBroker() und „NonBrokerRedirectURI“ aus.When the value is "false," the SDK will select a broker between the result of com.microsoft.aad.adal.AuthenticationContext.getRedirectUriForBroker() and NonBrokerRedirectURI, based on the availability of the broker on the system. Im Allgemeinen wird der Broker über die Unternehmensportal-App oder die Azure Authenticator-App zur Verfügung gestellt.In general, the broker will be available from the Company Portal app or Azure Authenticator app.

Häufig verwendete ADAL-KonfigurationenCommon ADAL configurations

Nachfolgend sind gebräuchliche Methoden zum Konfigurieren einer App mit ADAL aufgeführt.The following are common ways an app can be configured with ADAL. Suchen Sie die Konfiguration Ihrer App und stellen Sie sicher, dass die ADAL-Metadatenparameter (siehe oben) auf die erforderlichen Werte festgelegt sind.Find your app's configuration and make sure to set the ADAL metadata parameters (explained above) to the necessary values.

  1. App kann ADAL nicht integrieren:App does not integrate ADAL:

    Erforderlicher ADAL-ParameterRequired ADAL parameter WertValue
    AuthorityAuthority Gewünschte Umgebung, in der AAD-Konten konfiguriert wurdenDesired environment where AAD accounts have been configured
    SkipBrokerSkipBroker TrueTrue
  2. App kann ADAL integrieren:App integrates ADAL:

    Erforderlicher ADAL-ParameterRequired ADAL parameter WertValue
    AuthorityAuthority Gewünschte Umgebung, in der AAD-Konten konfiguriert wurdenDesired environment where AAD accounts have been configured
    ClientIDClientID Client-ID der App (von Azure AD generiert, wenn die App registriert ist)The app's ClientID (generated by Azure AD when the app is registered)
    NonBrokerRedirectURINonBrokerRedirectURI Ein gültiger Umleitungs-URI für die App oder urn:ietf:wg:oauth:2.0:oobA valid redirect URI for the app, or urn:ietf:wg:oauth:2.0:oob

    ..

    Stellen Sie sicher, dass Sie den Wert als zulässigen Umleitungs-URI für die Client-ID Ihrer App konfigurieren.Make sure to configure the value as an acceptable redirect URI for your app's ClientID. | SkipBroker | False || SkipBroker | False |

  3. Die App kann ADAL integrieren, unterstützt aber keine Brokerauthentifizierung/geräteübergreifende einmalige Anmeldung:App integrates ADAL but does not support brokered authentication/device-wide SSO:

    Erforderlicher ADAL-ParameterRequired ADAL parameter WertValue
    AuthorityAuthority Gewünschte Umgebung, in der AAD-Konten konfiguriert wurdenDesired environment where AAD accounts have been configured
    ClientIDClientID Client-ID der App (von Azure AD generiert, wenn die App registriert ist)The app's ClientID (generated by Azure AD when the app is registered)
    NonBrokerRedirectURINonBrokerRedirectURI Ein gültiger Umleitungs-URI für die App oder urn:ietf:wg:oauth:2.0:oob als Standardwert.A valid redirect URI for the app, or urn:ietf:wg:oauth:2.0:oob by default.

    Stellen Sie sicher, dass Sie den Wert als zulässigen Umleitungs-URI für die Client-ID Ihrer App konfigurieren.Make sure to configure the value as an acceptable redirect URI for your app's ClientID.
    SkipBrokerSkipBroker TrueTrue

App-Schutzrichtlinie ohne GeräteregistrierungApp protection policy without device enrollment

ÜbersichtOverview

Die Intune-App-Schutzrichtlinie ohne Geräteregistrierung (auch als APP-WE oder MAM-WE bezeichnet) ermöglicht, dass Apps von Intune verwaltet werden können, ohne dass das Gerät bei Intune MDM registriert sein muss.Intune app protection policy without device enrollment, also known as APP-WE or MAM-WE, allows apps to be managed by Intune without the need for the device to be enrolled Intune MDM. APP-WE funktioniert mit oder ohne Geräteregistrierung.APP-WE works with or without device enrollment. Es ist weiterhin erforderlich, dass das Unternehmensportal auf dem Gerät installiert ist, aber der Benutzer muss sich nicht beim Unternehmensportal anmelden und das Gerät registrieren.The Company Portal is still required to be installed on the device, but the user does not need to sign into the Company Portal and enroll the device.

Hinweis

Alle Apps müssen die App-Schutzrichtlinie ohne Geräteregistrierung unterstützen.All apps are required to support app protection policy without device enrollment.

WorkflowWorkflow

Wenn eine App ein neues Benutzerkonto erstellt, sollte sie das Konto für die Verwaltung mit dem Intune App SDK registrieren.When an app creates a new user account, it should register the account for management with the Intune App SDK. Das SDK erledigt die Details der Registrierung der App beim APP-WE-Dienst. Bei Bedarf wiederholt es jegliche Registrierungen in entsprechenden Zeitabständen, falls Fehler auftreten.The SDK will handle the details of enrolling the app in the APP-WE service; if necessary, it will retry any enrollments at appropriate time intervals if failures occur.

Die App kann das Intune App-SDK auch nach dem Status eines registrierten Benutzers abfragen, um zu ermitteln, ob der Zugriff des Benutzers auf Unternehmensdaten blockiert werden sollte.The app can also query the Intune App SDK for the status of a registered user to determine if the user should be blocked from accessing corporate content. Es können mehrere Konten für die Verwaltung registriert werden, aber derzeit darf nur ein Konto zurzeit aktiv beim APP-WE-Dienst registriert sein.Multiple accounts may be registered for management, but currently only one account can be actively enrolled with the APP-WE service at a time. Dies bedeutet, dass jeweils nur ein Konto in der App die App-Schutzrichtlinie erhalten kann.This means only one account on the app can receive app protection policy at a time.

Die App muss einen Rückruf bereitstellen, um das geeignete Zugriffstoken aus der Azure Active Directory Authentication Library (ADAL) im Namen des SDKs zu erlangen.The app is required to provide a callback to acquire the appropriate access token from the Azure Active Directory Authentication Library (ADAL) on behalf of the SDK. Es wird angenommen, dass die App für die Benutzerauthentifizierung und zum Abrufen eines eigenen Zugriffstokens bereits ADAL verwendet.It is assumed that the app already uses ADAL for user authentication and to acquire its own access tokens.

Wenn ein Konto vollständig von der App entfernt wird, muss sie die Registrierung für das Konto aufheben, um anzuzeigen, dass die Richtlinie für diesen Benutzer nicht länger von der App angewendet werden soll.When the app removes an account completely, it should unregister that account to indicate that the app should no longer apply policy for that user. Wenn der Benutzer im MAM-Dienst registriert wurde, wird die Registrierung des Benutzers aufgehoben und die App zurückgesetzt.If the user was enrolled in the MAM service, the user will be unenrolled and the app will be wiped.

Übersicht über die App-AnforderungenOverview of app requirements

Ihre App muss zum Implementieren der APP-WE-Integration das Benutzerkonto mit dem MAM SDK registrieren:To implement APP-WE integration, your app must register the user account with the MAM SDK:

  1. Die App muss eine Instanz der MAMServiceAuthenticationCallback-Schnittstelle implementieren und registrieren.The app must implement and register an instance of the MAMServiceAuthenticationCallback interface. Die Rückrufinstanz sollte so früh wie möglich im Lebenszyklus der App registriert werden (in der Regel in der onMAMCreate()-Methode der Anwendungsklasse).The callback instance should be registered as early as possible in the app's lifecycle (typically in the onMAMCreate() method of the application class).

  2. Wenn ein Benutzerkonto erstellt wurde und sich der Benutzer erfolgreich mit ADAL anmeldet, dann muss die App registerAccountForMAM() aufrufen.When a user account is created and the user successfully signs in with ADAL, the app must call the registerAccountForMAM().

  3. Wenn ein Benutzerkonto vollständig entfernt wurde, sollte die App unregisterAccountForMAM() aufrufen, um das Konto aus der Intune-Verwaltung zu entfernen.When a user account is completely removed, the app should call unregisterAccountForMAM() to remove the account from Intune management.

    Hinweis

    Wenn sich ein Benutzer vorübergehend von der App abmeldet, muss die App unregisterAccountForMAM() nicht aufrufen.If a user signs out of the app temporarily, the app does not need to call unregisterAccountForMAM(). Der Aufruf initiiert möglicherweise eine Zurücksetzung, um Unternehmensdaten für den Benutzer vollständig zu entfernen.The call may initiate a wipe to completely remove corporate data for the user.

MAMEnrollmentManagerMAMEnrollmentManager

Alle erforderlichen APIs für die Authentifizierung und Registrierung befinden sich in der MAMEnrollmentManager-Schnittstelle.All the necessary authentication and registration APIs can be found in the MAMEnrollmentManager interface. Ein Verweis auf MAMEnrollmentManager kann wie folgt abgerufen werden:A reference to the MAMEnrollmentManager can be obtained as follows:

MAMEnrollmentManager mgr = MAMComponents.get(MAMEnrollmentManager.class);

// make use of mgr

Die zurückgegebenen MAMEnrollmentManager-Instanz ist garantiert nicht NULL.The MAMEnrollmentManager instance returned is guaranteed not to be null. Die API-Methoden werden in zwei Kategorien unterteilt: Authentifizierung und Kontoregistrierung.The API methods fall into two categories: authentication and account registration.

Hinweis

MAMEnrollmentManager enthält einige API-Methoden, die in Kürze veraltet sein werden.MAMEnrollmentManager contains some API methods that will be deprecated soon. Aus Gründen der Übersichtlichkeit werden nur die relevanten Methoden und Ergebniscodes im folgenden Codeblock angezeigt.For clarity, only the relevant methods and result codes are shown in the code block below.

package com.microsoft.intune.mam.policy;

public interface MAMEnrollmentManager {
    public enum Result {
        AUTHORIZATION_NEEDED,
        NOT_LICENSED,
        ENROLLMENT_SUCCEEDED,
        ENROLLMENT_FAILED,
        WRONG_USER,
        MDM_ENROLLED,
        UNENROLLMENT_SUCCEEDED,
        UNENROLLMENT_FAILED,
        PENDING,
        COMPANY_PORTAL_REQUIRED;
    }

    //Authentication methods
    interface MAMServiceAuthenticationCallback {
        String acquireToken(String upn, String aadId, String resourceId);
    }
    void registerAuthenticationCallback(MAMServiceAuthenticationCallback callback);
    void updateToken(String upn, String aadId, String resourceId, String token);

    //Registration methods
    void registerAccountForMAM(String upn, String aadId, String tenantId);
    void unregisterAccountForMAM(String upn);
    Result getRegisteredAccountStatus(String upn);
}

KontoauthentifizierungAccount authentication

In diesem Abschnitt werden die Methoden der Authentifizierungs-API in MAMEnrollmentManager und deren Verwendung beschrieben.This section describes the authentication API methods in MAMEnrollmentManager and how to use them.

interface MAMServiceAuthenticationCallback {
        String acquireToken(String upn, String aadId, String resourceId);
}
void registerAuthenticationCallback(MAMServiceAuthenticationCallback callback);
void updateToken(String upn, String aadId, String resourceId, String token);
  1. Die App muss die MAMServiceAuthenticationCallback-Schnittstelle implementieren, damit das SDK ein ADAL-Token für den angegebenen Benutzer und die Ressourcen-ID anfordern kann.The app must implement the MAMServiceAuthenticationCallback interface to allow the SDK to request an ADAL token for the given user and resource ID. Die Rückrufinstanz muss für MAMEnrollmentManager bereitgestellt werden, indem die zugehörige registerAuthenticationCallback()-Methode aufgerufen wird.The callback instance must be provided to the MAMEnrollmentManager by calling its registerAuthenticationCallback() method. Möglicherweise ist bereits zu einem sehr frühen Zeitpunkt im Lebenszyklus der App ein Token für Registrierungsversuche oder Eincheckvorgänge zur Aktualisierung der App-Schutzrichtlinie erforderlich, daher ist der ideale Platz zum Registrieren des Rückrufs die onMAMCreate()-Methode der MAMApplication-Unterklasse der App.A token may be needed very early in the app lifecycle for enrollment retries or app protection policy refresh check-ins, so the ideal place to register the callback is in the onMAMCreate() method of the app's MAMApplication subclass.

  2. Die acquireToken()-Methode sollte das Zugriffstoken für die angeforderte Ressource-ID für den angegebenen Benutzer abrufen.The acquireToken() method should acquire the access token for the requested resource ID for the given user. Wenn sie das angeforderte Token nicht abrufen kann, muss NULL zurückgeben werden.If it can't acquire the requested token, it should return null.

  3. Für den Fall, dass die App kein Token bereitstellen kann, wenn das SDK acquireToken() aufruft (wenn bei der automatischen Authentifizierung z. B. ein Fehler auftritt und der Zeitpunkt ungeeignet ist, um eine Benutzeroberfläche anzuzeigen), kann die App zu einem späteren Zeitpunkt ein Token bereitstellen, indem die updateToken()-Methode aufgerufen wird.In case the app is unable to provide a token when the SDK calls acquireToken() -- for example, if silent authentication fails and it is an inconvenient time to show a UI -- the app can provide a token at a later time by calling the updateToken() method. Derselbe UPN sowie dieselbe AAD-ID und Ressourcen-ID, die durch den vorherigen Aufruf von acquireToken() angefordert wurden, müssen zusammen mit dem abschließend erhaltenen Token an updateToken() übergeben werden.The same UPN, AAD ID, and resource ID that were requested by the prior call to acquireToken() must be passed to updateToken(), along with the token that was finally acquired. Die App sollte diese Methode so früh wie möglich aufrufen, nachdem vom bereitgestellten Rückruf NULL zurückgegeben wurde.The app should call this method as soon as possible after returning null from the provided callback.

Hinweis

Das SDK ruft acquireToken() in regelmäßigen Abständen auf, um das Token abzurufen, daher ist das Aufrufen von updateToken() nicht zwingend erforderlich.The SDK will call acquireToken() periodically to get the token, so calling updateToken() is not strictly required. Es wird jedoch empfohlen, da es beim zeitnahen Abschließen der Registrierungen und Eincheckvorgänge für die App-Schutzrichtlinie helfen kann.However, it is recommended as it can help enrollments and app protection policy check-ins complete in a timely manner.

KontoregistrierungAccount registration

In diesem Abschnitt werden die Methoden der Kontoregistrierungs-API in MAMEnrollmentManager und deren Verwendung beschrieben.This section describes the account registration API methods in MAMEnrollmentManager and how to use them.

void registerAccountForMAM(String upn, String aadId, String tenantId);
void unregisterAccountForMAM(String upn);
Result getRegisteredAccountStatus(String upn);
  1. Die App sollte registerAccountForMAM() aufrufen, um ein Konto für die Verwaltung zu registrieren.To register an account for management, the app should call registerAccountForMAM(). Ein Benutzerkonto wird über ihren UPN und ihre AAD-Benutzer-ID identifiziert.A user account is identified by both its UPN and its AAD user ID. Zudem ist die Mandanten-ID erforderlich, um die Registrierungsdaten dem AAD-Mandanten des Benutzers zuzuordnen.The tenant ID is also required to associate enrollment data with the user's AAD tenant. Das SDK versucht möglicherweise, die App für den angegebenen Benutzer im MAM-Dienst zu registrieren. Wenn bei der Registrierung ein Fehler auftritt, wiederholt das SDK die Registrierung in regelmäßigen Abständen, bis die Registrierung des Kontos aufgehoben wurde.The SDK may attempt to enroll the app for the given user in the MAM service; if enrollment fails, it will periodically retry enrollment until the account is unregistered. Der Wiederholungszeitraum beträgt in der Regel 12 bis 24 Stunden.The retry period will typically be 12-24 hours. Das SDK stellt den Status der Registrierungsversuche asynchron über Benachrichtigungen bereit.The SDK provides the status of enrollment attempts asynchronously via notifications.

  2. Da die AAD-Authentifizierung erforderlich ist, ist der beste Zeitpunkt zum Registrieren des Benutzerkontos im Anschluss an die Anmeldung des Benutzers in der App und der erfolgreichen Authentifizierung mithilfe der ADAL.Because AAD authentication is required, the best time to register the user account is after the user has signed into the app and is successfully authenticated using ADAL.

    • Die AAD-ID und die Mandanten-ID des Benutzers werden vom Aufruf der ADAL-Authentifizierung als Teil des AuthenticationResult-Objekts zurückgegeben.The user's AAD ID and tenant ID are returned from the ADAL authentication call as part of the AuthenticationResult object. Die Mandanten-ID stammt aus der AuthenticationResult.getTenantID()-Methode.The tenant ID comes from the AuthenticationResult.getTenantID() method.
    • Informationen zum Benutzer befinden sich in einem untergeordneten Objekt des Typs UserInfo, das aus AuthenticationResult.getUserInfo() stammt, und die AAD-Benutzer-ID wird durch den Aufruf von UserInfo.getUserId() aus diesem Objekt abgerufen.Information about the user is found in a sub-object of type UserInfo that comes from AuthenticationResult.getUserInfo(), and the AAD user ID is retrieved from that object by calling UserInfo.getUserId().
  3. Die App sollte unregisterAccountForMAM() aufrufen, um die Registrierung eines Kontos für die Intune-Verwaltung aufzuheben.To unregister an account from Intune management, the app should call unregisterAccountForMAM(). Wenn das Konto erfolgreich registriert wurde und verwaltet wird, hebt das SDK die Registrierung des Kontos auf und setzt seine Daten zurück.If the account has been successfully enrolled and is managed, the SDK will unenroll the account and wipe its data. Regelmäßige Registrierungsversuche für das Konto werden beendet.Periodic enrollment retries for the account will be stopped. Das SDK stellt den Status der Anforderung zur Aufhebung der Registrierung asynchron über Benachrichtigungen bereit.The SDK provides the status of unenrollment request asynchronously via notifications.

Wichtige Hinweise zur ImplementierungImportant implementation notes

AuthentifizierungAuthentication

  • Wenn die App registerAccountForMAM() aufruft, erhält Sie möglicherweise kurze Zeit später über ihre MAMServiceAuthenticationCallback-Schnittstelle einen Rückruf zu einem anderen Thread.When the app calls registerAccountForMAM(), it may receive a callback on its MAMServiceAuthenticationCallback interface shortly thereafter, on a different thread. Idealerweise hat die App vor der Registrierung des Kontos ihr eigenes Token von der ADAL abgerufen, um die Beschaffung des MAMService-Tokens zu beschleunigen.Ideally, the app acquired its own token from ADAL prior to registering the account to expedite the acquisition of the MAMService token. Wenn die App über den Rückruf ein gültiges Token zurückgibt, wird die Registrierung fortgesetzt, und die App erhält das endgültige Ergebnis über eine Benachrichtigung.IF the app returns a valid token from the callback, enrollment will proceed and the app will get the final result via a notification.

  • Wenn die App kein gültiges AAD-Token zurückgibt, wird AUTHENTICATION_NEEDED als endgültiges Ergebnis des Registrierungsversuchs zurückgegeben.If the app doesn't return a valid AAD token, the final result from the enrollment attempt will be AUTHENTICATION_NEEDED. Wenn die App dieses Ergebnis über eine Benachrichtigung erhält, kann sie den Registrierungsprozess durch die Beschaffung des MAMService-Tokens und den Aufruf der updateToken()-Methode beschleunigen, um den Registrierungsprozess erneut zu initiieren.If the app receives this Result via notification, it can expedite the enrollment process by acquiring the MAMService token and calling the updateToken() method to initiate the enrollment process again. Dies ist jedoch keine feste Anforderung, da das SDK die Registrierung in regelmäßigen Abständen erneut versucht und den Rückruf aufruft, um das Token abzurufen.This is not a firm requirement, however, since the SDK retries enrollment periodically and invokes the callback to acquire the token.

  • Die registrierte MAMServiceAuthenticationCallback-Schnittstelle der App wird ebenfalls aufgerufen, um ein Token für regelmäßige Eincheckvorgänge zum Aktualisieren der App-Schutzrichtlinie abzurufen. Wenn die App ein Token nicht auf Anforderung bereitstellen kann, erhält sie keine Benachrichtigung. Sie sollte jedoch zum nächsten geeigneten Zeitpunkt versuchen, ein Token abzurufen und updateToken() aufzurufen, um den Eincheckvorgang zu beschleunigen.The app's registered MAMServiceAuthenticationCallback will also be called to acquire a token for periodic app protection policy refresh check-ins. If the app is unable to provide a token when requested, it will not get a notification, but it should attempt to acquire a token and call updateToken() at the next convenient time to expedite the check-in process. Ohne Bereitstellung eines Tokens wird der Rückruf beim nächsten Eincheckversuch weiterhin aufgerufen.If a token is not provided, the callback will still be called at the next check-in attempt.

RegistrierungRegistration

  • Der Einfachheit halber sind die Registrierungsmethoden idempotent. registerAccountForMAM() registriert ein Konto und die App z. B. nur, wenn das Konto noch nicht registriert ist, und unregisterAccountForMAM() hebt die Registrierung eines Kontos nur auf, wenn es derzeit registriert ist.For your convenience, the registration methods are idempotent; for example, registerAccountForMAM()will only register an account and attempt to enroll the app if the account is not already registered, and unregisterAccountForMAM() will only unregister an account if it is currently registered. Nachfolgende Aufrufe sind Leerbefehle, daher ist es nicht schädlich, diese Methoden mehrmals aufzurufen.Subsequent calls are no-ops, so there is no harm in calling these methods more than once. Darüber hinaus wird die Übereinstimmung zwischen Aufrufen dieser Methoden und Benachrichtigungen über Ergebnisse nicht garantiert. Wenn z. B. registerAccountForMAM für eine Identität aufgerufen wird, die bereits registriert ist, wird die Benachrichtigung für diese Identität möglicherweise nicht erneut gesendet.Additionally, correspondence between calls to these methods and notifications of results are not guaranteed: i.e. if registerAccountForMAM is called for an identity that is already registered, the notification may not be sent again for that identity. Es ist möglich, dass Benachrichtigungen gesendet werden, die mit keinem Aufruf dieser Methoden übereinstimmen, da das SDK möglicherweise regelmäßig Registrierungsversuche im Hintergrund durchführt und das Aufheben der Registrierung möglicherweise durch Zurücksetzungsanforderungen ausgelöst wird, die vom Intune-Dienst empfangen wurden.It is possible that notifications are sent that don't correspond to any calls to these methods, since the SDK may periodically try enrollments in the background, and unenrollments may be triggered by wipe requests received from the Intune service.

  • Die Registrierungsmethoden können für eine beliebige Anzahl von unterschiedlichen Identitäten aufgerufen werden, aber derzeit kann nur ein Benutzerkonto erfolgreich registriert sein.The registration methods can be called for any number of different identities, but currently only one user account can become successfully enrolled. Wenn mehrere Benutzerkonten, die für Intune lizenziert und Ziel der App-Schutzrichtlinie sind, zum gleichen oder nahezu dem gleichen Zeitpunkt registriert werden, gibt es keine Garantie dahingehend, welches dieser Benutzerkonten das Rennen macht.If multiple user accounts that are licensed for Intune and targeted by app protection policy are registered at or near the same time, there is no guarantee on which one will win the race.

  • Abschließend können Sie MAMEnrollmentManager abfragen, um zu prüfen, ob ein bestimmtes Konto registriert ist, und um seinen aktuellen Status mithilfe der getRegisteredAccountStatus-Methode abzurufen.Finally, you can query the MAMEnrollmentManager to see if a particular account is registered and to get its current status using the getRegisteredAccountStatus method. Wenn das bereitgestellte Konto nicht registriert ist, gibt diese Methode NULL zurück.If the provided account is not registered, this method will return null. Wenn das Konto registriert ist, gibt diese Methode den Status des Kontos als eines der Elemente der MAMEnrollmentManager.Result-Enumeration zurück.If the account is registered, this method will return the account's status as one of the members of the MAMEnrollmentManager.Result enumeration.

Ergebnis und StatuscodesResult and status codes

Wenn ein Konto erstmalig registriert wird, verfügt es über den Status PENDING, wodurch angegeben wird, dass der erste Registrierungsversuch für den MAM-Dienst unvollständig ist.When an account is first registered, it begins in the PENDING state, indicating that the initial MAM service enrollment attempt is incomplete. Nachdem der Registrierungsversuch abgeschlossen ist, wird eine Benachrichtigung mit einem der Ergebniscodes aus der folgenden Tabelle gesendet.After the enrollment attempt finishes, a notification will be sent with one of the Result codes in the table below. Darüber hinaus gibt die getRegisteredAccountStatus()-Methode den Kontostatus zurück, damit die App immer bestimmen kann, ob der Zugriff für diesen Benutzer auf Unternehmensdaten blockiert ist.In addition, the getRegisteredAccountStatus() method will return the account's status so the app can always determine if access to corporate content is blocked for that user. Wenn bei der Registrierung ein Fehler auftritt, kann der Kontostatus mit der Zeit wechseln, da das SDK die Registrierung im Hintergrund erneut versucht.If the enrollment attempt fails, the account's status may change over time as the SDK retries enrollment in the background.

ErgebniscodeResult code ErläuterungExplanation
AUTHORIZATION_NEEDEDAUTHORIZATION_NEEDED Dieses Ergebnis gibt an, dass von der registrierten MAMServiceAuthenticationCallback-Instanz der App kein Token bereitgestellt wurde oder das bereitgestellte Token war ungültig.This result indicates that a token was not provided by the app’s registered MAMServiceAuthenticationCallback instance, or the provided token was invalid. Die App sollte ein gültiges Token abrufen und updateToken() aufrufen, sofern möglich.The app should acquire a valid token and call updateToken() if possible.
NOT_LICENSEDNOT_LICENSED Der Benutzer ist für Intune nicht lizenziert oder bei dem Versuch, den Kontakt zum Intune MAM-Dienst herzustellen, ist ein Fehler aufgetreten.The user is not licensed for Intune, or the attempt to contact the Intune MAM service failed. Die App sollte in einem nicht verwalteten (normalen) Zustand fortfahren, und der Benutzer sollte nicht blockiert werden.The app should continue in an unmanaged (normal) state and the user should not be blocked. Registrierungen werden für den Fall in regelmäßigen Abständen wiederholt, dass der Benutzer zukünftig über eine Lizenz verfügt.Enrollments will be retried periodically in case the user becomes licensed in the future.
ENROLLMENT_SUCCEEDEDENROLLMENT_SUCCEEDED Der Registrierungsversuch wurde erfolgreich durchgeführt, oder der Benutzer ist bereits registriert.The enrollment attempt succeeded, or the user is already enrolled. Im Falle einer erfolgreichen Registrierung wird vor dieser Benachrichtigung eine Benachrichtigung zur Richtlinienaktualisierung gesendet.In the case of a successful enrollment, a policy refresh notification will be sent before this notification. Der Zugriff auf Unternehmensdaten sollte zugelassen werden.Access to corporate data should be allowed.
ENROLLMENT_FAILEDENROLLMENT_FAILED Fehler beim Registrierungsversuch.The enrollment attempt failed. Weitere Details finden Sie in den Geräteprotokollen.Further details can be found in the device logs. Die App sollte in diesem Zustand nicht den Zugriff auf Unternehmensdaten gestatten, da zuvor ermittelt wurde, dass der Benutzer für Intune lizenziert ist.The app should not allow access to corporate in this state, since it was previously determined that the user is licensed for Intune.
WRONG_USERWRONG_USER Nur ein Benutzer pro Gerät kann eine App mit dem MAM-Dienst registrieren.Only one user per device can enroll an app with the MAM service. Zunächst muss die Registrierung für alle registrierten Apps aufgehoben werden, damit die Registrierung als anderer Benutzer erfolgreich durchgeführt werden kann.In order to enroll successfully as a different user, all enrolled apps must be unenrolled first. Andernfalls muss diese App als primärer Benutzer registriert werden.Otherwise, this app must enroll as the primary user. Diese Überprüfung erfolgt nach der Lizenzprüfung, daher sollte der Zugriff des Benutzers auf Unternehmensdaten blockiert werden, bis die App erfolgreich registriert wurde.This check happens after the license check, so the user should be blocked from accessing corporate data until the app is successfully enrolled.
UNENROLLMENT_SUCCEEDEDUNENROLLMENT_SUCCEEDED Die Aufhebung der Registrierung war erfolgreich.Unenrollment was successful.
UNENROLLMENT_FAILEDUNENROLLMENT_FAILED Fehler bei der Anforderung zur Aufhebung der Registrierung.The unenrollment request failed. Weitere Details finden Sie in den Geräteprotokollen.Further details can be found in the device logs.
PENDING (AUSSTEHEND)PENDING Der anfängliche Registrierungsversuch für den Benutzer wird ausgeführt.The initial enrollment attempt for the user is in progress. Die App kann den Zugriff auf Unternehmensdaten blockieren, bis das Registrierungsergebnis bekannt ist, aber sie ist dazu nicht verpflichtet.The app can block access to corporate data until the enrollment result is known, but is not required to do so.
COMPANY_PORTAL_REQUIREDCOMPANY_PORTAL_REQUIRED Der Benutzer ist für Intune lizenziert, aber die App kann nicht registriert werden, bis die Unternehmensportal-App auf dem Gerät installiert ist.The user is licensed for Intune, but the app cannot be enrolled until the Company Portal app is installed on the device. Das Intune App SDK versucht, den Zugriff auf die App für den angegebenen Benutzer zu blockieren und ihn zur Installation der Unternehmensportal-App zu bewegen (siehe nachfolgende Details).The Intune App SDK will attempt to block access to the app for the given user and direct them to install the Company Portal app (see below for details).

Aufforderung zur Unternehmensportalanforderung außer Kraft setzen (optional)Company Portal requirement prompt override (optional)

Wenn das Ergebnis COMPANY_PORTAL_REQUIRED zurückgegeben wird, blockiert das SDK die Verwendung von Aktivitäten, die die Identität verwenden, für die die Registrierung angefordert wurde.If the COMPANY_PORTAL_REQUIRED Result is received, the SDK will block use of activities that use the identity for which enrollment was requested. Stattdessen führt das SDK dazu, dass diese Aktivitäten eine Aufforderung zum Herunterladen des Unternehmensportals anzeigen.Instead, the SDK will cause those activities to display a prompt to download the Company Portal. Wenn Sie dieses Verhalten in Ihrer App verhindern möchten, können die Aktivitäten MAMActivity.onMAMCompanyPortalRequired implementieren.If you want to prevent this behavior in your app, activities may implement MAMActivity.onMAMCompanyPortalRequired.

Diese Methode wird aufgerufen, bevor das SDK seine standardmäßig blockierende Benutzeroberfläche anzeigt.This method is called before the SDK displays its default blocking UI. Wenn die App die Aktivitätsidentität ändert oder die Registrierung des Benutzers aufhebt, der die Registrierung versucht hat, wird die Aktivität nicht vom SDK blockiert.If the app changes the activity identity or unregisters the user who attempted to enroll, the SDK will not block the activity. In dieser Situation ist es Aufgabe der App, den Verlust von Unternehmensdaten zu vermeiden.In this situation, it is up to the app to avoid leaking corporate data.

BenachrichtigungenNotifications

Es wurde eine neue Art von MAMNotification hinzugefügt, um die App darüber zu informieren, dass die Registrierungsanforderung abgeschlossen ist.A new type of MAMNotification has been added in order to inform the app that the enrollment request has completed. MAMEnrollmentNotification wird über die MAMNotificationReceiver-Schnittstelle empfangen, wie im Abschnitt Registrieren für Benachrichtigungen vom SDK beschrieben.The MAMEnrollmentNotification will be received through the MAMNotificationReceiver interface as described in the Register for notifications from the SDK section.

public interface MAMEnrollmentNotification extends MAMUserNotification {
    MAMEnrollmentManager.Result getEnrollmentResult();
}

Die getEnrollmentResult()-Methode gibt das Ergebnis der Registrierungsanforderung zurück.The getEnrollmentResult() method returns the result of the enrollment request. Da MAMUserNotification von MAMEnrollmentNotification erweitert wird, ist die Identität des Benutzers ebenfalls verfügbar, für den die Registrierung versucht wurde.Since MAMEnrollmentNotification extends MAMUserNotification, the identity of the user for whom the enrollment was attempted is also available. Die App muss die MAMNotificationReceiver-Schnittstelle implementieren, um diese Benachrichtigungen zu erhalten. Dieser Vorgang wird ausführlich im Abschnitt Registrieren für Benachrichtigungen vom SDK beschrieben.The app must implement the MAMNotificationReceiver interface to receive these notifications, detailed in the Register for notifications from the SDK section.

Der Kontostatus für den registrierten Benutzer kann sich ändern, wenn eine Registrierungsbenachrichtigung empfangen wird, aber in einigen Fällen (wenn z. B. eine AUTHORIZATION_NEEDED-Benachrichtigung nach einem informativeren Ergebnis wie WRONG_USER empfangen wird, bleibt das informativere Ergebnis als Kontostatus erhalten) wird der Status nicht geändert.The registered user account's status may change when an enrollment notification is received, but it will not change in some cases (e.g. if AUTHORIZATION_NEEDED notification is received after a more informative result such as WRONG_USER, the more informative result will be maintained as the account's status)

Schutz von SicherungsdatenProtecting Backup data

Seit Android Marshmallow (API 23) bietet Android einer App zwei Möglichkeiten zum Sichern ihrer Daten.As of Android Marshmallow (API 23), Android has two ways for an app to back up its data. Jede Option ist für Ihre App verfügbar und erfordert andere Schritte, um sicherzustellen, dass Intune-Datenschutz ordnungsgemäß implementiert wird.Each option is available to your app and requires different steps to ensure that Intune data protection is correctly implemented. In der folgenden Tabelle können Sie sich einen Überblick über die entsprechenden Aktionen verschaffen, die für ein korrektes Verhalten beim Datenschutz erforderlich sind.You can review the table below on corresponding actions required for correct data protection behavior. Mehr über die Sicherungsmethoden erfahren Sie im Android-API-Handbuch.You can read more about the backup methods in the Android API guide.

Automatische Sicherung für AppsAuto Backup for Apps

Android hat begonnen, automatische vollständige Sicherungen auf Google Drive für Apps auf Android Marshmallow-Geräten unabhängig von der Ziel-API der App anzubieten.Android began offering automatic full backups to Google Drive for apps on Android Marshmallow devices, regardless of the app's target API. Wenn Sie in „AndroidManifest.xml“ explizit für android:allowBackup false festlegen, steht Ihre App niemals für Sicherungen von Android in der Warteschlange, und „Unternehmensdaten“ bleiben innerhalb der App.In your AndroidManifest.xml, if you explicitly set android:allowBackup to false, then your app will never be queued for backups by Android and "corporate" data will stay within the app. In diesem Fall ist keine weitere Aktion erforderlich.In this case, no further action is necessary.

Allerdings ist das android:allowBackup-Attribut standardmäßig auf „true“ festgelegt – auch wenn android:allowBackup nicht in der Manifestdatei angegeben ist.However, by default the android:allowBackup attribute is set to true, even if android:allowBackup isn't specified in the manifest file. Dies bedeutet, dass alle App-Daten automatisch im Google Drive-Konto des Benutzers gesichert werden – ein Standardverhalten, das ein Datenverlustrisiko darstellt.This means all app data is automatically backed up to the user's Google Drive account, a default behavior that poses a data leak risk. Daher erfordert das SDK die unten beschriebenen Änderungen, um sicherzustellen, dass Datenschutz angewendet wird.Therefore, the SDK requires the changes outlined below to ensure that data protection is applied. Es ist wichtig, die folgenden Richtlinien zu befolgen, um Kundendaten angemessen zu schützen, wenn Ihre App auf Android Marshmallow-Geräten ausgeführt werden soll.It is important to follow the guidelines below to protect customer data properly if you want your app to run on Android Marshmallow devices.

Mit Intune können Sie alle Funktionen für automatische Sicherung verwenden, die bei Android verfügbar sind, einschließlich der Möglichkeit, benutzerdefinierte Regeln in XML zu definieren, jedoch müssen Sie die folgenden Schritte befolgen, um Ihre Daten zu sichern:Intune allows you to utilize all the Auto Backup features available from Android, including the ability to define custom rules in XML, but you must follow the steps below to secure your data:

  1. Wenn Ihre App keinen benutzerdefinierten BackupAgent verwendet, verwenden Sie die Standardeinstellung MAMBackupAgent, um automatische vollständige Sicherungen zu ermöglichen, die mit Intune-Richtlinien kompatibel sind.If your app does not use its own custom BackupAgent, use the default MAMBackupAgent to allow for automatic full backups that are Intune policy compliant. In diesem Fall können Sie das Manifestattribut android:fullBackupOnly ignorieren, da es nicht für Ihren Sicherungs-Agent gilt.If you do this, you can ignore the android:fullBackupOnly manifest attribute, as it’s not applicable for our backup agent. Fügen Sie Folgendes in das App-Manifest ein:Place the following in the app manifest:

    android:backupAgent="com.microsoft.intune.mam.client.app.backup.MAMDefaultBackupAgent"
    
  2. [Optional] Wenn Sie einen optionalen benutzerdefinierten BackupAgent implementiert haben, müssen Sie sicherstellen, dass Sie MAMBackupAgent oder MAMBackupAgentHelper verwenden.[Optional] If you implemented an optional custom BackupAgent, you need to make sure to use MAMBackupAgent or MAMBackupAgentHelper. Weitere Informationen finden Sie in den folgenden Abschnitten.See the following sections. Wechseln Sie ggf. zu MAMDefaultFullBackupAgent von Intune (in Schritt 1 beschrieben), der eine einfache Sicherung für Android M und höher bietet.Consider switching to using Intune's MAMDefaultFullBackupAgent (described in step 1) which provides easy back up on Android M and above.

  3. Wenn Sie festlegen, welche Art von vollständiger Sicherung Ihre App erhalten soll (ungefiltert, gefiltert oder keine), müssen Sie das Attribut android:fullBackupContent auf „true“, „false“ oder eine XML-Ressource in Ihrer App festlegen.When you decide which type of full backup your app should receive (unfiltered, filtered, or none) you'll need to set the attribute android:fullBackupContent to true, false, or an XML resource in your app.

  4. Dann müssen Sie das, was Sie in android:fullBackupContent eingefügt haben, in ein Metadatentag namens com.microsoft.intune.mam.FullBackupContent in das Manifest kopieren.Then, you must copy whatever you put into android:fullBackupContent into a metadata tag named com.microsoft.intune.mam.FullBackupContent in the manifest.

    Beispiel 1: Wenn Ihre App vollständige Sicherungen ohne Ausschlüsse erstellen soll, legen Sie sowohl das android:fullBackupContent-Attribut als auch das com.microsoft.intune.mam.FullBackupContent-Metadatentag auf true fest:Example 1: If you want your app to have full backups without exclusions, set both the android:fullBackupContent attribute and com.microsoft.intune.mam.FullBackupContent metadata tag to true:

    android:fullBackupContent="true"
    ...
    <meta-data android:name="com.microsoft.intune.mam.FullBackupContent" android:value="true" />  
    

    Beispiel 2: Wenn Ihre App ihren benutzerdefinierten BackupAgent verwenden und vollständige, zu Intune-Richtlinien konforme, automatische Sicherungen deaktivieren soll, müssen Sie sowohl das Attribut und das Metadatentag auf false festlegen:Example 2: If you want your app to use its custom BackupAgent and opt out of full, Intune policy compliant, automatic backups, you must set the attribute and metadata tag to false:

    android:fullBackupContent="false"
    ...
    <meta-data android:name="com.microsoft.intune.mam.FullBackupContent" android:value="false" />  
    

    Beispiel 3: Wenn Ihre App vollständige Sicherungen gemäß Ihrer in einer XML-Datei definierten benutzerdefinierten Regeln erhalten soll, legen Sie das Attribut und das Metadatentag auf dieselbe XML-Ressource fest:Example 3: If you want your app to have full backups according to your custom rules defined in an XML file, please set the attribute and metadata tag to the same XML resource:

    android:fullBackupContent="@xml/my_scheme"
    ...
    <meta-data android:name="com.microsoft.intune.mam.FullBackupContent" android:resource="@xml/my_scheme" />  
    

Schlüssel/Wert-SicherungKey/Value Backup

Die Option Schlüssel/Wert-Sicherung ist für alle APIs ab Version 8 verfügbar, und sie lädt App-Daten zum Android Backup Service hoch.The Key/Value Backup option is available to all APIs 8+ and uploads app data to the Android Backup Service. Die Datenmenge pro Benutzer Ihrer App ist auf 5 MB beschränkt.The amount of data per user of your app is limited to 5MB. Wenn Sie die Schlüssel/Wert-Sicherung verwenden, müssen Sie BackupAgentHelper oder BackupAgent verwenden.If you use Key/Value Backup, you must use a BackupAgentHelper or a BackupAgent.

BackupAgentHelperBackupAgentHelper

„BackupAgentHelper“ ist einfacher zu implementieren als „BackupAgent“, was systemeigene Android-Funktionalität und Intune MAM-Integration anbelangt.BackupAgentHelper is easier to implement than BackupAgent both in terms of native Android functionality and Intune MAM integration. „BackupAgentHelper“ ermöglicht dem Entwickler, ganze Dateien und gemeinsam genutzte Einstellungen bei FileBackupHelper bzw. SharedPreferencesBackupHelper zu registrieren, die bei Erstellung dann „BackupAgentHelper“ hinzugefügt werden.BackupAgentHelper allows the developer to register entire files and shared preferences to a FileBackupHelper and SharedPreferencesBackupHelper (respectively) which are then added to the BackupAgentHelper upon creation. Führen Sie die nachstehenden Schritte aus, um „BackupAgentHelper“ mit Intune MAM zu verwenden:Follow the steps below to use a BackupAgentHelper with Intune MAM:

  1. Befolgen Sie die Android-Anleitung zum Erweitern von BackupAgentHelper, um die Sicherung mehrerer Identitäten mit „BackupAgentHelper“ zu nutzen.To utilize multi-identity backup with a BackupAgentHelper, follow the Android guide to Extending BackupAgentHelper.

  2. Lassen Sie die MAM-Entsprechung von „BackupAgentHelper“, „FileBackupHelper“ und „SharedPreferencesBackupHelper“ von Ihrer Klasse erweitern.Have your class extend the MAM equivalent of BackupAgentHelper, FileBackupHelper, and SharedPreferencesBackupHelper.

Android-KlasseAndroid class MAM-EntsprechungMAM equivalent
BackupAgentHelperBackupAgentHelper MAMBackupAgentHelperMAMBackupAgentHelper
FileBackupHelperFileBackupHelper MAMFileBackupHelperMAMFileBackupHelper
SharedPreferencesBackupHelperSharedPreferencesBackupHelper MAMSharedPreferencesBackupHelperMAMSharedPreferencesBackupHelper

Das Befolgen dieser Richtlinien führt zu einer erfolgreichen Sicherung und Wiederherstellung mehrerer Identitäten.Following these guidelines will lead to a successful multi-identity backup and restore.

BackupAgentBackupAgent

„BackupAgent“ ermöglicht Ihnen die explizitere Angabe der zu sichernden Daten.A BackupAgent allows you to be much more explicit about what data is backed up. Da der Entwickler maßgeblich für die Implementierung verantwortlich ist, sind weitere Schritte erforderlich, um den ordnungsgemäßen Datenschutz von Intune sicherzustellen.Because the developer is fairly responsible for the implementation, there are more steps required to ensure appropriate data protection from Intune. Da die Arbeit größtenteils von Ihnen als Entwickler zu leisten ist, ist die Intune-Integration etwas komplizierter.Since most of the work is pushed onto you, the developer, Intune integration is slightly more involved.

MAM-Integration:Integrate MAM:

  1. Lesen Sie die Android-Anleitung für die Schlüssel/Wert-Sicherung und insbesondere zum Erweitern von BackupAgent sorgfältig durch, um sicherzustellen, dass Ihre BackupAgent-Implementierung den Android-Richtlinien folgt.Please carefully read the Android guide for Key/Value Backup and specifically Extending BackupAgent to ensure your BackupAgent implementation follows Android guidelines.

  2. Lassen Sie MAMBackupAgent von Ihrer Klasse erweitern.Have your class extend MAMBackupAgent.

Sicherung mehrerer Identitäten:Multi-identity Backup:

  1. Bevor Sie mit der Datensicherung beginnen, prüfen Sie, ob die Sicherung der zu sichernden Dateien oder Datenpuffer in Szenarien mit mehreren Identitäten tatsächlich vom IT-Administrator genehmigt ist.Before beginning your backup, check that the files or data buffers you plan to back up are indeed permitted by the IT administrator to be backed up in multi-identity scenarios. Ihnen wurde die isBackupAllowed-Funktion in MAMFileProtectionManager und MAMDataProtectionManager bereitgestellt, um dies zu ermitteln.We provide you with the isBackupAllowed function in MAMFileProtectionManager and MAMDataProtectionManager to determine this. Wenn die Sicherung der Datei oder des Datenpuffers nicht zulässig ist, sollten Sie sie nicht in Ihre Sicherung einbeziehen.If the file or data buffer is not allowed to be backed up, then you should not continue including it in your backup.

  2. Wenn während der Sicherung die Identitäten der in Schritt 1 überprüften Dateien gesichert werden sollen, müssen Sie backupMAMFileIdentity(BackupDataOutput data, File … files) mit den Dateien aufrufen, aus denen Sie Daten extrahieren möchten.At some point during your backup, if you want to back up the identities for the files you checked in step 1, you must call backupMAMFileIdentity(BackupDataOutput data, File … files) with the files from which you plan to extract data. So werden automatisch neue Sicherungsentitäten für Sie erstellt und in BackupDataOutput geschrieben.This will automatically create new backup entities and write them to the BackupDataOutput for you. Diese Entitäten werden bei der Wiederherstellung automatisch genutzt.These entities will be automatically consumed upon restore.

Wiederherstellung mehrerer Identitäten:Multi-identity Restore:

Die Anleitung zur Datensicherung gibt einen allgemeinen Algorithmus für die Wiederherstellung der Daten Ihrer Anwendung an und stellt im Abschnitt Erweitern von BackupAgent ein Codebeispiel bereit.The Data Backup guide specifies a general algorithm for restoring your application’s data and provides a code sample in the Extending BackupAgent section. Sie müssen der in diesem Codebeispiel bereitgestellten allgemeinen Struktur hinsichtlich der folgenden Punkte besonders aufmerksam folgen, damit die Wiederherstellung mehrerer Identitäten erfolgreich ausgeführt wird:In order to have a successful multi-identity restore, you must follow the general structure provided in this code sample with special attention to the following:

  1. Sie müssen eine while(data.readNextHeader())-Schleife verwenden, um die Sicherungsentitäten zu durchlaufen.You must utilize a while(data.readNextHeader()) loop to go through the backup entities.

  2. Sie müssen data.skipEntityData()* aufrufen, wenn data.getKey()* nicht mit dem Schlüssel übereinstimmt, den Sie in onBackup erstellt haben.You must call data.skipEntityData()* if data.getKey()* does not match the key you wrote in onBackup. Wenn Sie diesen Schritt nicht ausführen, können Ihre Wiederherstellungen möglicherweise nicht erfolgreich durchgeführt werden.Without performing this step, your restores may not succeed.

  3. Vermeiden Sie eine Rückgabe während der Verarbeitung von Sicherungsentitäten im while(data.readNextHeader())-Konstrukt, da die automatisch geschriebenen Entitäten sonst verloren gehen.Avoid returning while consuming backup entities in the while(data.readNextHeader()) construct, as the entities we automatically write will be lost.

  • Dabei gibt data den Namen der lokalen Variablen für BackupDataInput an, die bei der Wiederherstellung an Ihre App übergeben wird.Where data is the local variable name for the BackupDataInput that is passed to your app upon restore.

Mehrere Identitäten (optional)Multi-identity (optional)

ÜbersichtOverview

Standardmäßig wendet das Intune App SDK Richtlinien auf die gesamte App an.By default, the Intune App SDK will apply policy to the app as a whole. Mehrere Identitäten sind ein optionales Feature von Intune zum Schutz von Apps, das aktiviert werden kann, um die identitätsbezogene Anwendung von Richtlinien zu ermöglichen.Multi-identity is an optional Intune app protection feature which can be enabled to allow policy to be applied on a per-identity level. Dies erfordert eine deutlich stärkere Beteiligung der App als andere Features zum Schutz von Apps.This requires significantly more app participation than other app protection features.

Die App muss das SDK informieren, wenn sie die Änderung der aktiven Identität beabsichtigt.The app must inform the SDK when it intends to change the active identity. In einigen Fällen benachrichtigt das SDK seinerseits die App, wenn eine Änderung der Identität erforderlich ist.In some cases, the SDK will also notify the app when an identity change is required. In den meisten Fällen kann MAM jedoch nicht wissen, welche Daten auf der Benutzeroberfläche angezeigt oder in einem Thread zu einem bestimmten Zeitpunkt verwendet werden. So verwendet der Dienst die App, um die korrekte Identität festzulegen, um Datenverlust zu vermeiden.In most cases, however, MAM cannot know what data is being displayed in the UI or used on a thread at a given time and relies on the app to set the correct identity in order to avoid data leak. In den folgenden Abschnitten wird auf einige bestimmte Szenarios hingewiesen, die App-Aktionen erfordern.In the sections that follow, some particular scenarios which require app action will be called out.

Hinweis

Fehlende korrekte App-Teilnahme kann zu Datenverlusten und anderen Sicherheitsproblemen führen.A lack of the correct app participation can result in data leaks and other security issues.

Sobald der Benutzer das Gerät oder die App registriert, registriert das SDK die dabei verwendete Identität und betrachtet sie als die primäre, von Intune verwaltete Identität.Once the user enrolls the device or the app, the SDK registers this identity and considers it the primary Intune managed identity. Andere Benutzer der App werden als nicht verwaltet mit uneingeschränkten Richtlinieneinstellungen behandelt.Other users in the app will be treated as unmanaged, with unrestricted policy settings.

Hinweis

Aktuell wird nur eine von Intune verwaltete Identität pro Gerät unterstützt.Currently, only one Intune managed identity is supported per device.

Beachten Sie, dass eine Identität einfach in Form einer Zeichenfolge definiert wird.Note that an identity is simply defined as a string. Bei Identitäten werden Groß- und Kleinschreibung nicht unterschieden, und Anforderungen einer Identität beim SDK werden möglicherweise nicht mit der gleichen Groß-/Kleinschreibung zurückgegeben, die ursprünglich beim Festlegen der Identität verwendet worden war.Identities are case-insensitive, and requests to the SDK for an identity may not return the same casing that was originally used when setting the identity.

Aktivieren mehrerer IdentitätenEnabling Multi-identity

Standardmäßig werden alle Apps als Einzelidentitäts-Apps betrachtet.By default, all apps are considered to be single-identity apps. Sie können eine App entsprechen deklarieren, dass sie mit mehreren Identitäten kompatibel ist, indem Sie die folgenden Metadaten in die Datei „AndroidManifest.xml“ einfügen.You can declare an app to be multi-identity aware by placing the following metadata in AndroidManifest.xml.

  <meta-data
    android:name="com.microsoft.intune.mam.MAMMultiIdentity"
    android:value="true" />

Festlegen der IdentitätSetting the Identity

Entwickler können die Identität der App-Benutzer auf den folgenden Ebenen mit absteigender Priorität festlegen:Developers can set the identity of the app user on the following levels in descending priority:

  1. ThreadebeneThread level
  2. Context (allgemein Activity)Context (generally Activity) level
  3. ProzessebeneProcess level

Eine auf Threadebene festgelegte Identität hat Vorrang vor einer auf Context-Ebene festgelegten Identität, die wiederum Vorrang vor einer auf Prozessebene festgelegten Identität hat.An identity set at the thread level supersedes an identity set at the Context level, which supersedes an identity set at the process level. Eine in einem Context festgelegte Identität wird nur bei Bedarf in dazugehörigen Szenarios verwendet.An identity set on a Context is only used in appropriate associated scenarios. Datei-E/A-Vorgängen ist z.B. kein Context zugeordnet.File IO operations, for example, do not have an associated Context. Apps werden in den meisten Fällen die Context-Identität für eine Activity festlegen.Most commonly, apps will set the Context identity on an Activity. Eine App darf keine Daten für eine verwaltete Identität anzeigen, es sei denn, die Identität der Activity ist auf die gleiche Identität festgelegt.An app must not display data for a managed identity unless the Activity's identity is set to that same identity. In der Regel ist die Identität auf Prozessebene nur nützlich, wenn die App nur mit einem einzelnen Benutzer auf allen Threads arbeitet.In general, the process-level identity is only useful if the app works only with a single user at a time on all threads. Viele Apps müssen davon nicht Gebrauch machen.Many apps may not need to make use of it.

Die folgenden Methoden in MAMPolicyManager können verwendet werden, um die Identität festzulegen und die zuvor festgelegten Identitätswerte abzurufen.The following methods in MAMPolicyManager may be used to set the identity and retrieve the identity values previously set.

  public static void setUIPolicyIdentity(final Context context, final String identity, final MAMSetUIIdentityCallback mamSetUIIdentityCallback);

  public static String getUIPolicyIdentity(final Context context);

  public static MAMIdentitySwitchResult setProcessIdentity(final String identity);

  public static String getProcessIdentity();

  public static MAMIdentitySwitchResult setCurrentThreadIdentity(final String identity);

  public static String getCurrentThreadIdentity();

  /**
   * Get the currently applicable app policy. Same as
   * MAMComponents.get(AppPolicy.class). This method does
   * not take the context identity into account.
   */
  public static AppPolicy getPolicy();

  /**
  * Get the current app policy. This does NOT take the UI (Context) identity into account.
   * If the current operation has any context (e.g. an Activity) associated with it, use the overload below.
   */
  public static AppPolicy getPolicy(final Context context);


  public static AppPolicy getPolicyForIdentity(final String identity);

  public static boolean getIsIdentityManaged(final String identity);

Hinweis

Sie können die Identität der App durch Festlegung auf NULL löschen.You can clear the identity of the app by setting it to null.

Die leere Zeichenfolge kann als Identität verwendet werden, die niemals App-Schutzrichtlinien aufweist.The empty string may be used as an identity that will never have app protection policy.

ErgebnisseResults

Alle Methoden zum Festlegen der Identität geben über MAMIdentitySwitchResult Ergebniswerte zurück.All the methods used to set the identity report back result values via MAMIdentitySwitchResult. Vier Werte können zurückgegeben werden:There are four values that can be returned:

RückgabewertReturn value SzenarioScenario
SUCCEEDEDSUCCEEDED Die Identitätsänderung war erfolgreich.The identity change was successful.
NOT_ALLOWEDNOT_ALLOWED Die Änderung der Identität ist nicht zulässig.The identity change is not allowed. Die Änderung der Identität ist nicht zulässig.The identity change is not allowed. Dies tritt auch bei dem Versuch auf, die Benutzeroberflächenidentität (Context) festzulegen, wenn für den aktuellen Thread eine andere Identität festgelegt ist.This occurs if an attempt is made to set the UI (Context) identity when a different identity is set on the current thread.
CANCELLEDCANCELLED Der Benutzer hat die Identitätsänderung abgebrochen, in der Regel mithilfe der Schaltfläche „Zurück“ einer PIN- oder Authentifizierungseingabeaufforderung.The user cancelled the identity change, generally by pressing the back button on a PIN or authentication prompt.
FAILEDFAILED Bei der Identitätsänderung ist aus unbekannten Gründen ein Fehler aufgetreten.The identity change failed for an unspecified reason.

Die App muss sicherstellen, dass ein Identitätswechsel erfolgreich ist, bevor Unternehmensdaten angezeigt oder verwendet werden.The app must ensure that an identity switch is successful before displaying or using corporate data. Aktuell sind Prozess- und Threadidentitätswechsel immer für eine App erfolgreich, für die mehrere Identitäten aktiviert sind. Wir behalten und jedoch vor, Fehlerbedingungen hinzuzufügen.Currently, process and thread identity switches will always succeed for a multi-identity-enabled app, however we reserve the right to add failure conditions. Der Identitätswechsel für die Benutzeroberfläche kann möglicherweise für ungültige Argumente fehlschlagen, falls sie mit der Threadidentität in Konflikt stehen oder der Benutzer die bedingten Startanforderungen aufheben würde (z.B. indem er auf die schwarze Schaltfläche auf dem PIN-Bildschirm klicken drückt).The UI identity switch may fail for invalid arguments, if it would conflict with the thread identity, or if the user cancels out of conditional launch requirements (e.g. presses the back button on the PIN screen).

Bei Festlegung einer Context-Identität wird das Ergebnis asynchron gemeldet.In the case of setting a Context identity, the result is reported asynchronously. Wenn der Context eine Activity ist, wird dem SDK erst nach einem bedingten Start, der den Benutzer vielleicht zur Eingabe einer PIN oder seiner Unternehmensanmeldeinformationen auffordert, bekannt, ob die Änderung der Identität erfolgreich war.If the Context is an Activity, the SDK doesn't know if the identity change succeeded until after conditional launch is performed -- which may require the user to enter a PIN or corporate credentials. Es wird vorausgesetzt, dass die App einen MAMSetUIIdentityCallback für den Empfang dieses Ergebnisses implementiert. Sie können NULL für diesen Parameter übergeben.The app is expected to implement a MAMSetUIIdentityCallback to receive this result, you can pass null for this parameter.

    public interface MAMSetUIIdentityCallback {
        void notifyIdentityResult(MAMIdentitySwitchResult identitySwitchResult);
  }

Sie können die Identität einer Activity auch direkt über eine Methode in MAMActivity festlegen, anstatt MAMPolicyManager.setUIPolicyIdentity aufzurufen.You can also set the identity of an activity directly through a method in MAMActivity instead of calling MAMPolicyManager.setUIPolicyIdentity. Verwenden Sie zu diesem Zweck die folgende Methode:Use following method to do so:

     public final void switchMAMIdentity(final String newIdentity);

Apps können auch eine Methode in MAMActivity außer Kraft setzen, wenn die App über das Ergebnis von Versuchen, die Identität dieser Activity zu ändern, benachrichtigt werden soll.You can also override a method in MAMActivity if you want the app to be notified of the result of attempts to change the identity of that activity.

    public void onSwitchMAMIdentityComplete(final MAMIdentitySwitchResult result);

Hinweis

Wechseln der Identität kann das Neuerstellen der Activity erfordern.Switching the identity may require recreating the activity. In diesem Fall wird der onSwitchMAMIdentityComplete-Rückruf an die neue Instanz der Activity übermittelt.In this case, the onSwitchMAMIdentityComplete callback will be delivered to the new instance of the activity.

Implizite IdentitätsänderungenImplicit Identity Changes

Zusätzlich zu der Möglichkeit der App, die Identität festzulegen, kann die Identität eines Threads oder Kontexts sich basierend auf dem Dateneingang von einer anderen Intune-fähigen App ändern, die eine App-Schutzrichtlinie aufweist.In addition to the app's ability to set the identity, a thread or a context's identity may change based on data ingress from another Intune-enlightened app that has app protection policy.

BeispieleExamples

  1. Wenn eine Activity durch einen Intent gestartet wird, der von einer anderen MAM-App gesendet wird, wird die Identität der Activity basierend auf der effektiven Identität in der anderen App zu dem Zeitpunkt, zu dem der Intent gesendet wurde, festgelegt.If an activity is launched from an Intent sent by another MAM app, the activity’s identity will be set based on the effective identity in the other app at the point the Intent was sent.

  2. Für Dienste wird die Identität des Threads ähnlich für die Dauer eines onStart- oder onBind-Aufrufs festgelegt.For services, the thread identity will be set similarly for the duration of an onStart or onBind call. Aufrufe von Binder, die von onBind zurückgegeben werden, legen ebenfalls vorübergehend die Threadidentität fest.Calls into the Binder returned from onBind will also temporarily set the thread identity.

  3. An einen ContentProvider gerichtete Aufrufe legen auf ähnliche Weise die Threadidentität für ihre Dauer fest.Calls into a ContentProvider will similarly set the thread identity for their duration.

Darüber hinaus könnte Benutzerinteraktion mit einer Activity eine implizite Identitätsänderung hervorrufen.In addition, user interaction with an activity may cause an implicit identity switch.

Beispiel: Wenn ein Benutzer während Resume eine Autorisierungsanforderung abbricht, führt dies zu einem impliziten Wechsel zu einer leeren Identität.Example: A user canceling out of an authorization prompt during Resume will result in an implicit switch to an empty identity.

Die App wird auf diese Änderungen aufmerksam gemacht und kann sie verbieten, wenn dies erforderlich ist.The app is given an opportunity to be made aware of these changes, and, if it must, the app can forbid them. MAMService und MAMContentProvider machen die folgende Methode verfügbar, die Unterklassen überschreiben können:MAMService and MAMContentProvider expose the following method that subclasses may override:

public void onMAMIdentitySwitchRequired(final String identity,
  final AppIdentitySwitchResultCallback callback);

In der MAMActivity-Klasse ist ein zusätzlicher Parameter in der Methode vorhanden:In the MAMActivity class , an additional parameter is present in the method:

public void onMAMIdentitySwitchRequired(final String identity,
  final AppIdentitySwitchReason reason,
  final AppIdentitySwitchResultCallback callback);
  • AppIdentitySwitchReason erfasst die Quelle der impliziten Änderung und akzeptiert die Werte CREATE, RESUME_CANCELLED und NEW_INTENT.The AppIdentitySwitchReason captures the source of the implicit switch, and can accept the values CREATE, RESUME_CANCELLED, and NEW_INTENT. Der Grund RESUME_CANCELLED wird verwendet, wenn das Fortsetzen der Activity bewirkt, dass PIN, Authentifizierung oder eine andere Konformitätsbenutzeroberfläche angezeigt wird, und der Benutzer versucht, die Benutzeroberfläche abzubrechen, in der Regel mithilfe der Schaltfläche „Zurück“.The RESUME_CANCELLED reason is used when activity resume causes PIN, authentication, or other compliance UI to be displayed and the user attempts to cancel out of that UI, generally though use of the back button.

  • AppIdentitySwitchResultCallback ist wie folgt:The AppIdentitySwitchResultCallback is as follows:

    public interface AppIdentitySwitchResultCallback {
        /**
         * @param result
         *            whether the identity switch can proceed.
         */
        void reportIdentitySwitchResult(AppIdentitySwitchResult result);
    }
    

    Dabei gibt AppIdentitySwitchResult entweder SUCCESS oder FAILURE an.Where AppIdentitySwitchResult is either SUCCESS or FAILURE.

Die Methode onMAMIdentitySwitchRequired wird für alle impliziten Identitätsänderungen aufgerufen – mit Ausnahme derer, die über einen von MAMService.onMAMBind zurückgegebenen Binder erfolgen.The method onMAMIdentitySwitchRequired is called for all implicit identity changes except for those made through a Binder returned from MAMService.onMAMBind. Die Standardimplementierungen von onMAMIdentitySwitchRequired rufen sofort Folgendes auf:The default implementations of onMAMIdentitySwitchRequired immediately call:

  • reportIdentitySwitchResult(FAILURE), wenn RESUME_CANCELLED der Grund ist.reportIdentitySwitchResult(FAILURE) when the reason is RESUME_CANCELLED.

  • reportIdentitySwitchResult(SUCCESS) in allen anderen Fällen.reportIdentitySwitchResult(SUCCESS) in all other cases.

    Es ist nicht anzunehmen, dass die meisten Apps einen Wechsel der Identität auf andere Weise blockieren oder verzögern müssen, aber wenn dies für eine App erforderlich ist, müssen die folgenden Punkte berücksichtigt werden:It is not expected that most apps will need to block or delay an identity switch in a different manner, but if an app needs to do so, the following points must be considered:

    • Wenn ein Identitätswechsel blockiert wird, ist das Ergebnis identisch mit dem Verbot des Dateneingangs durch die Receive-Freigabeeinstellungen.If an identity switch is blocked, the result is the same as if Receive sharing settings had prohibited the data ingress.

    • Wenn ein Dienst im Hauptthread ausgeführt wird, muss reportIdentitySwitchResult synchron aufgerufen werden. Andernfalls reagiert der UI-Thread nicht mehr.If a Service is running on the main thread, reportIdentitySwitchResult must be called synchronously or the UI thread will hang.

    • Für die Activity-Erstellung wird onMAMIdentitySwitchRequired vor onMAMCreate aufgerufen.For Activity creation, onMAMIdentitySwitchRequired will be called before onMAMCreate. Wenn die App die Benutzeroberfläche anzeigen muss, um zu bestimmen, ob das Wechseln der Identität zugelassen wird, muss die Benutzeroberfläche mit einer anderen Activity angezeigt werden.If the app must show UI to determine whether to allow the identity switch, that UI must be shown using a different activity.

    • Wenn in einer Activity ein Wechsel zu der leeren Identität mit dem Grund RESUME_CANCELLED angefordert wird, muss die App die fortgesetzte Activity ändern, um Daten mit diesem Identitätswechsel konsistent anzuzeigen.In an Activity, when a switch to the empty identity is requested with the reason as RESUME_CANCELLED, the app must modify the resumed activity to display data consistent with that identity switch. Wenn dies nicht möglich ist, sollte die App den Wechsel verweigern, und der Benutzer wird erneut zur Einhaltung der Richtlinie für die Fortsetzung der Identität aufgefordert (z. B. durch Anzeige des PIN-Eingabe-Bildschirms der App).If this is not possible, the app should refuse the switch, and the user will be asked again to comply with policy for the resuming identity (e.g. by being presented with the app PIN entry screen).

      Hinweis

      Eine App mit mehreren Identitäten empfängt eingehende Daten immer von verwalteten und nicht verwalteten Apps.A multi-identity app will always receive incoming data from both managed and unmanaged apps. Es liegt in der Verantwortung der App, Daten von verwalteten Identitäten in einer verwalteten Weise zu behandeln.It is the responsibility of the app to treat data from managed identities in a managed manner.

    Wenn eine angeforderte Identität verwaltet wird (verwenden Sie MAMPolicyManager.getIsIdentityManaged zur Überprüfung), aber die App das Konto nicht verwenden kann (weil z. B. Konten, wie etwa E-Mail-Konten, zunächst in der App eingerichtet werden müssen), sollte das Wechseln der Identität verweigert werden.If a requested identity is managed (use MAMPolicyManager.getIsIdentityManaged to check), but the app is not able to use that account (e.g. because accounts, such as email accounts, must be set up in the app first) then the identity switch should be refused.

DateischutzFile Protection

Jeder Datei wird zum Zeitpunkt der Erstellung basierend auf der Thread- und Prozessidentität eine Identität zugewiesen.Every file has an identity associated with it at the time of creation, based on thread and process identity. Diese Identität wird sowohl für die Dateiverschlüsselung als auch die selektive Zurücksetzung verwendet.This identity will be used for both file encryption and selective wipe. Nur Dateien, deren Identität verwaltet wird und eine Richtlinie aufweist, die Verschlüsselung erfordert, werden verschlüsselt.Only files whose identity is managed and has policy requiring encryption will be encrypted. Die standardmäßige selektive Funktionszurücksetzung des SDK setzt nur Dateien zurück, denen die verwaltete Identität zugeordnet ist, für die eine Zurücksetzung angefordert wurde.The SDK's default selective functionality wipe will only wipe files associated with the managed identity for which a wipe has been requested. Die App kann die Identität einer Datei mit de MAMFileProtectionManager-Klasse abfragen oder ändern.The app may query or change a file’s identity using the MAMFileProtectionManager class.

  public final class MAMFileProtectionManager {
  /**
       * Protect a file. This will synchronously trigger whatever protection is required for the 
         file, and will tag the file for future protection changes.

       *
       * @param identity
       *            Identity to set.
       * @param file
       *            File to protect.
       * @throws IOException
       *             If the file cannot be changed.
       */
      public static void protect(final File file, final String identity) throws IOException;

      /**
      * Protect a file obtained from a content provider. This is intended to be used for
      * sdcard (whether internal or removable) files accessed through the Storage Access Framework.
      * It may also be used with descriptors referring to private files owned by this app.
      * It is not intended to be used for files owned by other apps and such usage will fail. If
      * creating a new file via a content provider exposed by another MAM-integrated app, the new
      * file identity will automatically be set correctly if the ContentResolver in use was
      * obtained via a Context with an identity or if the thread identity is set.
      *
      * This will synchronously trigger whatever protection is required for the file, and will tag
      * the file for future protection changes. If an identity is set on a directory, it is set
      * recursively on all files and subdirectories. If MAM is operating in offline mode, this
      * method will silently do nothing.
      *
      * @param identity
      *       Identity to set.
      * @param file
      *       File to protect.
      *
      * @throws IOException
      *       If the file cannot be protected.

      */
      public static void protect(final ParcelFileDescriptor file, final String identity) throws IOException;

      /**
       * Get the protection info on a file.
       *
       * @param file
       *            File or directory to get information on.
       * @return File protection info, or null if there is no protection info.
       * @throws IOException
       *             If the file cannot be read or opened.
       */
      public static MAMFileProtectionInfo getProtectionInfo(final ParcelFileDescriptor file) throws IOException;

  }

  public interface MAMFileProtectionInfo {
      String getIdentity();
  }

App-VerantwortungApp Responsibility

MAM kann nicht automatisch eine Beziehung zwischen Dateien, die gelesen werden und Daten, die in einer Activity dargestellt werden, ableiten.MAM cannot automatically infer a relationship between files being read and data being displayed in an Activity. Apps müssen die Benutzeroberflächenidentität ordnungsgemäß festlegen, bevor Sie Unternehmensdaten anzeigen.Apps must set the UI identity appropriately before displaying corporate data. Dies beinhaltet Daten, die aus Dateien lesen.This includes data read from files. Wenn eine Datei von außerhalb der App stammt (entweder von einer ContentProvider oder aus einem öffentlich schreibbaren Speicherort), muss die App versuchen, die Dateiidentität (mit MAMFileProtectionManager.getProtectionInfo) zu bestimmen, bevor Sie Informationen anzeigen kann, die aus der Datei gelesen werden.If a file comes from outside the app (either from a ContentProvider or read from a publicly writable location), the app must attempt to determine the file identity (using MAMFileProtectionManager.getProtectionInfo) before displaying information read from the file. Wenn getProtectionInfo eine Identität darstellt, die nicht NULL und nicht leer ist, muss die Benutzeroberflächenidentität festgelegt werden, damit sie mit dieser Identität übereinstimmt (mithilfe von MAMActivity.switchMAMIdentity oder MAMPolicyManager.setUIPolicyIdentity).If getProtectionInfo reports a non-null, non-empty identity, the UI identity must be set to match this identity (using MAMActivity.switchMAMIdentity or MAMPolicyManager.setUIPolicyIdentity). Wenn der Identitätswechsel fehlschlägt, dürfen Daten aus der Datei nicht angezeigt werden.If the identity switch fails, data from the file must not be displayed.

Eine Beispielausführung sollte in etwa folgendermaßen aussehen:An example flow might look something like the following:

  • Der Benutzer wählt ein Dokument aus, das in der App geöffnet werden soll.User selects a document to open in the app
  • Während des Öffnungsvorgangs bestätigt die App die für die Darstellung des Inhalts zu verwendende Identität noch vor dem Lesen von Daten vom Datenträger.During the open flow, prior to reading data from disk, the app confirms the identity that should be used to display the content
    • MAMFileProtectionInfo info = MAMFileProtectionManager.getProtectionInfo(docPath)MAMFileProtectionInfo info = MAMFileProtectionManager.getProtectionInfo(docPath)
    • if(info) MAMPolicyManager.setUIPolicyIdentity(activity, info.getIdentity(), callback)if(info) MAMPolicyManager.setUIPolicyIdentity(activity, info.getIdentity(), callback)
    • Die App wartet, bis ein Ergebnis an den Rückruf gemeldet wird.The app waits until a result is reported to callback
    • Wenn das gemeldete Ergebnis einen Fehler darstellt, zeigt die App das Dokument nicht an.If the reported result is a failure, the app does not display the document.
  • Die App öffnet und rendert die Datei.The app opens and renders the file

OfflineszenariosOffline Scenarios

Die Markierung der Dateiidentität reagiert empfindlich auf den Offlinemodus.File identity tagging is sensitive to offline mode. Die folgenden Punkte müssen berücksichtigt werden:The following points should be taken into account:

  • Wenn das Unternehmensportal nicht installiert ist, kann Dateien keine Identität zugeordnet werden.If the Company Portal is not installed, files cannot be identity-tagged.

  • Wenn das Unternehmensportal installiert ist, aber die App nicht über die Intune MAM-Richtlinie verfügt, kann Dateien nicht zuverlässig eine Identität zugeordnet werden.If the Company Portal is installed, but the app does not have Intune MAM policy, files cannot be reliably tagged with identity.

  • Wenn die Zuordnung der Dateiidentität verfügbar ist, werden alle zuvor erstellte Dateien als persönlich/nicht verwaltet (zur Identität der leeren Zeichenfolge gehörend) behandelt, wenn die App nicht zuvor als verwaltete App mit einzelner Identität installiert wurde. In diesem Fall werden sie als zu dem registrierten Benutzer gehörend behandelt.When file identity tagging becomes available, all previously created files are treated as personal/unmanaged (belonging to the empty-string identity) unless the app was previously installed as a single-identity managed app in which case they are treated as belonging to the enrolled user.

VerzeichnisschutzDirectory Protection

Verzeichnisse können mithilfe derselben protect-Methode geschützt werden, mit der auch Dateien geschützt werden.Directories may be protected using the same protect method used to protect files. Beachten Sie, dass der Verzeichnisschutz rekursiv auf alle Dateien und Unterverzeichnisse angewendet wird, die im Verzeichnis enthalten sind, sowie auf neue Dateien, die in diesem Verzeichnis erstellt werden.Please note that directory protection applies recursively to all files and subdirectories contained in the directory, and to new files created within the directory. Da der Verzeichnisschutz rekursiv angewendet wird, kann der protect-Aufruf bei sehr großen Verzeichnissen einige Zeit dauern.Because directory protection is applied recursively, the protect call can take some time to complete for very large directories. Aus diesem Grund möchten Apps, die Schutz auf ein Verzeichnis anwenden, das eine große Anzahl von Dateien enthält, protect möglicherweise asynchron in einem Hintergrundthread ausführen.For that reason, apps applying protection to a directory that contains a large number of files might wish to run protect asynchronously on a background thread.

Schutz von DatenData Protection

Es ist nicht möglich, eine Datei als zu mehreren Identitäten gehörend zu kennzeichnen.It is not possible to tag a file as belonging to multiple identities. Apps, die zu einem anderen Benutzer gehörende Daten in der gleichen Datei speichern müssen, können dies manuell mit den Features von MAMDataProtectionManager durchführen.Apps that must store data belonging to different users in the same file can do so manually, using the features provided by MAMDataProtectionManager. So kann die App Daten verschlüsseln und sie an einen bestimmten Benutzer binden.This allows the app to encrypt data and tie it to a particular user. Die verschlüsselten Daten eignen sich für die Speicherung in einer Datei auf dem Datenträger.The encrypted data is suitable for storing to disk in a file. Sie können die Daten abfragen, die der Identität zugeordnet, und die Daten können später entschlüsselt werden.You can query the data associated with the identity and the data can be unecrypted later.

Apps, die MAMDataProtectionManager verwenden, sollten einen Empfänger für die MANAGEMENT_REMOVED-Benachrichtigung implementieren.Apps which make use of MAMDataProtectionManager should implement a receiver for the MANAGEMENT_REMOVED notification. Nach Abschluss dieser Benachrichtigung können Puffer, die über diese Klasse geschützt wurden, nicht mehr gelesen werden, wenn beim Schutz der Puffer die Dateiverschlüsselung aktiviert wurde.After this notification completes, buffers which were protected via this class will no longer be readable if file encryption was enabled when the buffers were protected. Eine App kann diese Situation durch Aufrufen von MAMDataProtectionManager.unprotect für alle Puffer während dieser Benachrichtigung beheben.An app can remediate this situation by calling MAMDataProtectionManager.unprotect on all buffers during this notification. Beachten Sie, dass es ebenfalls sicher ist, den Schutz während dieser Benachrichtigung aufzurufen, wenn Identitätsinformationen bewahrt werden sollen. Während der Benachrichtigung ist die Deaktivierung der Verschlüsselung gewährleistet.Note that it is also safe to call protect during this notification if it is desired to preserve identity information -- encryption is guaranteed to be disabled during the notification.


public final class MAMDataProtectionManager {
    /**
     * Protect a stream. This will return a stream containing the protected
     * input.
     *
     * @param identity
     *            Identity to set.
     * @param input
     *            Input data to protect, read sequentially. This function
     *            will change the position of the stream but may not have
     *            read the entire stream by the time it returns. The
     *            returned stream will wrap this one. Calls to read on the
     *            returned stream may cause further reads on the original
     *            input stream. Callers should not expect to read directly
     *            from the input stream after passing it to this method.
     *            Calling close on the returned stream will close this one.
     * @return Protected input data.
     * @throws IOException
     *             If the data could not be protected
     */
    public static InputStream protect(final InputStream input, final String identity);

    /**
     * Protect a byte array. This will return protected bytes.
     *
     * @param identity
     *            Identity to set.
     * @param input
     *            Input data to protect.
     * @return Protected input data.
     * @throws IOException
     *             If the data could not be protected
     */
    public static byte[] protect(final byte[] input, final String identity) throws IOException;

    /**
     * Unprotect a stream. This will return a stream containing the
     * unprotected input.
     *
     * @param input
     *            Input data to protect, read sequentially.
     * @return Protected input data.
     * @throws IOException
     *             If the data could not be unprotected
     */
    public static InputStream unprotect(final InputStream input) throws IOException;

    /**
     * Unprotect a byte array. This will return unprotected bytes.
     *
     * @param input
     *            Input data to protect.
     * @return Protected input data.
     * @throws IOException
     *             If the data could not be unprotected
     */
    public static byte[] unprotect(final byte[] input) throws IOException;

    /**
     * Get the protection info on a stream.
     *
     * @param input
     *            Input stream to get information on. Either this input
     *            stream must have been returned by a previous call to
     *            protect OR input.markSupported() must return true.
     *            Otherwise it will be impossible to get protection info
     *            without advancing the stream position. The stream must be
     *            positioned at the beginning of the protected data.
     * @return Data protection info, or null if there is no protection
     *            info.
     * @throws IOException
     *             If the input cannot be read.
     */
    public static MAMDataProtectionInfo getProtectionInfo(final InputStream input) throws IOException;

    /**
     * Get the protection info on a stream.
     *
     * @param input
     *            Input bytes to get information on. These must be bytes
     *            returned by a previous call to protect() or a copy of
     *            such bytes.
     * @return Data protection info, or null if there is no protection
     *            info.
     * @throws IOException
     *             If the input cannot be read.
     */
    public static MAMDataProtectionInfo getProtectionInfo(final byte[] input) throws IOException;
}

InhaltsanbieterContent Providers

Wenn die App andere Unternehmensdaten als ParcelFileDescriptor über ContentProvider bereitstellen, muss die App die Methode isProvideContentAllowed(String) in MAMContentProvider aufrufen und den Benutzerprinzipalnamen (UPN) der Besitzeridentität für den Inhalt übergeben.If the app provides corporate data other than a ParcelFileDescriptor through a ContentProvider, the app must call the method isProvideContentAllowed(String) in MAMContentProvider, passing the owner identity's UPN (user principal name) for the content. Wenn diese Funktion „false“ zurückgibt, kann der Inhalt vielleicht nicht an den Aufrufer zurückgegeben werden.If this function returns false, the content may not be returned to the caller. Durch einen Inhaltsanbieter zurückgegebene Dateideskriptoren werden automatisch auf Grundlage der Dateiidentität behandelt.File descriptors returned through a content provider are handled automatically based on the file identity.

Selektives ZurücksetzenSelective Wipe

Wenn eine App für die WIPE_USER_DATA-Benachrichtigung registriert wird, genießt sie nicht den Vorteil des Standardverhaltens des SDKs bei der selektiven Zurücksetzung.If an app registers for the WIPE_USER_DATA notification, it will not receive the benefit of the SDK's default selective wipe behavior. Für Apps, die mehrere Identitäten haben können, kann dieser Verlust erheblicher sein, da die selektive Zurücksetzung nach MAM-Standard nur Dateien zurücksetzt, deren Identität das Ziel einer Zurücksetzung ist.For multi-identity aware apps, this loss may be more significant since MAM default selective wipe will wipe only files whose identity is targeted by a wipe.

Wenn eine App, die mehrere Identitäten haben kann, eine selektive Zurücksetzung nach MAM-Standard und die Ausführung eigener Aktionen bei der Zurücksetzung wünscht, sollte sie für WIPE_USER_AUXILIARY_DATA-Benachrichtigungen registriert werden.If a multi-identity aware application wishes MAM default selective wipe to be done and wishes to perform its own actions on wipe, it should register for WIPE_USER_AUXILIARY_DATA notifications. Diese Benachrichtigung wird sofort vom SDK gesendet, bevor es die selektive Zurücksetzung nach MAM-Standard durchführt.This notification will be sent immediately by the SDK before it performs the MAM default selective wipe. Eine App sollte niemals gleichzeitig für WIPE_USER_DATA und WIPE_USER_AUXILIARY_DATA registriert werden.An app should never register for both WIPE_USER_DATA and WIPE_USER_AUXILIARY_DATA.

Aktivieren der MAM-Zielkonfiguration für Ihre Android-Anwendungen (optional)Enabling MAM targeted configuration for your Android applications (optional)

Anwendungsspezifische Schlüssel-wert-Paare können in der Intune-Konsole konfiguriert werden.Application-specific key-value pairs may be configured in the Intune console. Diese Schlüssel-Wert-Paare werden von Intune gar nicht übersetzt, sondern einfach an die App übergeben.These key-value pairs are not interpreted by Intune at all, but are simply passed on to the app. Anwendungen, die eine solche Konfiguration erhalten wollen, verwenden dazu die MAMAppConfigManager- und MAMAppConfig-Klassen.Applications which want to receive such configuration can use the MAMAppConfigManager and MAMAppConfig classes to do so. Wenn mehrere Richtlinie für dieselbe App vorgesehen sind, gibt es womöglich mehrere konfliktverursachende Werte für denselben Schlüssel.If multiple policies are targeted at the same app, there may be multiple conflicting values available for the same key.

BeispielExample

MAMAppConfigManager configManager = MAMComponents.get(MAMAppConfigManager.class);
String identity = "user@contoso.com"
MAMAppConfig appConfig = configManager.getAppConfig(identity);
LOGGER.info("App Config Data = " + (appConfig == null ? "null" : appConfig.getFullData()));
String valueToUse = null;
if (appConfig.hasConflict("foo")) {
    List<String> values = appConfig.getAllStringsForKey("foo");
    for (String value : values) {
        if (isCorrectValue(value)) {
            valueToUse = value;
        }
    }
} else {
    valueToUse = appConfig.getStringForKey("foo", MAMAppConfig.StringQueryType.Any);
}
LOGGER.info("Found value " + valueToUse);

MAMAppConfig-ReferenzMAMAppConfig Reference

public interface MAMAppConfig {
    /**
     * Conflict resolution types for Boolean values.
     */
    enum BooleanQueryType {
        /**
         * In case of conflict, arbitrarily picks one. This is not guaranteed to return the same value every time.
         */
        Any,
        /**
         * In case of conflict, returns true if any of the values are true.
         */
        Or,
        /**
         * In case of conflict, returns false if any of the values are false.
         */
        And
    }

    /**
     * Conflict resolution types for integer and double values.
     */
    enum NumberQueryType {
        /**
         * In case of conflict, arbitrarily picks one. This is not guaranteed to return the same value every time.
         */
        Any,
        /**
         * In case of conflict, returns the minimum Integer.
         */
        Min,
        /**
         * In case of conflict, returns the maximum Integer.
         */
        Max
    }

    /**
     * Conflict resolution types for Strings.
     */
    enum StringQueryType {
        /**
         * In case of conflict, arbitrarily picks one. This is not guaranteed to return the same value every time.
         */
        Any,
        /**
         * In case of conflict, returns the first result ordered alphabetically.
         */
        Min,
        /**
         * In case of conflict, returns the last result ordered alphabetically.
         */
        Max
    }

    /**
     * Retrieve the List of Dictionaries containing all the custom
     *  config data sent by the MAMService. This will return every
     * Application Configuration setting available for this user, one
     *  mapping for each policy applied to the user.
     */
    List<Map<String, String>> getFullData();

    /**
     * Returns true if there is more than one targeted custom config setting for the key provided. 
     */
    boolean hasConflict(String key);

    /**
     * @return a Boolean value for the given key if it can be coerced into a Boolean, or 
     * null if none exists or it cannot be coerced.
     */
    Boolean getBooleanForKey(String key, BooleanQueryType queryType);

    /**
     * @return a Long value for the given key if it can be coerced into a Long, or null if none exists or it cannot be coerced.
     */
    Long getIntegerForKey(String key, NumberQueryType queryType);

    /**
     * @return a Double value for the given key if it can be coerced into a Double, or null if none exists or it cannot be coerced.
     */
    Double getDoubleForKey(String key, NumberQueryType queryType);

    /**
     * @return a String value for the given key, or null if none exists.
     */
    String getStringForKey(String key, StringQueryType queryType);

    /**
     * Like getBooleanForKey except returns all values if multiple are present.
     */
    List<Boolean> getAllBooleansForKey(String key);

    /**
     * Like getIntegerForKey except returns all values if multiple are present.
     */
    List<Long> getAllIntegersForKey(String key);

    /**
     * Like getDoubleForKey except returns all values if multiple are present.
     */
    List<Double> getAllDoublesForKey(String key);

    /**
     * Like getStringForKey except returns all values if multiple are present.
     */
    List<String> getAllStringsForKey(String key);
}

BenachrichtigungNotification

Die App-Konfiguration fügt einen neuen Benachrichtigungstyp hinzu:App config adds a new notification type:

  • REFRESH_APP_CONFIG: Diese Benachrichtigung wird in MAMUserNotification gesendet und informiert die App, dass neue App-Konfigurationsdaten verfügbar sind.REFRESH_APP_CONFIG: This notification is sent in a MAMUserNotification and informs the app that new app config data is available.

Weitere Informationen zu den Funktionen der Graph-API in Bezug auf die MAM-Zielkonfigurationswerte finden Sie unter Graph API Reference MAM Targeted Config (Graph-API-Referenz für MAM-Zielkonfigurationen).For more information about the capabilities of the Graph API with respect to the MAM targeted configuration values, see Graph API Reference MAM Targeted Config.

Weitere Informationen zum Erstellen einer MAM-Zielkonfigurationsrichtlinie für Apps in Android finden Sie im Abschnitt zu MAM-Zielkonfiguration für Apps unter How to use Microsoft Intune app configuration policies for Android (Verwenden von Microsoft Intune-App-Konfigurationsrichtlinien für Android for Work).For more information about how to create a MAM targeted app configuration policy in Android, see the section on MAM targeted app config in How to use Microsoft Intune app configuration policies for Android.

Anpassung von Formatvorlagen und Stil (optional)Style Customization (optional)

Vom MAM SDK generierte Ansichten können visuell angepasst werden, um der App noch genauer zu entsprechen.Views generated by the MAM SDK can be visually customized to more closely match the app in which it is integrated. Sie können primäre, sekundäre und Hintergrundfarben sowie die Größe des App-Logos anpassen.You can customize primary, secondary, and background colors, as well as the size of the app logo. Diese Anpassung von Formatvorlagen und Stil ist optional und es werden Standardwerte verwendet, wenn kein benutzerdefinierter Stil konfiguriert ist.This style customization is optional and defaults will be used if no custom style is configured.

Vorgehensweise beim AnpassenHow to customize

Damit Formatvorlagen- und Stiländerungen auf Intune MAM-Ansichten angewendet werden, müssen Sie zuerst eine XML-Datei für die Außerkraftsetzung von Formatvorlagen und Stil erstellen.In order to have style changes apply to the Intune MAM views, you must first create a style override XML file. Diese Datei sollte im Verzeichnis „/res/xml“ Ihrer App gespeichert werden, und Sie können ihr einen beliebigen Namen zuweisen.This file should be placed in the “/res/xml” directory of your app and you may name it whatever you like. Das folgende Beispiel veranschaulicht das Format, das diese Datei einhalten muss.Below is an example of the format this file needs to follow.

<?xml version="1.0" encoding="utf-8"?>
<styleOverrides>
    <item
        name="foreground_color"
        resource="@color/red"/>
    <item
        name="accent_color"
        resource="@color/blue"/>
    <item
        name="background_color"
        resource="@color/green"/>
    <item
        name="logo_image"
        resource="@drawable/app_logo"/>
</styleOverrides>

Sie müssen bereits in Ihrer App vorhandene Ressourcen wiederverwenden.You must reuse resources that already exist within your app. Sie müssen z. B. die Farbe „Grün“ in der Datei „colors.xml“ definieren und hier darauf verweisen.For example, you must define the color green in the colors.xml file and reference it here. Sie können nicht den hexadezimalen Farbcode „#0000ff“ verwenden.You cannot use the Hex color code “#0000ff." Die maximale Größe für das App-Logo beträgt 110 dip (dp).The maximum size for the app logo is 110 dip (dp). Sie können ein kleineres Logobild verwenden, aber die maximale Größe sorgt für optimale Ansichtsergebnisse.You may use a smaller logo image, but adhering to the maximum size will yield the best looking results. Wenn Sie den Grenzwert von 110 dip überschreiten, wird das Bild herunterskaliert und möglicherweise unscharf angezeigt.If you exceed the 110 dip limit, the image will scale down and possibly cause blurring.

Nachfolgend finden Sie die vollständige Liste der zulässigen Stilattribute, die von ihnen gesteuerten Elemente der Benutzeroberfläche, ihre XML-Elementattributnamen und den Typ der Ressource, der für die einzelnen Attribute erwartet wird.Below is the complete list of allowed style attributes, the UI elements they control, their XML attribute item names, and the type of resource expected for each.

StilattributStyle attribute Betroffene Elemente der BenutzeroberflächeUI elements affected AttributelementnameAttribute item name Erwarteter RessourcentypExpected resource type
HintergrundfarbeBackground color Hintergrundfarbe für PIN-BildschirmPIN screen background color
Füllfarbe für PIN-FeldPIN box fill color
background_colorbackground_color FarbeColor
VordergrundfarbeForeground color VordergrundtextfarbeForeground text color
Rahmen des PIN-Felds im StandardzustandPIN box border in default state
Zeichen (einschließlich verborgener Zeichen) im PIN-Feld, wenn Benutzer eine PIN eingibtCharacters (including obfuscated characters) in PIN box when user enters a PIN
foreground_colorforeground_color FarbeColor
AkzentfarbeAccent color PIN-Feldrahmen (markiert)PIN box border when highlighted
LinksHyperlinks
accent_coloraccent_color FarbeColor
App-LogoApp logo Großes Symbol, das auf dem PIN-Bildschirm der Intune-App angezeigt wirdLarge icon that appears in the Intune app PIN screen logo_imagelogo_image ZeichenbarDrawable

EinschränkungenLimitations

Einschränkungen der DateigrößeFile Size limitations

Bei großen Codebasen, die ohne ProGuard ausgeführt werden, werden die Einschränkungen des Dalvik-Formats für ausführbare Dateien zu einem Problem.For large code bases that run without ProGuard, the limitations of the Dalvik executable file format become an issue. Insbesondere können die folgenden Einschränkungen auftreten:Specifically, the following limitations may occur:

  1. Einschränkung auf 65 KB bei Feldern.The 65K limit on fields.
  2. Einschränkung auf 65 KB bei Methoden.The 65K limit on methods.

Einschränkungen der RichtlinienerzwingungPolicy enforcement limitations

  • Bildschirmaufnahme: Das SDK kann keinen neuen Wert für die Bildschirmaufnahmeeinstellung in "Activities" erzwingen, die bereits "Activity.onCreate" durchlaufen haben.Screen Capture: The SDK is unable to enforce a new screen capture setting value in Activities that have already gone through Activity.onCreate. Dies kann dazu führen, dass für eine gewisse Zeit nach dem Konfigurieren der App zur Deaktivierung von Bildschirmaufnahmen weiterhin Bildschirmaufnahmen erstellt werden können.This can result in a period of time where the app has been configured to disable screenshots but screenshots can still be taken.

  • Verwenden von Inhaltsresolvers: Durch die Intune-Richtlinie zum Übertragen oder Empfangen kann die Verwendung eines Inhaltsresolvers für den Zugriff auf den Inhaltsanbieter in einer anderen App ganz oder teilweise blockiert werden.Using Content Resolvers: The "transfer or receive" Intune policy may block or partially block the use of a content resolver to access the content provider in another app. Dadurch geben ContentResolver-Methoden NULL oder einen Fehlerwert zurück (z. B. gibt openOutputStream bei Blockierung FileNotFoundException zurück).This will cause ContentResolver methods to return null or throw a failure value (e.g. openOutputStream will throw FileNotFoundException if blocked). Die App kann feststellen, ob ein Fehler beim Schreiben von Daten durch einen Inhaltsresolver durch die Richtlinie verursacht wurde (oder würde), indem folgender Aufruf ausgeführt wird:The app can determine whether a failure to write data through a content resolver was caused by policy (or would be caused by policy) by making the call:

    MAMPolicyManager.getPolicy(currentActivity).getIsSaveToLocationAllowed(contentURI);
    

    oder wenn es keine zugehörige Aktivität gibtor if there is no associated activity

    MAMPolicyManager.getPolicy().getIsSaveToLocationAllowed(contentURI);
    

    Im zweiten Fall müssen Apps mit mehreren Identitäten unbedingt die Threadidentität ordnungsgemäß festlegen (oder eine explizite Identität an den getPolicy-Aufruf übergeben).In this second case, multi-identity apps must take care to set the thread identity appropriately (or pass an explicit identity to the getPolicy call).

Exportierte DiensteExported services

Die im Intune App SDK enthaltene Datei „AndroidManifest.xml“ enthält MAMNotificationReceiverService. Dies muss ein exportierter Dienst sein, damit das Unternehmensportal Benachrichtigungen an eine App mit aktiviertem Intune App SDK senden kann.The AndroidManifest.xml file included in the Intune App SDK contains MAMNotificationReceiverService, which must be an exported service to allow the Company Portal to send notifications to an enlightened app. Der Dienst prüft den Aufrufer, um sicherzustellen, dass nur das Unternehmensportal Benachrichtigungen senden kann.The service checks the caller to ensure that only the Company Portal is allowed to send notifications.

Erwartungen des SDK-ConsumersExpectations of the SDK consumer

Das Intune SDK verwaltet des von der Android-API bereitgestellten Vertrag; jedoch ist es möglich, dass aufgrund der Richtlinienerzwingung häufiger Fehlerbedingungen ausgelöst werden.The Intune SDK maintains the contract provided by the Android API, though failure conditions may be triggered more frequently as a result of policy enforcement. Durch diese bewährten Methoden für Android wird die Wahrscheinlichkeit, dass Fehler auftreten, gemindert:These Android best practices will reduce the likelihood of failure:

  • Es besteht die höhere Wahrscheinlichkeit, dass Android SDK-Funktionen, die möglicherweise NULL zurückgeben, jetzt NULL sind.Android SDK functions that may return null have a higher likelihood of being null now. Um Probleme zu minimieren, stellen Sie sicher, dass NULL-Überprüfungen an den richtigen Stellen stattfinden.To minimize issues, ensure that null checks are in the right places.

  • Funktionen, die überprüft werden können, müssen über die zugehörigen MAM-Ersatz-APIs überprüft werden.Features that can be checked for must be checked for through their MAM replacement APIs.

  • Alle abgeleiteten Funktionen müssen an ihre übergeordneten Klassenversionen einen durchgehenden Aufruf ausführen.Any derived functions must call through to their super class versions.

  • Vermeiden Sie eine nicht eindeutige Verwendung von APIs.Avoid use of any API in an ambiguous way. So führt beispielsweise die Verwendung von Activity.startActivityForResult ohne Überprüfung von „requestCode“ zu unerwartetem Verhalten.For example, using Activity.startActivityForResult without checking the requestCode will cause strange behavior.

TelemetrieTelemetry

Das Intune App SDK für Android kontrolliert nicht die Datensammlung über Ihre App.The Intune App SDK for Android does not control data collection from your app. Standardmäßig protokolliert die Unternehmensportal-Anwendung Telemetriedaten.The Company Portal application logs telemetry data by default. Diese Daten werden an Microsoft Intune gesendet.This data is sent to Microsoft Intune. Gemäß der Microsoft-Richtlinie sammeln wir keine personenbezogenen Informationen (PII).As per Microsoft Policy, we do not collect any personally identifiable information (PII).

Hinweis

Wenn Benutzer sich dazu entschließen, diese Daten nicht zu senden, müssen sie die Telemetrie unter „Einstellungen“ in der Unternehmensportal-App deaktivieren.If end users choose not to send this data, they must turn off telemetry under Settings on the Company Portal app. Weitere Informationen finden Sie unter Deaktivieren der Erfassung von Nutzungsdaten durch Microsoft.To learn more, see Turn off Microsoft usage data collection.

  • Alle Bibliotheksprojekte sollten dasselbe "android:package" gemeinsam verwenden, wenn dies möglich ist.All library projects should share the same android:package where possible. Dabei kommt es während der Laufzeit nicht sporadisch zu Fehlern, da es sich um ein reines Problem zur Buildzeit handelt.This will not sporadically fail in run-time; this is purely a build-time problem. Neuere Versionen des Intune App SDKs werden einen Teil der Redundanz beseitigen.Newer versions of the Intune App SDK will remove some of the redundancy.

  • Verwenden Sie die neuesten Android SDK-Buildtools.Use the newest Android SDK build tools.

  • Entfernen Sie alle nicht benötigten und nicht verwendeten Bibliotheken (z. B. „android.support.v4“)Remove all unnecessary and unused libraries (e.g. android.support.v4)