【问题标题】:Why can't the TelephonyManager get the phone number from the SIM?为什么 TelephonyManager 无法从 SIM 中获取电话号码?
【发布时间】:2011-07-20 08:10:41
【问题描述】:

我使用 TelephonyManager 来执行此操作,您可以访问 TelephonyManager 的方法,如下所示

TelephonyManager telephonyManager = (TelephonyManager)getSystemService(TELEPHONY_SERVICE); 
String number = telephonyManager.getLine1Number();

getLine1Number() 的文档说,如果号码“不可用”,此方法将返回 null,但没有说明号码何时可用。

我还通过将以下内容添加到您的清单中来授予应用程序进行此查询的权限:

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

数字始终为空白或 null...

虽然我也核对了电话,但我可以从那个号码拨打电话(即插入的 SIM 卡号码)

我已经阅读了大量文档,但没有任何帮助我从 sim 中获取电话号码以便在我的应用中使用..

问候,

阿皮特·加格

【问题讨论】:

  • 您无法可靠地获取电话号码。仅当电话号码出现在 SIM 卡上时,使用 telephonyManager.getLine1Number() 才有效。有些 SIM 卡上没有电话号码。在那种情况下,你无法得到它。

标签: android


【解决方案1】:

AFAIK,由于运营商的各种限制,TelephonyManager.getLine1Number() 不可靠。 有一些基于 Java 反射的 hack,但因设备而异,因此这些 hack 毫无用处[至少在支持的模型方面]

但是如果你真的需要的话,有一个合法的逻辑可以找到这个数字。通过短信服务商查询所有短信,获取“收件人”号码。

此技巧的额外好处:1.如果设备中有multi sim,您可以获得所有行号。

缺点:1. 您需要 SMS_READ 权限 [对此感到抱歉] 2.您将获得设备中使用过的所有SIM卡号码。这个问题可以通过一些约束逻辑来最小化,例如时间范围(仅在今天收到或发送短信)等。听听其他人关于如何改进此案例的信息会很有趣。

【讨论】:

    【解决方案2】:

    你应该试试这个

    TelephonyManager phoneManager = (TelephonyManager) 
       getApplicationContext().getSystemService(Context.TELEPHONY_SERVICE);
    String phoneNumber = phoneManager.getLine1Number();
    

    【讨论】:

    • 我也在尝试这个但没有找到确切的解决方案
    猜你喜欢
    • 2019-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-01
    • 1970-01-01
    相关资源
    最近更新 更多