Delphi FMX And​​roid app获取设备电话号码

时间:2016-09-29 08:35:02

标签: android delphi firemonkey phone-number sim-card

我需要获取运行应用程序的设备的电话号码。如果设备有两个SIM卡是理想的两个数字卡或没有插入SIM卡(平板电脑设备)可以检测到这一点。

我找到了一些JAVA代码,但我不知道如何将它翻译成Delphi

TelephonyManager phneMgr = (TelephonyManager)mAppContext.getSystemService(Context.TELEPHONY_SERVICE);
String phneNmbr = phneMgr.getLine1Number();

我尝试写一些东西,但它没有用......

USES  Androidapi.Helpers,  Androidapi.JNI.JavaTypes, Androidapi.JNI.Telephony;

procedure TForm1.Button1Click(Sender: TObject);
var
  num: JString;
  tman: Androidapi.JNI.Telephony.JTelephonyManager;
begin
  tman:=TJtelephonyManager.Create;
  num := tman.getLine1Number;
  edit1.Text:=Jstringtostring(num);
end;

1 个答案:

答案 0 :(得分:0)

根据其他系统服务的经验,这样的事情应该这样做。这可以翻译您所建议的可行的Java代码。

我将编辑它以使其正确编译(如果它有任何问题)当我稍后提供Delphi的副本时,但这大致是需要的。

请注意,快速查看the telephony manager documentation并不能轻易说明如何获取第二张SIM卡的电话号码,但它确实可以翻译您尝试翻译的内容。

uses
  System.SysUtils,
  Androidapi.Helpers,
  Androidapi.JNI.GraphicsContentViewText,
  Androidapi.JNI.JavaTypes,
  Androidapi.JNI.Telephony;

function DeviceTelephoneNumber: string;
var
  TelephonyManagerObj: JObject;
  TelephonyManager: JTelephonyManager;
begin
  TelephonyManagerObj:= TAndroidHelper.Context.getSystemService(
    TJContext.JavaClass.TELEPHONY_SERVICE);
  if TelephonyManagerObj <> nil then
  begin
    TelephonyManager := TJTelephonyManager.Wrap(TelephonyManagerObj);
    if TelephonyManager <> nil then
      Result := JStringToString(TelephonyManager.getLine1Number);
  end;
end;

此代码也是可能的,适用于Android 5.1及更高版本。

function DeviceTelephoneNumbers: TArray<string>;
var
  SubscriptionManager: JSubscriptionManager;
  I, SubscriptionInfoCount: Integer;
  SubscriptionInfoList: JList;
  SubscriptionInfo: JSubscriptionInfo;
begin
  // Subscription manager is only available in Android 5.1 and later
  if TOSVersion.Check(5, 1) then
  begin
    SubscriptionManager := TJSubscriptionManager.JavaClass.from(
      TAndroidHelper.Context);
    SubscriptionInfoCount := SubscriptionManager.getActiveSubscriptionInfoCount;
    SubscriptionInfoList := SubscriptionManager.getActiveSubscriptionInfoList;
    SetLength(Result, SubscriptionInfoCount);
    for I := 0 to Pred(SubscriptionInfoCount) do
    begin
      SubscriptionInfo := TJSubscriptionInfo.Wrap(SubscriptionInfoList.get(I));
      if SubscriptionInfo <> nil then
        Result[I] := JStringToString(SubscriptionInfo.getNumber);
    end;
  end
  else
  begin
    // If running on older OS, use older API
    SetLength(Result, SubscriptionInfoCount);
    Result[0] := DeviceTelephoneNumber
  end;
end;