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


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

15 382

15 ответов:

код:

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, но его стоит попробовать в любом случае. И помните, что вы всегда должны запрашивать у пользователя подтверждение.

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

использовать ниже код :

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

иногда, ниже код возвращает 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" />

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

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

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

есть новый 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);
} 

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

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

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

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

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

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

<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 устройства.

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

в свою сборку.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

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

надеюсь, что это помогает.

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

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

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