Here is a code snippet which gets the Android device IMEI for you using the Android JNI. The IMEI (International Mobile Equipment Identity) is a unique device ID separate from your SIM card. Accessing the IMEI also requires that your app has the READ_PHONE_STATE permission to be able to access it. I’m not sure who wrote the original example code but on the Embarcadero forum Remy Lebeau posted this code snippet in October of 2013. Here is the full permission line for the Android manifest:
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
And here is the code snippet:
Androidapi.JNI.Telephony, Androidapi.JNI.Provider ,
Androidapi.JNIBridge, Androidapi.JNI.GraphicsContentViewText ,
obj := SharedActivityContext.getSystemService(TJContext.JavaClass.TELEPHONY_SERVICE);
if obj <> nil then
tm := TJTelephonyManager.Wrap( (obj as ILocalObject).GetObjectID );
if tm <> nil then
identifier := JStringToString(tm.getDeviceId);
if identifier = '' then
identifier := JStringToString(TJSettings_Secure.JavaClass.getString(SharedActivity.getContentResolver,
There are also two other blog posts with slightly different code for retrieving the IMEI on Android with Delphi XE5 Firemonkey here and here.
Head over to the Embercadero forum to read the full thread about getting the IMEI on Android.
How can I do the same on IOS?
Apple doesn’t allow getting the IMEI anymore.
Thank you, this works perfectly.
Thank you, this works perfectly. I’ve use this for find getNetworkOperatorName and getSimSerialNumber, but I can find also in iOS?
Apple has disallowed collecting the IMEI. Better off just generating a GUID and saving it for re-use in the app on IOS. Yes, you will lose it if they uninstall though.
I am creating an App for Public Administration who has the need to find legally on customers, there is some other information that I can find? or then give me an example similar to this article on something like that?