Delphi fmx 获取安卓硬件信息

 

 

//以为下 Delphi fmx 获取安卓硬件信息全源码
unit fMain;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes,
  System.Variants, System.Permissions, FMX.DialogService,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.ScrollBox,
  FMX.Memo, FMX.Layouts, FMX.Controls.Presentation, FMX.StdCtrls,
  System.DateUtils;

type
  TFormMain = class(TForm)
    Button1: TButton;
    Layout1: TLayout;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    //安卓高版本需要动态申请权限  以下这部分
    FPermissionPHONE_STATE, FPermissionPHONE_NUMBERS: string;
    procedure DisplayRationale(Sender: TObject; const APermissions: TArray<string>; const APostRationaleProc: TProc);
    procedure TakePicturePermissionRequestResult(Sender: TObject;  const APermissions: TArray<string>; const AGrantResults: TArray<TPermissionStatus>);
  public
  end;

var
  FormMain: TFormMain;

implementation

uses
  Androidapi.Helpers,
  FMX.Helpers.Android,
  FMX.Platform,
  FMX.Platform.Android,
  Androidapi.JNI.GraphicsContentViewText,
  Androidapi.JNI.JavaTypes,
  Androidapi.JNI.Os,
  Androidapi.JNI.Telephony,
  Androidapi.JNI.Net,
  Androidapi.JNI,  Androidapi.JNI.Provider,
  Androidapi.JNIBridge;

{$R *.fmx}

procedure TFormMain.Button1Click(Sender: TObject);
var
  TelephonyManager: JTelephonyManager;
  TelephonyServiceNative: JObject;
  vSharedPreferences: JSharedPreferences;
  vSubscriptionManager: JSubscriptionManager;
  vSubscriptionInfo:JSubscriptionInfo;
  vPhoneCount: Integer;
  vSubManagerCoun: Integer;
  Idx: Integer;
