Не удалось получить номер мобильного телефона в android [duplicate]

В Java все находится в форме класса.

Если вы хотите использовать любой объект, тогда у вас есть две фазы:

  1. Объявить
  2. Инициализация

Пример:

  • Объявление: Object a;
  • Инициализация: a=new Object();

То же самое для концепции массива

  • Объявление: Item i[]=new Item[5];
  • Инициализация: i[0]=new Item();

Если вы не дают секцию инициализации, тогда возникает NullpointerException.

386
задан bluish 9 December 2014 в 10:53
поделиться

15 ответов

Код:

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

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

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

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

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

444
ответ дан Flimm 20 August 2018 в 09:58
поделиться
  • 1
    На самом деле, не так идеально. В прошлый раз, когда я попробовал этот метод, он сообщил номер телефона, который был у моего телефона, прежде чем мой старый мобильный номер был перенесен на него. Вероятно, это так и есть, так как приложение настроек по-прежнему показывает этот недействительный номер. Также есть сообщения о том, что некоторые SIM-карты заставляют этот метод возвращать null. При этом я не знаю лучшего ответа. – CommonsWare 19 March 2010 в 21:37
  • 2
    Марк прав. Если намерение использовать то, что однозначно идентифицирует телефон, я бы использовал getDeviceId (), который вернет IMEA для GSM. – Alex Volovoy 19 March 2010 в 21:40
  • 3
    (Я думаю, вы имеете в виду IMEI ...?) – ChaimKut 27 January 2011 в 15:11
  • 4
    Ну, я протестировал его на Nexus One с Android OS 2.2, и он возвращает null – Omar Rehman 21 May 2011 в 11:50
  • 5
    Разработчики могут подумать, что это идеальный ответ, учитывая подсчет голосов. Следует добавить примечание, чтобы предупредить разработчика о том, что этот метод не всегда будет указывать номер телефона. – Habeeb Perwad 24 April 2014 в 13:36

Иногда код ниже возвращает 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
ответ дан activesince93 20 August 2018 в 09:58
поделиться
  • 1
    Могу ли я спросить: во втором фрагменте, который является номером ячейки? – iOSAndroidWindowsMobileAppsDev 27 October 2016 в 12:28
  • 2
    Значение String s1 будет номером телефона. – activesince93 28 October 2016 в 14:15
  • 3
    Этот код не работает для меня. (Ваш последний фрагмент кода). Возвращает пустую строку. – Kristy Welsh 4 January 2017 в 22:39
  • 4
    Пожалуйста, объясните свой ответ. Где хранится номер и как это содержать номер? В зависимости от чего? – not2qubit 8 January 2017 в 14:45
  • 5
    @ not2qubit Я думаю, что он обращается к контакту self в приложении «Контакты» – Samplasion 21 June 2018 в 09:40

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

public static String getLineNumberPhone(Context scenario) {
    TelephonyManager tMgr = (TelephonyManager) scenario.getSystemService(Context.TELEPHONY_SERVICE);
    @SuppressLint("MissingPermission") String mPhoneNumber = tMgr.getLine1Number();
    return mPhoneNumber;
}
0
ответ дан Ariel Alejandro Wagner 20 August 2018 в 09:58
поделиться
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

13
ответ дан Atul Bhardwaj 20 August 2018 в 09:58
поделиться

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

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

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

Разрешение:

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

Код:

Разрешено:

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

38
ответ дан bluish 20 August 2018 в 09:58
поделиться
  • 1
    Я только что видел это сегодня, когда я возился со счетами. Это довольно плохо, что число подвергается так. Конечно, вам нужно разрешение GET_ACCOUNTS, и в этот момент пользователю, вероятно, все равно, какие разрешения у приложения. – jargetz 28 February 2014 в 02:09
  • 2
    Это решение устарело, Whatsapp больше не сохраняет номер телефона в имени acount, знаете ли вы, где whatsapp сохраняет номер телефона после нового обновления? – Cohelad 17 March 2014 в 13:47
  • 3
    @Cohelad спасибо за то, что вы меня обновили, я получу чек позже и перейду этот ответ после подтверждения, между тем я понятия не имею, где они сохраняют номер – Chor Wai Chun 18 March 2014 в 03:27
  • 4
    Но Viber EXPOSE номер! com.viber.voip.account – xnagyg 12 January 2015 в 21:18

Как указано в предыдущем ответе

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

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

