19

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

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

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

4

3 回答 3

17

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

于 2013-06-25T11:38:56.553 回答
0

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

于 2017-12-21T13:13:00.083 回答
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;
}
}
于 2019-03-30T16:21:33.677 回答