begin
  Memo1.BeginUpdate;
  Memo1.Lines.Clear;
  try
    // 无线电固件版本
    Memo1.Lines.Add('无线电固件版本:' + JStringToString(TJBuild.JavaClass.getRadioVersion));
    Memo1.Lines.Add('Serial:' + JStringToString(TJBuild.JavaClass.getSerial));
    // 设备基板名称
    Memo1.Lines.Add('设备基板名称:' + JStringToString(TJBuild.JavaClass.BOARD));
    // 系统启动程序版本
    Memo1.Lines.Add('系统启动程序版本:' + JStringToString(TJBuild.JavaClass.BOOTLOADER));
    // 系统定制商
    Memo1.Lines.Add('设备品牌:' + JStringToString(TJBuild.JavaClass.BRAND));
    // cpu指令集
    Memo1.Lines.Add('cpu指令集:' + JStringToString(TJBuild.JavaClass.CPU_ABI));
    // cpu指令集2
    Memo1.Lines.Add('cpu指令集2:' + JStringToString(TJBuild.JavaClass.CPU_ABI2));
    // 设备驱动名称
    Memo1.Lines.Add('设备驱动名称:' + JStringToString(TJBuild.JavaClass.DEVICE));
    // 设备显示的版本包(在系统设置中显示为版本号)和ID一样
    Memo1.Lines.Add('显示屏参数:' + JStringToString(TJBuild.JavaClass.DISPLAY));
    // 设备的唯一标识。由设备的多个信息拼接合成。 注意,这个码不是唯一 码
    Memo1.Lines.Add('硬件识别码:' +JStringToString(TJBuild.JavaClass.FINGERPRINT));
    // 硬件名称
    Memo1.Lines.Add('硬件名称:' + JStringToString(TJBuild.JavaClass.HARDWARE));
    // 设备主机地址
    Memo1.Lines.Add('设备主机地址:' + JStringToString(TJBuild.JavaClass.HOST));
    // 设备版本号
    Memo1.Lines.Add('设备版本号:' + JStringToString(TJBuild.JavaClass.ID));
    // 设备制造商
    Memo1.Lines.Add('设备制造商:' + JStringToString(TJBuild.JavaClass.MANUFACTURER));
    // 手机型号(MI XXX)
    Memo1.Lines.Add('手机型号(MI XXX):' + JStringToString(TJBuild.JavaClass.MODEL));
    // 整个产品的名称
    Memo1.Lines.Add('整个产品的名称:' + JStringToString(TJBuild.JavaClass.PRODUCT));
    // 收音机
    Memo1.Lines.Add('收音机:' + JStringToString(TJBuild.JavaClass.RADIO));
    // 硬件序列号
    Memo1.Lines.Add('硬件序列号:' + JStringToString(TJBuild.JavaClass.SERIAL));
    // 编译的标签
    Memo1.Lines.Add('编译的标签:' + JStringToString(TJBuild.JavaClass.TAGS));
    // 编译时间
    Memo1.Lines.Add('编译时间:' +FormatDateTime('YYYY-MM--DD HH:nn:ss',IncMilliSecond(StrToDate('1970-01-01'), TJBuild.JavaClass.TIME)));
    // 编译类型  设备版本类型 主要为"user" 或"eng".
    Memo1.Lines.Add('编译类型:' + JStringToString(TJBuild.JavaClass.&TYPE));
    // 设备未知信息
    Memo1.Lines.Add('设备未知信息:' + JStringToString(TJBuild.JavaClass.UNKNOWN));
    // 设备用户名 基本上都为android-build
    Memo1.Lines.Add('设备用户名:' + JStringToString(TJBuild.JavaClass.USER));
    // Android 设备的CPU类型
    Memo1.Lines.Add('支持的ABI: ');
    for Idx := 0 to TJBuild.JavaClass.SUPPORTED_ABIS.Length-1 do begin
      Memo1.Lines.Add('---'+ JStringToString(TJBuild.JavaClass.SUPPORTED_ABIS[Idx]));
    end;
    Memo1.Lines.Add('支持的ABI SUPPORTED_32_BIT_ABIS: ');
    for Idx := 0 to TJBuild.JavaClass.SUPPORTED_32_BIT_ABIS.Length-1 do begin
      Memo1.Lines.Add('---'+ JStringToString(TJBuild.JavaClass.SUPPORTED_32_BIT_ABIS[Idx]));
    end;
    Memo1.Lines.Add('支持的ABI SUPPORTED_64_BIT_ABIS: ');
    for Idx := 0 to TJBuild.JavaClass.SUPPORTED_64_BIT_ABIS.Length-1 do begin
      Memo1.Lines.Add('---'+ JStringToString(TJBuild.JavaClass.SUPPORTED_64_BIT_ABIS[Idx]));
    end;

    Memo1.Lines.Add('BASE_OS:' + JStringToString(TJBuild_VERSION.JavaClass.BASE_OS));
    // 当前开发代号 当前的系统开发代号,一般使用REL代替
    Memo1.Lines.Add('当前开发代号:' + JStringToString(TJBuild_VERSION.JavaClass.CODENAME));
    // 源码控制版本号  系统源代码控制值,一个数字或者git hash值
    Memo1.Lines.Add('源码控制版本号:' + JStringToString(TJBuild_VERSION.JavaClass.INCREMENTAL));
    Memo1.Lines.Add('PREVIEW_SDK_INT:'+TJBuild_VERSION.JavaClass.PREVIEW_SDK_INT.ToString);
    // 系统版本字符串。如4.1.2 或2.2 或2.3等
    Memo1.Lines.Add('系统版本:' + JStringToString(TJBuild_VERSION.JavaClass.RELEASE));
    Memo1.Lines.Add('SDK:' + JStringToString(TJBuild_VERSION.JavaClass.SDK));
    // 系统的API级别 数字表示
    Memo1.Lines.Add('系统的API级别:' + TJBuild_VERSION.JavaClass.SDK_INT.ToString);
    Memo1.Lines.Add('SECURITY_PATCH:' + JStringToString(TJBuild_VERSION.JavaClass.SECURITY_PATCH));


    { ===========以下获取方式不同=========================== }
    TelephonyServiceNative := TAndroidHelper.Context.getSystemService(TJContext.JavaClass.TELEPHONY_SERVICE);
    if Assigned(TelephonyServiceNative) then begin
      Memo1.Lines.Add('======================');
      try
        TelephonyManager := TJTelephonyManager.Wrap((TelephonyServiceNative as ILocalObject).GetObjectID);
        // 手机卡槽数
        vPhoneCount := TelephonyManager.getPhoneCount;
        Memo1.Lines.Add('卡槽数:' + vPhoneCount.ToString);
        // 插卡数
        vSubscriptionManager := TJSubscriptionManager.JavaClass.from(TAndroidHelper.Context);
        vSubManagerCoun := vSubscriptionManager.getActiveSubscriptionInfoCount();
        Memo1.Lines.Add('插卡数:' + vSubManagerCoun.ToString);
        // 硬件ID
        Memo1.Lines.Add('DeviceId_1:' + JStringToString(TelephonyManager.getDeviceId(0)));
        if vPhoneCount > 1 then begin
          Memo1.Lines.Add('DeviceId_2:' +JStringToString(TelephonyManager.getDeviceId(1)));
        end;
        // 硬件Imei
        Memo1.Lines.Add('Imei_1:' + JStringToString(TelephonyManager.getImei(0)));
        if vPhoneCount > 1 then begin
          Memo1.Lines.Add('Imei_2:' + JStringToString(TelephonyManager.getImei(1)));
        end;
        // 硬件Meid
        try
          Memo1.Lines.Add('Meid_1:' + JStringToString(TelephonyManager.getMeid(0)));
        except
          on E: Exception do begin
            Memo1.Lines.Add('Meid_1获取失败: '+e.Message);
          end;
        end;
        try
          if vPhoneCount > 1 then begin
            Memo1.Lines.Add('Meid_2:' + JStringToString(TelephonyManager.getMeid(1)));
          end;
        except
          on E: Exception do begin
            Memo1.Lines.Add('Meid_2获取失败: '+e.Message);
          end;
        end;
        // SubscriberId
        Memo1.Lines.Add('SubscriberId(IMSI号):' +JStringToString(TelephonyManager.getSubscriberId));
        // Line1Number
        Memo1.Lines.Add('Line1Number:' + JStringToString(TelephonyManager.getLine1Number));
        // 分别取各卡槽信息
        for Idx := 0 to vSubManagerCoun-1 do begin
          vSubscriptionInfo:=vSubscriptionManager.getActiveSubscriptionInfo(Idx+1);
          Memo1.Lines.Add(Idx.ToString+'手机号: ' + JStringToString(vSubscriptionInfo.getNumber));
          Memo1.Lines.Add(Idx.ToString+'使用卡槽: ' + (vSubscriptionInfo.getSimSlotIndex+1).ToString);
          Memo1.Lines.Add(Idx.ToString+'运营商: ' + JCharSequenceToStr(vSubscriptionInfo.getCarrierName));
        end;
      except
      end;
    end;
  finally
    Memo1.EndUpdate;
  end;
