【问题标题】:Is there a stable way of getting the phone number on an Android device?有没有一种稳定的方法可以在 Android 设备上获取电话号码?
【发布时间】:2019-06-20 08:00:28
【问题描述】:

我正在寻找一种可行且未被弃用的解决方案,用于在任何 Android 手机上获取电话号码。

我已经尝试了在 StackOverflow 上找到的不同方法,但大多数都不起作用,因为大多数都是从设备信息中读取电话号码。我的设备和许多其他设备没有存储在 SIM 卡中的号码,因此在使用该方法时,它会返回 null 或空字符串。

是否有其他方法可以获取电话号码,例如使用您登录的 Google 帐户并检查是否有与之关联的号码或来自 Whatsapp 的号码?

我已经尝试过的东西。

IList<string> numeri = new List<string>();

//RETURNS THE NUMBER ON EMULATOR, NOTHING ON MY DEVICE
TelephonyManager telephonyManager = Application.Context.GetSystemService(TelephonyService) as TelephonyManager;
numeri.Add(telephonyManager.Line1Number);


//RETURNS THE NUMBER ON EMULATOR, NOTHING ON MY DEVICE
SubscriptionManager subscriptionManager = (SubscriptionManager)GetSystemService(TelephonySubscriptionService);
IList<SubscriptionInfo> subsInfoList = subscriptionManager.ActiveSubscriptionInfoList;

foreach (SubscriptionInfo item in subsInfoList) {
    numeri.Add(item.Number);
}


//ACCOUNTS ARRAY IS EMPTY ON EMULATOR AND MY DEVICE
Java.Util.Regex.Pattern pattern = Patterns.Phone;
Account[] accounts = AccountManager.Get(this).GetAccounts();
foreach (Account account in accounts) {
    if (pattern.Matcher(account.Name).Matches()) {
        numeri.Add(account.Name);
    }
} 

我希望有人可以帮助我解决这个问题。谢谢。

编辑

我决定使用设备的 IMEI,对于我需要做的事情,我不一定需要电话号码。

TelephonyManager telephonyManager = Application.Context.GetSystemService(TelephonyService) as TelephonyManager;
string IMEIDevice = telephonyManager.Imei;

编辑以删除可能的重复消息。谢谢大家。

【问题讨论】:

  • 提示用户输入,以防他们不想让你拥有它?
  • 我已经考虑过让用户输入他的电话号码,但我想要一种更自动化的方法。对于权限,应用程序会询问您是否要授予该权限,因此用户没有义务向我提供他的号码。最后一件事,它是我公司的内部应用程序,电话号码将用于向特定用户发送自定义通知。
  • 现在我正在尝试从联系人列表中获取电话号码,因为在大多数手机上都有一个“我”联系人,但我认为它不会总是有效,因为它不是有必要设置该联系人,以便用户可以将其留空...

标签: c# xamarin.android


【解决方案1】:

你可以试试傻逼代码:

TelephonyManager tMgr = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);

        String MyPhoneNumber = "0000000000";

        try
        {
            MyPhoneNumber = tMgr.getLine1Number();
        }
        catch (NullPointerException ex)
        {
        }

        if (MyPhoneNumber.equals(""))
        {
            MyPhoneNumber = tMgr.getSubscriberId();
        }

情况如下:

getLine1Number() Returns blank, not null

【讨论】:

  • 感谢您的建议,我决定使用 IMEI,因为我希望每个设备都具有相同的标识符,而此解决方案将数字和 IMEI 混合在一起。顺便说一句,这是一个聪明的解决方案。
【解决方案2】:

我决定使用设备的 IMEI,对于我需要做的事情,我不一定需要电话号码。

TelephonyManager telephonyManager = Application.Context.GetSystemService(TelephonyService) as TelephonyManager;
string IMEIDevice = telephonyManager.Imei;

如果你们中的某些人向我展示了另一种获取号码的方法,可能是读取 SIM 卡的芯片(?),请告诉我。谢谢。

【讨论】:

    【解决方案3】:

    发件人:Programmatically obtain the phone number of the Android phone

    答案是

    代码:

    TelephonyManager tMgr =(TelephonyManager)mAppContext.getSystemService(Context.TELEPHONY_SERVICE);
    String mPhoneNumber = tMgr.getLine1Number();
    

    所需权限:

    <uses-permission android:name="android.permission.READ_PHONE_STATE"/> 
    

    【讨论】:

    • 是的,我知道这种方法。问题是我的设备和其他设备在设备信息中保存的号码设置为“未知”。因此,当调用此方法时,它会返回 null 或空字符串,即使我的 SIM 卡号码有效。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-07
    • 2019-01-26
    • 1970-01-01
    • 1970-01-01
    • 2015-11-07
    • 2012-03-20
    • 2017-08-21
    相关资源
    最近更新 更多