Получить номер телефона программно - Android

Можно ли программно получить номер телефона каждого устройства? Я попробовал этот код:

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

Это отлично работает с некоторыми поставщиками. К сожалению, это не работает с каждым провайдером. Так что я ищу трюк или обойти, чтобы получить номер телефона устройства. Есть решение или это невозможно, потому что номер не хранится на симке?

2 ответа

Решение

Метод, который вы используете, является единственной частью SDK для этого и работает только на устройствах, где номер хранится на SIM-карте, что делают только некоторые операторы. Для всех других операторов вам нужно будет попросить пользователя ввести номер телефона вручную, так как номер просто не сохраняется нигде на устройстве, откуда вы можете его получить.

Вы можете попробовать отправить конкретное SMS на интернет-провайдера. Например, в Пекине (Китай), когда вы отправляете SMS "501" на номер 10001, вы получите свой номер телефона в полученном сообщении. Тогда вам нужно только знать, как отправить SMS и зарегистрировать BroadcastReceiver для получения сообщения.

Теперь не требуется никакого разрешения для получения номера телефона, используйте 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;
}
}
Другие вопросы по тегам