以编程方式获取电话号码 - Android

19

能否通过编程方式获取每个设备的电话号码?我尝试了这段代码:

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

这在一些供应商上可以正常工作。不幸的是,它并不适用于每个供应商。因此,我正在寻找一个诀窍或解决方法来获取设备的电话号码。是否有解决方案,或者因为号码没有存储在sim卡上而不可能实现?


你好,你找到了所有运营商的电话号码解决方案吗?能否请你与我分享一下你的解决方案?谢谢。 - Gangadhar Nimballi
我可以告诉你这是不可能的。有些供应商不会在SIM卡上存储电话号码。因此,您可以要求用户输入电话号码,并通过短信和BroadcastReceiver进行验证。这是我找到的唯一替代方案。 - JavaForAndroid
可能是重复的问题:编程方式获取Android手机的电话号码 - bluish
3个回答

18

您正在使用的方法是SDK中唯一完成此操作的一部分,并且仅适用于在SIM卡上存储号码的设备,这只有一些运营商才支持。对于所有其他运营商,您将不得不要求用户手动输入电话号码,因为号码根本没有存储在可以检索它的设备上。


我猜这个数字不会被记录在日志中(例如作为短信发送者)吧? - JavaForAndroid
@JavaForAndroid 不,它不是。 - Raghav Sood
1
请参阅以下内容以获取更广泛的讨论:https://dev59.com/bnE95IYBdhLWcg3wDpgG#bJ2cEYcBWogLw_1bsHOQ - AlikElzin-kilaka

0

现在获取电话号码不需要任何权限,可以使用Play Services API而无需权限和黑客技巧。来源完整示例。

build.gradle(需要10.2.x及更高版本):

compile "com.google.android.gms:play-services-auth:$gms_version"

在您的活动中(代码已简化):

输入图像描述

@Override
protected void onCreate(Bundle savedInstanceState) {
// ...
googleApiClient = new GoogleApiClient.Builder(this)
        .addApi(Auth.CREDENTIALS_API)
        .build();
requestPhoneNumber(result -> {
    phoneET.setText(result);
});
}

public void requestPhoneNumber(SimpleCallback<String> callback) {
phoneNumberCallback = callback;
HintRequest hintRequest = new HintRequest.Builder()
        .setPhoneNumberIdentifierSupported(true)
        .build();

PendingIntent intent = Auth.CredentialsApi.getHintPickerIntent(googleApiClient, 
hintRequest);
try {
    startIntentSenderForResult(intent.getIntentSender(), PHONE_NUMBER_RC, null, 
0, 0, 0);
} catch (IntentSender.SendIntentException e) {
    Logs.e(TAG, "Could not start hint picker Intent", e);
}
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == PHONE_NUMBER_RC) {
    if (resultCode == RESULT_OK) {
        Credential cred = data.getParcelableExtra(Credential.EXTRA_KEY);
        if (phoneNumberCallback != null){
            phoneNumberCallback.onSuccess(cred.getId());
        }
    }
    phoneNumberCallback = null;
}
}

0

你可以尝试向ISP发送特定的短信。 例如,在北京,当你向10001发送短信“501”时,你将在收到的消息中得到你的电话号码。 然后,你只需要知道如何发送短信并注册BroadcastReceiver来接收消息。


@Billa Dec 是的~~ - Zhou Hongbo

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