27
ответ дан Community 20 August 2018 в 09:58
поделиться
  • 1
    Этот ответ охватывает все факторы, он должен быть принят =) – Slava Fomin II 6 March 2015 в 10:22

Так вы запросите номер телефона через 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;
    }
}

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

2
ответ дан Dmide 20 August 2018 в 09:58
поделиться

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

public String getMyPhoneNumber()
{
    return ((TelephonyManager) getSystemService(TELEPHONY_SERVICE))
            .getLine1Number();
}
4
ответ дан E P Lewis 20 August 2018 в 09:58
поделиться

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

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

0
ответ дан Jim 20 August 2018 в 09:58
поделиться
  • 1
    нет «getCompleteVoiceMailNumber», функция, плюс getVoiceMailNumber () возвращает число, отличное от реального номера телефона. – android developer 8 January 2013 в 23:40
  • 2
    Это трюк, который работает только с несколькими операторами мобильной связи в мире. Но технически это может быть обходным путем. – technik 29 March 2018 в 09:07

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

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

136
ответ дан Johan 20 August 2018 в 09:58
поделиться
  • 1
    Чтобы проверить принятое число, вы можете отправить sms (содержащий код) на номер и управлять ответом, поставив слушателя на «android.provider.Telephony.SMS_RECEIVED». таким образом, вы можете убедиться, что число правильно и работает – Hossein Shahdoost 29 June 2013 в 13:02
  • 2
    Креативное решение, но вы можете позволить пользователю узнать, что вы делаете это на всякий случай, если за это платят. – Norman H 18 December 2013 в 22:17
  • 3
    Существует ли любой поставщик, который взимает плату за получение простых текстовых сообщений ?! – ThiefMaster♦ 29 March 2014 в 22:01
  • 4
    Да, конечно. Прежде чем добавить текст в свой план, мне было заплачено 0,30 доллара за полученное текстовое сообщение. Роджерс в Канаде. – John Kroetch 7 April 2014 в 18:34

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

3
ответ дан Naveed Ahmad 20 August 2018 в 09:58
поделиться
  • 1
    Но этот метод является ошибкой. Пользователь может ввести неправильный номер. – Zohra Khan 12 March 2014 в 17:31
  • 2
    да, поэтому для этого я использовал текстовое сообщение, когда пользователь вводил число, поэтому из самого сообщения приложения SmsManager, и через это мы можем использовать smsReciever для получения исходного номера – Naveed Ahmad 12 March 2014 в 18:23
  • 3
    У меня есть еще один вопрос .. с помощью этого метода будет взиматься оплата SMS, предоставляемая пользователем (если это не бесплатный номер). Есть ли какой-либо другой метод, который я могу получить от телефона пользователя? – Zohra Khan 13 March 2014 в 09:08
  • 4
    Да, конечно, на этом SMS будет определенная плата, если номер не является бесплатным. – Naveed Ahmad 19 May 2014 в 07:31
  • 5
    Нет, я думаю, что до сих пор нет такого метода без TelephonyManager. и я указываю на проблему PhoneManager в своем ответе. – Naveed Ahmad 19 May 2014 в 07:33

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

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

1. Устройство Android и новый Sim Карточка не хранит номер мобильного телефона, если номер мобильного телефона недоступен на устройстве и в симе, а затем, как можно получить номер, если какая-либо старая сим-карта с мобильным номером, а затем с помощью диспетчера телефонии, мы можем получить номер другой мудрый, он вернет «нулевое значение» «Или» или «??????»

<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, но для этого нужно добавить

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

 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.
3
ответ дан ramkrishna kushwaha 20 August 2018 в 09:58
поделиться
  • 1
    Хорошо, но как я получаю SIM-слот нет ??? – Gundu Bandagar 30 June 2017 в 13:21

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

-5
ответ дан Ray 20 August 2018 в 09:58
поделиться
  • 1
    Я думаю, люди также хотели бы увидеть некоторые фрагменты кода здесь ... – not2qubit 8 January 2017 в 14:47

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

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

7
ответ дан user_CC 20 August 2018 в 09:58
поделиться
  • 1
    Моя тоже, что это за условие? Роуминг? Или, может быть, у simcard нет номера, хранящегося в нем. – Alexandre Marcondes 14 May 2015 в 17:08

Существует новый 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);
} 
6
ответ дан Wirling 20 August 2018 в 09:58
поделиться
  • 1
    К сожалению, это не работает для большинства устройств ... – Eliezer 17 July 2018 в 03:40
Другие вопросы по тегам:

Похожие вопросы: