在安卓系统中获取我的电话号码

41

我该如何在Android中获取我的电话号码? 当我使用:

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

并使用:

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

它返回null,为什么?


可能是重复的问题:编程方式获取Android手机的电话号码 - bluish
6个回答

23

根据文档

返回线路1的电话号码字符串,例如GSM手机的MSISDN。如果无法获取,则返回null。

所以你已经做得很好了,但是没有存储电话号码。

如果您得到null,可以显示一些内容,以促使用户自行输入电话号码。


如果电话号码没有存储在SIM卡或设备本身上,那么您无法以其他方式获取它。 - Ben Weiss

11

如果你调用的函数返回null,那么意味着你的电话号码没有在你的联系人列表中注册。

如果你只需要一个唯一的数字而不是电话号码,那么可以使用sim卡的序列号:

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

2
你对此做什么?有没有办法使用SIM卡序列号获取电话号码? - Pere
您所说的“手机未注册电话号码”是什么意思?如何在手机上注册电话号码?请解释一下。 - Ashish Tiwari

9

以下是代码:

在这里回答中提到,使用以下代码:

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

在AndroidManifest.xml文件中,赋予以下权限:
 <uses-permission android:name="android.permission.READ_PHONE_STATE"/> 

请记住,此代码并非总是有效,因为手机号码取决于SIM卡和网络运营商/手机运营商。

另外,尝试在手机-->设置-->关于手机-->手机身份中进行检查。如果您能够在那里查看号码,则从上面的代码获取电话号码的可能性较高。如果无法在设置中查看电话号码,则无法通过此代码获得号码!

建议的解决方法:

  1. 从用户手动输入中获取用户的手机号码。
  2. 通过短信向用户的手机号码发送代码。
  3. 要求用户输入代码以确认电话号码。
  4. 将号码保存在sharedpreference中。

在应用程序首次启动时作为一次性活动执行上述4个步骤。以后,每当需要手机号码时,请使用shared preference中可用的值。


如果手机上有双卡,我如何通过以上代码获取两个手机号码呢?对于单卡,它的工作正常。 - Amrit Chakradhari

2
private String getMyPhoneNumber(){
    TelephonyManager mTelephonyMgr;
    mTelephonyMgr = (TelephonyManager)
        getSystemService(Context.TELEPHONY_SERVICE); 
    return mTelephonyMgr.getLine1Number();
}

private String getMy10DigitPhoneNumber(){
    String s = getMyPhoneNumber();
    return s.substring(2);
}

这个答案和原问题有什么区别? - chhameed
@Robi,你的代码并不是很有用,因为如果你使用“return mTelephonyMgr.getLine1Number();”,当电话号码没有存储在电话上时,它可能会返回null,所以在下一个方法中,“return s.substring(2);”代码将会出错... - Rafael Ruiz Tabares

1
方法1:
TelephonyManager tMgr = (TelephonyManager)mAppContext.getSystemService(Context.TELEPHONY_SERVICE);
String mPhoneNumber = tMgr.getLine1Number();

在下面的权限下

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

方法二:

还有一种方法可以获取您的电话号码,我没有在多个设备上测试过,但上面的代码并不总是有效。

请尝试以下代码:

String main_data[] = {"data1", "is_primary", "data3", "data2", "data1", "is_primary", "photo_uri", "mimetype"};
Object object = getContentResolver().query(Uri.withAppendedPath(android.provider.ContactsContract.Profile.CONTENT_URI, "data"),
        main_data, "mimetype=?",
        new String[]{"vnd.android.cursor.item/phone_v2"},
        "is_primary DESC");
if (object != null) {
    do {
        if (!((Cursor) (object)).moveToNext())
            break;
        String s1 = ((Cursor) (object)).getString(4);
    } while (true);
    ((Cursor) (object)).close();
}

您需要添加这两个权限。

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

希望这有所帮助,谢谢!

0

Robi Code 对我来说很有效,只需加入 if !null 条件,以便电话号码为空时,用户可以自己填写电话号码。

editTextPhoneNumber = (EditText) findViewById(R.id.editTextPhoneNumber);
TelephonyManager tMgr;
tMgr= (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
String mPhoneNumber = tMgr.getLine1Number();
if (mPhoneNumber != null){
editTextPhoneNumber.setText(mPhoneNumber);
}

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