Rummaged on the Internet, there is no single answer for offline applications. Everywhere, as @metalurgus said, you need to identify the user via the Internet.
But decided so
implementation {$IFDEF ANDROID} uses androidapi.JNI.JavaTypes, Androidapi.Helpers, androidapi.JNI.Os; {$ENDIF} {$R *.fmx} {$R *.LgXhdpiPh.fmx ANDROID} {$IFDEF ANDROID} procedure TDeviceInfoForm.btnGetDeviceInfoClick(Sender: TObject); begin ListBox2.Items.Add(Format('Device Type: %s', [JStringToString(TJBuild.JavaClass.MODEL)])); ListBox2.Items.Add(Format('getRadioVersion: %s', [JStringToString(TJBuild.JavaClass.getRadioVersion)])); ListBox2.Items.Add(Format('BOARD: %s', [JStringToString(TJBuild.JavaClass.BOARD)])); ListBox2.Items.Add(Format('BOOTLOADER: %s', [JStringToString(TJBuild.JavaClass.BOOTLOADER)])); ListBox2.Items.Add(Format('BRAND: %s', [JStringToString(TJBuild.JavaClass.BRAND)])); ListBox2.Items.Add(Format('CPU_ABI: %s', [JStringToString(TJBuild.JavaClass.CPU_ABI)])); ListBox2.Items.Add(Format('CPU_ABI2: %s', [JStringToString(TJBuild.JavaClass.CPU_ABI2)])); ListBox2.Items.Add(Format('DEVICE: %s', [JStringToString(TJBuild.JavaClass.DEVICE)])); ListBox2.Items.Add(Format('DISPLAY: %s', [JStringToString(TJBuild.JavaClass.DISPLAY)])); ListBox2.Items.Add(Format('FINGERPRINT: %s', [JStringToString(TJBuild.JavaClass.FINGERPRINT)])); ListBox2.Items.Add(Format('HARDWARE: %s', [JStringToString(TJBuild.JavaClass.HARDWARE)])); ListBox2.Items.Add(Format('HOST: %s', [JStringToString(TJBuild.JavaClass.HOST)])); ListBox2.Items.Add(Format('ID: %s', [JStringToString(TJBuild.JavaClass.ID)])); ListBox2.Items.Add(Format('MANUFACTURER: %s', [JStringToString(TJBuild.JavaClass.MANUFACTURER)])); ListBox2.Items.Add(Format('MODEL: %s', [JStringToString(TJBuild.JavaClass.MODEL)])); ListBox2.Items.Add(Format('PRODUCT: %s', [JStringToString(TJBuild.JavaClass.PRODUCT)])); ListBox2.Items.Add(Format('RADIO: %s', [JStringToString(TJBuild.JavaClass.RADIO)])); ListBox2.Items.Add(Format('SERIAL: %s', [JStringToString(TJBuild.JavaClass.SERIAL)])); ListBox2.Items.Add(Format('TAGS: %s', [JStringToString(TJBuild.JavaClass.TAGS)])); ListBox2.Items.Add(Format('TIME: %s', [IntToStr(TJBuild.JavaClass.TIME)])); ListBox2.Items.Add(Format('&TYPE: %s', [JStringToString(TJBuild.JavaClass.&TYPE)])); ListBox2.Items.Add(Format('UNKNOWN: %s', [JStringToString(TJBuild.JavaClass.UNKNOWN)])); ListBox2.Items.Add(Format('USER: %s', [JStringToString(TJBuild.JavaClass.USER)])); ListBox2.Items.Add(Format('CODENAME: %s', [JStringToString(TJBuild_VERSION.JavaClass.CODENAME)])); ListBox2.Items.Add(Format('INCREMENTAL: %s', [JStringToString(TJBuild_VERSION.JavaClass.INCREMENTAL)])); ListBox2.Items.Add(Format('RELEASE: %s', [JStringToString(TJBuild_VERSION.JavaClass.RELEASE)])); ListBox2.Items.Add(Format('SDK: %s', [JStringToString(TJBuild_VERSION.JavaClass.SDK)])); ListBox2.Items.Add(Format('SDK_INT: %s', [IntToStr(TJBuild_VERSION.JavaClass.SDK_INT)])); end; {$ENDIF}
there are fields like SERIAL, DISPLAY, MODEL, RELEASE.
How to get IMEI
phone
uses androidapi.JNI.Telephony, androidapi.JNI.Provider, androidapi.JNIBridge, androidapi.JNI.GraphicsContentViewText, FMX.Helpers.Android; ... var obj: JObject; tm: JTelephonyManager; identifier: String; begin obj := SharedActivityContext.getSystemService (TJContext.JavaClass.TELEPHONY_SERVICE); if obj <> nil then begin tm := TJTelephonyManager.Wrap((obj as ILocalObject).GetObjectID); if tm <> nil then identifier := JStringToString(tm.getDeviceId); end; ListBox2.Items.Add('identifier 1: '+identifier); if identifier = '' then identifier := JStringToString(TJSettings_Secure.JavaClass.getString (SharedActivity.getContentResolver, TJSettings_Secure.JavaClass.ANDROID_ID)); ListBox2.Items.Add('identifier 2: '+identifier); end;
I decided to use them and create a key. then register via SMS who have no internet.
I took the code from here for IMEI from here
Thanks, @kami, for the advice. codes received, but according to the policy of this site code must be answered.