我如何通过编程方式获得正在运行我的android应用程序的设备的电话号码?


当前回答

这个问题没有保证的解决方案,因为电话号码不是物理地存储在所有sim卡上,也不是从网络广播到电话上。在一些需要物理地址验证的国家尤其如此,只有在验证之后才会分配号码。电话号码分配是在网络上进行的,并且可以在不改变SIM卡或设备的情况下进行更改(例如,这就是支持移植的方式)。

我知道这很痛苦,但最有可能的最好的解决方案是让用户输入一次他/她的电话号码并存储它。

其他回答

一点小小的贡献。在我的例子中,代码启动了一个错误异常。我需要把一个注释,为代码运行和修复这个问题。这里我让这段代码。

public static String getLineNumberPhone(Context scenario) {
    TelephonyManager tMgr = (TelephonyManager) scenario.getSystemService(Context.TELEPHONY_SERVICE);
    @SuppressLint("MissingPermission") String mPhoneNumber = tMgr.getLine1Number();
    return mPhoneNumber;
}

只是想在以上回答中对以上解释做一点补充。这也会为其他人节省时间。

在我的情况下,这个方法没有返回任何手机号码,返回一个空字符串。这是由于我把我的号码移植到新的sim卡上的情况。所以如果我进入设置>关于电话>状态>我的电话号码,它显示我“未知”。

虽然你可以有多个语音信箱帐号,但当你用自己的号码打电话时,运营商会把你转到语音信箱。因此,telephonymanager。getvoicemailnumber()或telephonymanager。getcompletevoicemailnumber(),这取决于你需要的风格。

希望这能有所帮助。

我注意到有几个回复都发了同样的东西。首先,从2021年开始,onActivityResult已弃用。下面是不弃用的解决方案。

private fun requestHint() {

    val hintRequest = HintRequest.Builder()
        .setPhoneNumberIdentifierSupported(true)
        .build()

    val intent = Credentials.getClient(this).getHintPickerIntent(hintRequest)
    val intentSender = IntentSenderRequest.Builder(intent.intentSender).build()

    val resultLauncher = registerForActivityResult(
        ActivityResultContracts.StartIntentSenderForResult()
    ) { result ->
        if (result.resultCode == Activity.RESULT_OK) {
            val credential: Credential? = result.data?.getParcelableExtra(Credential.EXTRA_KEY)
            // Phone number with country code
            Log.i("mTag", "Selected phone No: ${credential?.id}")
        }
    }
    resultLauncher.launch(intentSender)
}

注意:虽然很多人认为这可以让你检索用户的手机号码。通常情况并非如此。谷歌播放服务缓存了几个电话号码,有时对话框显示电话号码,其中不属于用户。

一个重要的导入。com.google.android.gms.auth.api.credentials.Credential

参考文档提供了详细信息,但代码有些不推荐。

首先,获取用户的手机号码是违反道德政策的,以前是可能的,但现在根据我的研究,没有可靠的解决方案,通过使用一些代码,有可能获得手机号码,但不能保证可能只在少数设备上工作。经过大量的研究,我发现只有三个解决方案,但他们不是在所有设备工作。

有以下原因,为什么我们没有得到。

1.Android设备和新的Sim卡没有存储手机号码,如果手机号码在设备和Sim卡中都不可用,那么如何获得号码,如果任何旧的Sim卡有手机号码,那么使用Telephony manager我们可以获得号码,否则它将返回“null”或“”或“??????”

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

 TelephonyManager tel= (TelephonyManager)this.getSystemService(Context.
            TELEPHONY_SERVICE);
    String PhoneNumber =  tel.getLine1Number();

注:-我已经在以下设备Moto x,三星Tab 4,三星S4, Nexus 5和红米2 prime上测试了这个解决方案,但它并不是每一个都有效 Time返回空字符串,所以结论是没有用的

此方法仅适用于红米2 ',但为此需要添加 读取清单中的联系人权限。

注意:-这也不是保证和有效的解决方案,我已经在许多设备上测试了这个解决方案,但它只在红米2撇中工作 哪个是双卡设备它给了我两个手机号码第一个是 正确,但第二个不属于我的第二个模拟,它属于 我的一些旧sim卡,我没有使用。

 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");
    String s1="";
    if (object != null) {
        do {
            if (!((Cursor) (object)).moveToNext())
                break;
            // This is the phoneNumber
             s1 =s1+"---"+ ((Cursor) (object)).getString(4);
        } while (true);
        ((Cursor) (object)).close();
    }

在我的研究中,我发现之前使用WhatsApp账户可以获得手机号码,但现在新的WhatsApp版本不存储用户的手机号码。

结论:Android没有任何可靠的解决方案 用户的手机号码。 建议:- 1。如果你想验证用户的手机号码,请问 用户提供他的号码,使用otp可以验证。 如果你想识别用户的设备,你可以很容易地获得设备IMEI号。