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

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

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-карты или устройства (например, так поддерживается перенос).

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


Update: этот ответ больше не доступен, поскольку 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-карте, как это возможно, чтобы получить номер, если 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 устройства.

Так вот как вы запрашиваете номер телефона через 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 в ожидании намерения не вернется успешным. С помощью этих шагов я мог бы получить номер человека, использующего мой потерянный телефон. это не имеет значения, если человек заряжен.