【问题标题】:Delphi FMX Android app Get device phone numberDelphi FMX And​​roid app 获取设备电话号码
【发布时间】:2016-09-29 08:35:02
【问题描述】:

我需要获取运行我的应用程序的设备的电话号码。如果设备有两张 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;

【问题讨论】:

  • 我编辑了问题并添加了一些我尝试但它不起作用的代码

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


【解决方案1】:

根据其他系统服务的经验,应该这样做。这将翻译您建议的可行 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;

【讨论】:

  • 要访问任何 SIM 卡上的号码,您需要像这样翻译代码:stackoverflow.com/a/37292604/2817399
  • 使用中缺少一些东西:未声明的标识符:'TJContext'
  • 修改使用条款
  • 现在它是可编译和可运行的,但它只返回空字符串。
  • 但是TelephonyManager类的其他函数给出了一些结果,哪里有问题?我需要可靠的功能来获取电话号码,因为我的应用程序中的帐户固定为用户电话号码
猜你喜欢
  • 1970-01-01
  • 2017-08-21
  • 1970-01-01
  • 2019-02-15
  • 2023-01-17
  • 1970-01-01
  • 2015-11-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多