TelephonyManager.getLine1Number() 失败?

问题描述 投票:0回答:7

我想获取Android设备的电话号码。我使用这个代码:

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

在我的手机(HTC Wildfire)上,我无法获取电话号码 - 我得到的只是空字符串。如果我在模拟器上运行代码,通常会显示电话号码。

如果我进入“设置”=>“关于手机”=>“手机身份”->“电话号码”,则电话号码为“未知”。

问题出在哪里?我的 SIM 卡有问题吗?

android phone-number
7个回答
37
投票

我们的项目中也遇到了同样的问题。结论是,这取决于SIM卡。

我们发生了什么:

  • 配备 AT&T SIM 卡的 Galaxy S:可以读取电话号码,设置显示号码
  • 带有欧洲 SIM 卡的同款 Galaxy:无法读取号码并且“设置”中显示“未知”(手机功能正常,只是无法读取号码)

其他论坛也有报道。

最终我们决定向用户询问电话号码。实际上,涉及更多一点:

if( "SIM card present" && "cannot read the cell number") "ask user"; 
。否则我们会一直骚扰没有 SIM 卡的用户。


11
投票

使用 SIM 卡序列号代替电话号码,该序列号始终存在且始终是有效值。

 telephonyManager.getSimSerialNumber();

SIM序列号至少在运营商内是唯一的。所以结合

 telephonyManager.getNetworkOperator();

您将拥有一个国家/地区内订阅者的唯一标识符。

这与

结合
 telephonyManager.getNetworkCountryIso();

您将拥有订阅者的全球唯一标识符。

希望这会有所帮助。

干杯。


5
投票

SIM卡存储电话号码,您可以编辑它。不能说适用于 Android,但在 WM 上您可以轻松编辑存储在 SIM 卡上的电话号码。 当然,这并不意味着您可以随时更改您的电话号码。实际上,您可以自由地在那里写下任何您喜欢的数字,并且程序会相信,这是您的真实数字:)


2
投票

当我将 SIM 卡移至新手机时,有时会发现电话号码未显示在“设置”->“关于手机”->“状态”->“我的电话号码”中。

我的数据点:

  • AT&T Atrix 将全新 SIM 卡放入其中显示“Voice MSISDN Line1 null”。
  • T-Mobile G1 将新 SIM 卡放入其中可正确显示电话号码。
  • T-Mobile G2 将 SIM 卡从我的旧 G1 移至显示“未知”。

1
投票

如果 SIM 卡允许,则可以使用电话号码。 在我们公司我发现只有一张SIM卡,是允许取号的。我正在所有 Android 设备上测试此 SIM 卡。一切都好。 getLine1Number() 没问题。 现在我正在寻找其他 SIM 卡的电话号码。已发送短信到我们的短信服务器或其他Android设备(带有短信处理)


0
投票

我使用的SIM卡只允许数据传输。它不允许打电话。

当我尝试使用

getLine1Number()
获取电话号码时,我得到空字符串。


0
投票

TelephonyManager.getLine1Number() 已从 android tiramisu (13) 中弃用


  1. 使用以下函数在java中获取电话号码

    READ_PHONE_STATE permission required to get phone number

    public static String getPhoneNumber(Context context) {
        // Check for necessary permissions
        if (ContextCompat.checkSelfPermission(context, android.Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) {
            // permission not granted
            return null;
        }
    
        String phoneNumber = null;
    
        try {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
                // For Android 13 and above (Tiramisu)
                SubscriptionManager subscriptionMgr = (SubscriptionManager) context.getSystemService(Context.TELEPHONY_SUBSCRIPTION_SERVICE);
                if (subscriptionMgr != null) {
                    phoneNumber = subscriptionMgr.getPhoneNumber(SubscriptionManager.DEFAULT_SUBSCRIPTION_ID);
                }
            } else {
                // For devices below Android 13
                TelephonyManager phoneMgr = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
                if (phoneMgr != null) {
                    phoneNumber = phoneMgr.getLine1Number();
                }
            }
        } catch (SecurityException e) { // Handle permission related errors
            e.printStackTrace();
        } catch (Exception e) { // Handle any other exceptions
            e.printStackTrace();
        }
    
        // Remove any leading "+" from phone number if it's present
        if (phoneNumber != null) {
            phoneNumber = phoneNumber.replace("+", "");
        }
    
        // Return the phone number if it's available, otherwise return null
        return !TextUtils.isEmpty(phoneNumber) ? phoneNumber : null;
    }
    
© www.soinside.com 2019 - 2024. All rights reserved.