如何在安卓系统中获取当前SIM卡的号码?

47

我想在Android中获取用户手机号码。我使用了这段代码,但是没有得到号码。

TelephonyManager tm = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE); 
        String n = tm.getLine1Number();

权限:

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

在安卓手机中,保存手机号码是必须的吗?设置 --> 关于手机 --> 状态 --> 我的电话号码

你有什么想法吗?


你是否拥有READ_PHONE_STATE权限? - 323go
uses-permission android:name="android.permission.READ_PHONE_STATE"/> 使用权限 android:name="android.permission.READ_PHONE_STATE"/> - Nirav Ranpara
1
@Madhavi:这取决于设备。所以请确保您没有使用任何双卡或中国设备? - ρяσѕρєя K
这是一个常见问题......有些设备返回号码,有些则没有(可能是它们没有电话应用程序)。以下是一个好的算法,可能对你有用 https://dev59.com/Tm435IYBdhLWcg3w7ksK#5134725 - Pankaj Kumar
可能是重复的问题:在Android中以编程方式获取电话号码 - SztupY
@Madhavi,请查看我的答案,它将解决你的问题。 - Dipak Keshariya
5个回答

31

我认为sim卡序列号和sim卡号码是唯一的。您可以尝试使用以下代码获取sim卡序列号和sim卡号码,但不要忘记在清单文件中添加权限。

TelephonyManager telemamanger = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
String getSimSerialNumber = telemamanger.getSimSerialNumber();
String getSimNumber = telemamanger.getLine1Number();

并将以下权限添加到您的Androidmanifest.xml文件中。

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

如有问题,请告知。


我写了上面的代码,但我的SIM卡号为空。那么我该怎么办? - Dilan Sanjaya
假设我更换带有相同电话号码的新SIM卡,我是否会得到相同的SIM序列号? - NandaKumar
在所有设备中获取空值。 - Developers Park
getSimSerialNumber() 函数返回一个包含供应商信息等内容的字符串。如果您想获取纯 SIM 序列号,您需要获取最后 14 个数字。 - Kingalione
SIM卡号不唯一,因为此方法无法返回具有SIM卡的所有设备的SIM卡号。 - user924

10

获取电话号码、IMEI和SIM卡ID

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

使用getSimSerialNumber()获取SIM卡信息。

    //---get the SIM card ID---
    String simID = tm.getSimSerialNumber();
    if (simID != null)
        Toast.makeText(this, "SIM card ID: " + simID, 
        Toast.LENGTH_LONG).show();

您手机的电话号码,使用getLine1Number()方法获取(某些设备可能无法返回电话号码)

    //---get the phone number---
    String telNumber = tm.getLine1Number();
    if (telNumber != null)        
        Toast.makeText(this, "Phone number: " + telNumber, 
        Toast.LENGTH_LONG).show();

手机的IMEI号码,请使用getDeviceId()方法

    //---get the IMEI number---
    String IMEI = tm.getDeviceId();
    if (IMEI != null)        
        Toast.makeText(this, "IMEI number: " + IMEI, 
        Toast.LENGTH_LONG).show();

需要权限

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

这需要运行时权限吗?谢谢。 - Bitwise DEVS

5
更新:由于Whatsapp停止公开电话号码作为账户名称,因此此答案不再可用,请忽略此答案。
=================================================================================
现在已经过去了将近6个月,我认为应该更新一下,提供另一种你可能想要考虑的替代解决方案。
截至今天,你可以通过使用AccountManager来依赖另一个大型应用程序Whatsapp。数百万设备已安装了此应用程序,如果您无法通过TelephonyManager获得电话号码,则可以尝试使用这种方法。
权限:
<uses-permission android:name="android.permission.GET_ACCOUNTS" />

代码:

AccountManager am = AccountManager.get(this);
Account[] accounts = am.getAccounts();

ArrayList<String> googleAccounts = new ArrayList<String>();
for (Account ac : accounts) {
    String acname = ac.name;
    String actype = ac.type;
    // Take your time to look at all available accounts
    System.out.println("Accounts : " + acname + ", " + actype);
}

检查 WhatsApp 帐户的账户类型

if(actype.equals("com.whatsapp")){
    String phoneNumber = ac.name;
}

当然,如果用户没有安装Whatsapp,您可能无法理解它,但无论如何都值得一试。 并且请记住,您应该始终要求用户确认。

它返回应用程序的名称而不是数字。 - Ravi Bhandari
Viber(不是WhatsApp)将电话号码添加到名称字段中! - xnagyg

2
您的所有内容都是正确的,但问题出在 getLine1Number() 函数上。

getLine1Number() - 此方法返回线路1的电话号码字符串,即GSM手机的MSISDN。如果不可用,则返回null。

此方法仅适用于部分手机而非所有手机。

因此,如果您需要根据sim卡执行操作(除了打电话),则应使用 getSimSerialNumber()。它始终是唯一的有效的,并且它总是存在的


-20
你可以使用TelephonyManager来实现这个功能:
TelephonyManager t = (TelephonyManager)getSystemService(TELEPHONY_SERVICE); 
String number = t.getLine1Number();

你使用过吗

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

7
请仔细阅读问题描述,不要只看标题就回答。 - Sahil Mahajan Mj
1
这在我的情况下至少不起作用。它返回空字符串。我在安卓4.4的Nexus 4和4.2.2的Galaxy Grand上进行了测试。 - Suresh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接