The sample application to accompany this post can be found at https://github.com/darryncampbell/EMDK-DeviceIdentifiers-Sample. This article was updated on 19th April to reflect the behaviour on Android 11
To obtain the serial number or IMEI without using StageNow (using EMDK Profile Manager instead), please see this article instead.
Android 10 limited access to device identifiers for all apps running on the platform regardless of their target API level. As explained in the docs for Android 10 privacy changes this includes the serial number, IMEI and some other identifiable information.
Zebra mobile computers running Android 10 are able to access both the serial number and IMEI however applications need to be explicitly granted the ability to do so and use a proprietary API.
To access the serial number and IMEI file on Zebra Android devices running Android 10 or higher, first declare a new permission in your AndroidManifest.xml
Then use the MX access manager to allow your application to call the service identifiers associated with the serial number and IMEI
The MX access manager settings to enable this are as follows:
- Service Access Action: "AllowCaller" (or 'Allow Caller to Call Service')
Service Identifier: For the serial number use content://oem_info/oem.zebra.secure/build_serial. For the IMEI use content://oem_info/wan/imei. If you want to allow your app access to both, you will need to declare two different instances of the AccessManager.
Caller Package Name: Your package name, in the case of the sample it is com.zebra.emdk_deviceidentifiers_sample.
- Caller Signature: The signing certificate of your application. For more information on generating this see https://developer.zebra.com/blog/generating-package-signature-use-mx.
You can apply the MX access manager settings in one of three ways:
- Via StageNow
- Via your EMM
- Via your application, using the EMDK Profile Manager.
For example, StageNow will look as follows to enable access to the serial number:
You can then run this sample app and should see something like the below:
Or, on a device that does not have WAN capabilities, i.e. no SIM card or data connection:
If you failed to correctly allow your application access to oem_info service, you will see an error stating so against each property you did not assign access to, as shown below:
Assign access via MX and re-run the application.
Changes to Package visibility in Android 11
Applications targeting SDK 30 (Android 11) will need to confirm to the package visibility filtering on Android as described in the Android documentation at https://developer.android.com/training/package-visibility and https://developer.android.com/training/package-visibility
To grant visility by authority, add the following to your manifest:
<queries> <provider android:authorities="oem_info" /> </queries>