end;

procedure TFormMain.DisplayRationale(Sender: TObject; const APermissions: TArray<string>; const APostRationaleProc: TProc);
var
  I: Integer;
  RationaleMsg: string;
begin
  RationaleMsg := '需要具备:';
  for I := 0 to High(APermissions) do begin
    if APermissions[I] = FPermissionPHONE_STATE then begin
      RationaleMsg := RationaleMsg + '电话状态权限' + SLineBreak + SLineBreak;
    end
    else if APermissions[I] = FPermissionPHONE_NUMBERS then begin
      RationaleMsg := RationaleMsg + '读手机号权限' + SLineBreak + SLineBreak;
    end;
  end;
  // 显示提示
  TDialogService.ShowMessage(RationaleMsg,
                              procedure(const AResult: TModalResult)
                              begin
                                APostRationaleProc;
                              end);
end;

procedure TFormMain.FormCreate(Sender: TObject);
begin
  FormatSettings.ShortDateFormat:='yyyy-mm-dd';
  FormatSettings.DateSeparator:='-';
end;

procedure TFormMain.FormShow(Sender: TObject);
begin
  //根据系统版本判断是否需要动态权限
  if (TJBuild_VERSION.JavaClass.SDK_INT >=  23) then begin
    // 定义动态申请电话状态权限
    FPermissionPHONE_STATE  := JStringToString(TJManifest_permission.JavaClass.READ_PHONE_STATE);
    FPermissionPHONE_NUMBERS:= JStringToString(TJManifest_permission.JavaClass.READ_PHONE_NUMBERS);
    // 判断是否已有权限
    if not((PermissionsService.IsPermissionGranted(FPermissionPHONE_STATE))and(PermissionsService.IsPermissionGranted(FPermissionPHONE_NUMBERS)))then begin
      //动态申请权限
      PermissionsService.RequestPermissions([FPermissionPHONE_STATE, FPermissionPHONE_NUMBERS]
                                            ,TakePicturePermissionRequestResult
                                            ,DisplayRationale);
    end;
  end;
end;

procedure TFormMain.TakePicturePermissionRequestResult(Sender: TObject; const APermissions: TArray<string>; const AGrantResults: TArray<TPermissionStatus>);
begin
  if(Length(AGrantResults)=2)
  and(AGrantResults[0]=TPermissionStatus.Granted)
  and(AGrantResults[1]=TPermissionStatus.Granted)then begin
    TDialogService.ShowMessage('权限申请成功');
  end else begin
    TDialogService.ShowMessage('权限申请未通过');
  end;
end;

end.

// 来源出处:https://blog.csdn.net/tanqth/article/details/104779089

 

 

获取安卓机器码

{$IFDEF Android}
function GetAndroidID(): string;
var
  JObj: JObject;
  JTM: JTelephonyManager;
begin
  JObj := SharedActivityContext.getSystemService(TJContext.JavaClass.TELEPHONY_SERVICE);
  if JObj<>nil then begin
    JTM := TJTelephonyManager.Wrap( (JObj as ILocalObject).GetObjectID );
    if JTM <> nil then begin
      Result:= JStringToString(JTM.getDeviceId);
    end;
  end;
  if Result = '' then begin
    Result:= JStringToString(TJSettings_Secure.JavaClass.getString(SharedActivity.getContentResolver,  TJSettings_Secure.JavaClass.ANDROID_ID));
  end;
end;
{$ENDIF}

procedure TForm1.FormShow(Sender: TObject);
var
  AStr:string;
begin
  //使用之前,要动态获取权限
  AStr := JStringToString(TJManifest_permission.JavaClass.READ_PHONE_STATE);
  PermissionsService.RequestPermissions([AStr], nil, nil);
end;

 

 

添加新评论

纯文本

  • 不允许使用HTML标签。
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。
请输入图片中的字符,不区分大小写