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

StackOverflow https://stackoverflow.com/questions/2480288

Вопрос

Как я могу программно получить номер телефона устройства, на котором запущено мое приложение для Android?

Это было полезно?

Решение

Код:

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

Требуемое разрешение:

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

Предостережения:

Согласно комментариям, получившим наибольшее количество голосов, есть несколько предостережений, о которых следует знать.Это может вернуть null или "" или даже "???????", и он может вернуть устаревший номер телефона, который больше не действителен.Если вам нужно что-то, что однозначно идентифицирует устройство, вы должны использовать getDeviceId() вместо этого.

Другие советы

Гарантированного решения этой проблемы не существует, поскольку телефонный номер физически не сохраняется на всех SIM-картах и не транслируется из сети на телефон.Это особенно актуально в некоторых странах, где требуется проверка физического адреса, а присвоение номера происходит только после этого.Назначение телефонного номера происходит в сети - и может быть изменено без замены SIM-карты или устройства (напримервот как поддерживается перенос).

Я знаю, что это больно, но, скорее всего, лучшее решение - просто попросить пользователя ввести свой номер телефона один раз и сохранить его.

Обновить:Этот ответ больше недоступен, поскольку Whatsapp перестал указывать номер телефона в качестве имени учетной записи, пожалуйста, проигнорируйте этот ответ.

На самом деле существует альтернативное решение, которое вы, возможно, захотите рассмотреть, если вы не можете получить его через службу телефонии.

На сегодняшний день вы можете положиться на другое большое приложение Whatsapp, используя AccountManager.Это приложение установлено на миллионах устройств, и если вы не можете получить номер телефона через TelephonyManager, вы можете попробовать это сделать.

Разрешение:

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

Код:

AccountManager am = AccountManager.get(this);
Account[] accounts = am.getAccounts();

for (Account ac : accounts) {
    String acname = ac.name;
    String actype = ac.type;
    // Take your time to look at all available accounts
    System.out.println("Accounts : " + acname + ", " + actype);
}

Проверить actype для учетной записи WhatsApp

if(actype.equals("com.whatsapp")){
    String phoneNumber = ac.name;
}

Конечно, вы можете не получить его, если пользователь не устанавливал WhatsApp, но попробовать все равно стоит.И помните, что вы всегда должны запрашивать у пользователя подтверждение.

Как опубликовано в моем более ранний ответ

Используйте приведенный ниже код :

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

В разделе AndroidManifest.xml дайте следующее разрешение:

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

Но помните, что этот код работает не всегда, поскольку номер сотового телефона зависит от SIM-карты и оператора сети / оператора сотовой связи.

Кроме того, попробуйте зарегистрироваться Телефон-> Настройки -> О программе -> Идентификатор телефона, Если вы можете просмотреть Номер там, вероятность получения номера телефона из приведенного выше кода выше.Если вы не можете просмотреть номер телефона в настройках, то вы не сможете получить доступ с помощью этого кода!

Предлагаемое Обходное решение:

  1. Получите номер телефона пользователя в виде ручного ввода от пользователя.
  2. Отправьте код на номер мобильного телефона пользователя с помощью SMS.
  3. Попросите пользователя ввести код для подтверждения номера телефона.
  4. Сохраните номер в sharedpreference.

Выполните вышеуказанные 4 шага в качестве одноразового действия во время первого запуска приложения.Позже, когда потребуется номер телефона, используйте значение, доступное в общих настройках.

private String getMyPhoneNumber(){
    TelephonyManager mTelephonyMgr;
    mTelephonyMgr = (TelephonyManager)
        getSystemService(Context.TELEPHONY_SERVICE); 
    return mTelephonyMgr.getLine1Number();
}

private String getMy10DigitPhoneNumber(){
    String s = getMyPhoneNumber();
    return s != null && s.length() > 2 ? s.substring(2) : null;
}

Код взят из http://www.androidsnippets.com/get-my-phone-number

Итак, вот как вы запрашиваете номер телефона через API Play Services без разрешения и взломов. Источник и Полный пример.

В вашем 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;
    }
}

Это сгенерирует диалоговое окно, подобное этому:

enter image description here

Существует новый Android api, который позволяет пользователю выбирать свой телефонный номер без необходимости получения разрешения.Взгляните на:https://android-developers.googleblog.com/2017/10/effective-phone-number-verification.html

