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

时间:2013-06-25 11:37:18

标签: android phone-number

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

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

这适用于某些提供商。不幸的是,它不适用于每个提供商。所以我正在寻找一个技巧或解决方法来获得设备的电话号码。有解决方案还是不可能,因为这个号码没有存储在SIM卡上?

3 个答案:

答案 0 :(得分:16)

您使用的方法是SDK中唯一可以执行此操作的部分,并且仅适用于SIM卡上存储号码的设备,而只有部分运营商才会这样做。对于所有其他运营商,您必须要求用户手动输入电话号码,因为该号码不会存储在设备的任何位置,您可以从中检索它。

答案 1 :(得分:0)

您可以尝试向ISP发送特定的短信。 例如,在北京(中国),当您发送短信" 501"到10001,您将在收到的消息中获得您的电话号码。 然后,您只需要知道如何发送SMS并注册BroadcastReceiver以接收消息。

答案 2 :(得分:0)

现在不需要任何许可来获取电话号码 未经许可和黑客使用Play Services API。 SourceFull example.

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

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

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

enter image description here

@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;
}
}