Wrapping support of commonly used app capabilities

The following sections summarize the app capabilities that both the Generation 1 and 2 wrappers support, and the app capabilities supported by only one wrapper or the other.

Generation 1 and Generation 2 support for commonly used app capabilities

The following commonly used app capabilities are supported by both the Generation 1 wrapper and the Generation 2 wrapper:

  • PHONE_STATE, SCREEN_ON, and SCREEN_OFF broadcasts can be received in wrapped apps.
  • URL intents from apps outside the container can be allowed into the container.
  • Apps containing multiple dex files are supported.
  • Badge count APIs (android.intent.action.BADGE_COUNT_UPDATE) are supported.
  • Apps can have as many methods as the system allows.
  • Using the Google Maps API is supported.
  • Using the Google Maps APIs Premium Plan is supported.
  • Wrapping obfuscated code is supported.
  • Using DocumentsProvider APIs are supported.

    For apps wrapped with the Generation 2 wrapper, the app can run but the DocumentsProvider API functionality is not supported.

  • Identifiers in DEX bytecodes can contain characters that are legal in Kotlin or Java.
  • Using a service which extends android.app.job.JobService is supported.
  • Using the javax.xml.parsers.SAXParser.parse() method is supported.
  • Using the com.squareup.okhttp.OkUrlFactory class is supported.
  • Using android.settings.LOCATION_SOURCE_SETTINGS is supported.
  • Using Google Play Services 9.0 APIs is supported.
  • Apps which target Android API levels through 30.
  • The android.support.v4.content.FileProvider API is supported.
  • The android.provider.MediaStore API is supported for media on the device.
  • The android.media.MediaRecorder API is supported with the device’s native media recorder.

    Ivanti recommends calling MediaRecorder.stop() in a thread other than the user interface thread, and showing a progress indicator when stopping the recording. This recommendation is because when the media recorder stops recording, the wrapper encrypts the recording. Therefore, saving the recorded video can be slow, causing a noticeable delay after the device user stops recording. This delay is most noticeable with video recordings when using the Generation 1 wrapper.

  • The android.media.MediaPlayer API is supported with the device’s native media player. Streaming media from a remote source with this API is not supported when using AppTunnel with HTTP/S tunnel or AppTunnel with TCP tunneling.
  • The android.media.MediaMetadataRetriever API is supported with the device’s native media player.
  • The android.speech.RecognizerIntent class is supported for starting an activity with the action ACTION_RECOGNIZE_SPEECH.
  • For Android 12 and later versions, these TextToSpeech class methods are secured by AppConnect:
    • addEarcon (String, File) and addSpeech (String, File) added in API 21
    • addEarcon (String, Uri) and addSpeech (String, Uri) added in API 31
  • The intents android.intent.action.OPEN_DOCUMENT, CREATE_DOCUMENT, and OPEN_DOCUMENT_TREE are supported for OTG USB storage as described in USB OTG support.
  • The <layout> manifest element is supported.
  • The action com.android.camera.action.CROP is supported to share cropped images with non-AppConnect apps. This feature requires setting the key MI_AC_SHARE_CONTENT to True in the Secure App Manager’s AppConnect app configuration in MobileIron Core. This feature is supported only when the Google Photo app is used to crop the image.
  • Using the Crashlytics library is supported by using the wrapping flag -enableCrashlytics. If you are using the AppConnect Wrapping Portal, see The AppConnect wrapping portal. If you are using the AppConnect wrapping tool, see "Selecting wrapping options in the wrapping tool" in Preparing to use the wrapping tool.
  • Using the intent ACTION_MEDIA_SCANNER_SCAN_FILE in a broadcast action to save images into the Android gallery or other media database is supported when the Gallery data loss prevention policy on the Ivanti server is set to allowed.
  • Kotlin coroutines.
  • BlobStoreManager.Session.allowPublicAccess() which, in wrapped apps, behaves like the allowSameSignatureAccess() call. This prevents wrapped apps from providing access to unwrapped apps.

  • Realm Database library.

  • The following ThumbnailUtils deprecated methods are supported: createAudioThumbnail, createImageThumbnail, createVideoThumbnail.

Generation 1 wrapper support for commonly used app capabilities

  • The Generation 1 wrapper supports data encryption only for Java file I/O.
  • The intents android.intent.action.OPEN_DOCUMENT and OPEN_DOCUMENT_TREE are supported for device storage and for SD card storage.

CREATE_DOCUMENT is not supported.

Generation 2 Wrapper support for commonly used app capabilities

The following commonly used app capabilities are supported by only the Generation 2 wrapper:

  • Data Encryption of all file I/O

  • AppTunnel with TCP Tunneling as described in AppTunnel with TCP tunneling.

  • Java Native Interface (JNI) call support:

    • Calling from Java to native code

    • Calling from native code to Java

  • Passing file descriptors with Parcels across processes

  • Calls to Runtime.exec are supported with a special flag. Contact Ivanti Technical Support.

    This will function only if the binary being executed is not performing any direct file I/O.

  • AccountManager APIs getAccounts(), getAccountsByType(), and getAccountsByTypeAndFeatures() are supported.
  • The intents android.intent.action.OPEN_DOCUMENT, CREATE_DOCUMENT, and OPEN_DOCUMENT_TREE are supported for device storage and for SD card storage.
  • Calls (by reflection) to the private method java.lang.Runtime.nativeLoad()
  • Wrapping apps that use 64-bit native libraries (C or C++ libraries)
  • Scoped storage

    See Support for scoped storage.