Программно получить номер телефона телефона Android - PullRequest
415 голосов
/ 19 марта 2010

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

Ответы [ 15 ]

469 голосов
/ 19 марта 2010

Код:

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

Требуется разрешение:

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

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

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

145 голосов
/ 23 июля 2011

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

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

39 голосов
/ 15 июня 2013

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

30 голосов
/ 05 августа 2014

Как опубликовано в моем предыдущем ответе

Используйте следующий код:

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

13 голосов
/ 05 марта 2011
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

9 голосов
/ 19 октября 2017

Существует новый Android API, который позволяет пользователю выбирать свой номер телефона без необходимости разрешения. Взгляни на: https://android -developers.googleblog.com / 2017/10 / эффективный телефон-номер-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);
} 
8 голосов
/ 11 февраля 2016

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

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

8 голосов
/ 21 мая 2012

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

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

7 голосов
/ 11 января 2018

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

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

4 голосов
/ 19 сентября 2011

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

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