// Construct a request for phone numbers and show the picker
private void requestHint() {
    HintRequest hintRequest = new HintRequest.Builder()
       .setPhoneNumberIdentifierSupported(true)
       .build();

    PendingIntent intent = Auth.CredentialsApi.getHintPickerIntent(
        apiClient, hintRequest);
    startIntentSenderForResult(intent.getIntentSender(),
        RESOLVE_HINT, null, 0, 0, 0);
} 

Просто хочу немного добавить здесь к приведенным выше объяснениям в приведенных выше ответах.Что также сэкономит время для других.

В моем случае этот метод не вернул никакого номера мобильного телефона, была возвращена пустая строка.Именно из-за этого случая я перенес свой номер на новую sim-карту.Поэтому, если я захожу в Настройки> О телефоне> Статус> Мой номер телефона, он показывает мне "Неизвестно".

Иногда приведенный ниже код возвращает null или пустая строка.

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

С нижеприведенным разрешением

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

Есть другой способ, которым вы сможете получить свой номер телефона, я не тестировал его на нескольких устройствах, но приведенный выше код работает не каждый раз.

Попробуйте приведенный ниже код:

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

Вам нужно будет добавить эти два разрешения.

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

Надеюсь, это поможет, Спасибо!

Это более упрощенный ответ:

public String getMyPhoneNumber()
{
    return ((TelephonyManager) getSystemService(TELEPHONY_SERVICE))
            .getLine1Number();
}

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

Существует следующая причина, по которой мы не получаем.

1. Устройство Android и новая sim-карта, не сохраняющие номер мобильного телефона если номер мобильного телефона недоступен в устройстве и на sim-карте, то как можно получить номер, если на любой старой sim-карте есть номер мобильного телефона, то с помощью диспетчера телефонии мы можем получить номер, в противном случае он вернет “null” или ”“ или "??????”

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

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

Примечание:- Я тестировал это решение на следующих устройствах Moto x, Samsung Tab 4, Samsung S4, Nexus 5 и Redmi 2 prime, но оно работает не каждый раз каждый раз оно возвращает пустую строку, поэтому вывод - это бесполезно

  1. Этот метод работает только в Redmi 2 prime, но для этого нужно добавить разрешение на чтение контактов в манифесте.

Примечание:- Это также не гарантированное и эффективное решение, я тестировал это решение на многих устройствах, но оно работало только в Redmi 2 prime это устройство с двумя sim-картами, оно выдает мне два номера мобильных телефонов, первый из которых правильный, но второй не принадлежит моей второй sim-карте, он принадлежит моей какой-то старой 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();
    }
  1. В своем исследовании я обнаружил, что ранее можно было получить номер мобильного телефона с помощью учетной записи WhatsApp, но теперь новая версия Whatsapp не сохраняет номер мобильного телефона пользователя.

Заключение:- Android не имеет какого-либо гарантированного решения для получения номера мобильного телефона пользователя программно.

Предложение:- 1.Если вы хотите подтвердить номер мобильного телефона пользователя, попросите пользователя предоставить свой номер, используя otp, вы можете подтвердить это.

  1. Если вы хотите идентифицировать устройство пользователя, для этого вы можете легко получить IMEI-номер устройства.

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

Небольшой вклад.В моем случае код запустил исключение ошибки.Мне нужно было поместить аннотацию для запуска кода и устранить эту проблему.Здесь я допускаю этот код.

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

Хотя возможно иметь несколько учетных записей голосовой почты, при звонке с вашего собственного номера операторы перенаправляют вас на голосовую почту.Итак, TelephonyManager.getVoiceMailNumber() или TelephonyManager.getCompleteVoiceMailNumber(), в зависимости от того, какой вкус вам нужен.

Надеюсь, это поможет.

во время работы над приложением для обеспечения безопасности, которому нужно было получить номер телефона того, кому мой телефон может попасть в руки, мне пришлось сделать это;1.получите завершенную загрузку, а затем попробуйте получить Line1_Number из TelephonyManager, который возвращает результат string.2.сравните результат строки с моим собственным номером телефона, и если они не совпадают или строка возвращает null, тогда, 3.тайно отправьте SMS, содержащее строку result плюс специальный знак, на номер моего офиса.4.если отправка сообщения завершается неудачей, запустите службу и продолжайте попытки через каждый час, пока отправленное ожидающее намерение SMS не завершится успешно.С помощью этих шагов я мог бы получить номер человека, пользующегося моим потерянным телефоном.не имеет значения, предъявлено ли этому человеку обвинение.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top