Как я могу программно получить номер телефона устройства, на котором запущено приложение для Android?
Программно получить номер телефона телефона Android
Ответ 1
код:
TelephonyManager tMgr = (TelephonyManager)mAppContext.getSystemService(Context.TELEPHONY_SERVICE);
String mPhoneNumber = tMgr.getLine1Number();
Требуемое разрешение:
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
Предостережение:
В соответствии с очень высокими комментариями есть несколько предостережений, о которых следует знать. Это может вернуть null
или ""
или даже "???????"
, и оно может вернуть устаревший номер телефона, который больше недействителен. Если вы хотите что-то, что однозначно идентифицирует устройство, вы должны использовать вместо него getDeviceId()
.
Ответ 2
Нет гарантированного решения этой проблемы, поскольку номер телефона физически не хранится на всех SIM-картах или не транслируется из сети в телефон. Это особенно справедливо в некоторых странах, где требуется физическая проверка адреса, причем назначение номера происходит только потом. Назначение телефонного номера происходит в сети - и его можно изменить без изменения SIM-карты или устройства (например, это поддерживается портирование).
Я знаю, что это боль, но, скорее всего, лучшим решением является просто попросить пользователя ввести номер своего телефона один раз и сохранить его.
Ответ 3
Обновление: этот ответ больше недоступен, так как 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, но в любом случае стоит попробовать. И помните, что вы всегда должны спрашивать у пользователя подтверждение.
Ответ 4
Как опубликовано в предыдущем ответе
Используйте код ниже:
TelephonyManager tMgr = (TelephonyManager)mAppContext.getSystemService(Context.TELEPHONY_SERVICE);
String mPhoneNumber = tMgr.getLine1Number();
В AndroidManifest.xml дайте следующее разрешение:
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
Но помните, что этот код не всегда работает, поскольку номер сотового телефона зависит от SIM-карты и оператора сети/оператора сотовой связи.
Кроме того, попробуйте проверить Телефон → Настройки → О программе → Идентификация телефона. Если вы можете просмотреть номер там, вероятность получить номер телефона выше кода выше. Если вы не можете просмотреть номер телефона в настройках, вы не сможете получить этот код!
Предлагаемое решение:
- Получить пользовательский номер телефона как ручной ввод от пользователя.
- Отправьте код на мобильный номер пользователя с помощью SMS.
- Попросите пользователя ввести код для подтверждения номера телефона.
- Сохранить номер в sharedpreference.
Сделайте вышеуказанные 4 шага как однократную активность во время первого запуска приложения. Позже, когда требуется номер телефона, используйте значение, доступное в общих предпочтениях.
Ответ 5
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
Ответ 6
Существует новый API Android, который позволяет пользователю выбирать свой номер телефона без необходимости разрешения. Взгляните на: 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);
}
Ответ 7
Просто хочу добавить немного к приведенным выше объяснениям в приведенных выше ответах. Который сэкономит время и для других.
В моем случае этот метод не вернул номер мобильного телефона, была возвращена пустая строка. Это было связано с тем, что я портировал свой номер на новом симе. Поэтому, если я перейду в Настройки > О телефоне > Статуs > Мой номер телефона, он покажет мне "Неизвестно".
Ответ 8
Иногда код ниже возвращает 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" />
Надеюсь, это поможет, Спасибо!
Ответ 9
Так что как вы запрашиваете номер телефона через Play Services 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;
}
}
Это сгенерирует диалог как это:
Ответ 10
Это более упрощенный ответ:
public String getMyPhoneNumber()
{
return ((TelephonyManager) getSystemService(TELEPHONY_SERVICE))
.getLine1Number();
}
Ответ 11
TelephonyManager
не является правильным решением, поскольку в некоторых случаях номер не сохраняется на SIM-карте. Я предлагаю вам использовать общие предпочтения для сохранения телефонного номера пользователя при первом открытии приложения, и этот номер будет использоваться всякий раз, когда вам нужно.
Ответ 12
Прежде всего, получение номера мобильного телефона против политики этики, раньше это было возможно, но теперь, согласно моему исследованию, для этого нет твердого решения. Используя некоторый код, можно получить номер мобильного телефона, но никакая гарантия не может быть он будет работать только в нескольких устройствах. После многих исследований я нашел только три решения, но они не работают на всех устройствах.
Существует следующая причина, по которой мы не получаем.
1. Устройство Android и новая Sim-карта не сохраняют номер мобильного телефона, если номер мобильного телефона недоступен на устройстве и в симу, а затем, как можно получить номер, если какая-либо старая сим-карта, имеющая мобильный номер, затем используя менеджер Telephony, мы можем получить число других мудрых оно вернет "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, но он не работает каждый время возвращает пустую строку, поэтому вывод бесполезен
- Этот метод работает только в Redmi 2 prime, но для этого нужно добавить прочитайте разрешение контакта в манифесте.
Примечание. - Это также не гарантированное и эффективное решение, я тестировал это решение на многих устройствах, но работал только в Redmi 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();
}
- В моих исследованиях, которые я нашел ранее, можно было получить номер мобильного телефона с помощью учетной записи WhatsApp, но теперь новая версия Whatsapp не сохраняет номер мобильного телефона пользователя.
Заключение: - Android не имеет гарантированного решения пользовательский номер мобильного телефона программно.
Предложение: - 1. Если вы хотите подтвердить номер мобильного телефона, попросите пользователь, чтобы указать его номер, используя otp, вы можете проверить это.
- Если вы хотите идентифицировать устройство пользователя, для этого вы можете легко получить номер устройства IMEI.
Ответ 13
Небольшой вклад. В моем случае код запускает исключение ошибки. Мне нужно было поместить аннотацию для запуска кода и решить эту проблему. Здесь я позволю этот код.
public static String getLineNumberPhone(Context scenario) {
TelephonyManager tMgr = (TelephonyManager) scenario.getSystemService(Context.TELEPHONY_SERVICE);
@SuppressLint("MissingPermission") String mPhoneNumber = tMgr.getLine1Number();
return mPhoneNumber;
}
Ответ 14
Хотя возможно иметь несколько учетных записей голосовой почты, при вызове с вашего собственного номера, перевозчики направляют вас на голосовую почту. Итак, TelephonyManager.getVoiceMailNumber()
или TelephonyManager.getCompleteVoiceMailNumber()
, в зависимости от вкуса, который вам нужен.
Надеюсь, что это поможет.
Ответ 15
во время работы над защитным приложением, которое должно было получить номер телефона, с которым когда-либо мог попасть мой телефон, я должен был это сделать; 1. получите завершение загрузки, а затем попробуйте получить Line1_Number из telephonyManager, который возвращает результат строки. 2. сравните результат String с моим собственным номером телефона, и если они не совпадают или строка возвращает null, 3. тайно отправьте SMS-сообщение с результатом строки плюс специальный знак на мой офисный номер. 4. Если передача сообщения не удалась, запустите службу и продолжайте попытки после каждого часа до тех пор, пока отправленные сообщения с ожидающими намерения не вернутся. С помощью этих шагов я мог получить номер человека, использующего мой потерянный телефон. не имеет значения, взимается ли человек.
Ответ 16
Вот как вы должны делать это сообщение M world:
private void getPhoneInfo() {
if(ContextCompat.checkSelfPermission(getBaseContext(), "android.permission.READ_SMS") == PackageManager.PERMISSION_GRANTED) {
TelephonyManager tMgr = (TelephonyManager)this.getSystemService(Context.TELEPHONY_SERVICE);
Log.e(LOGGING_TAG, "PHONE NUMBER = " + tMgr.getLine1Number());
} else {
final int REQUEST_CODE_ASK_PERMISSIONS = 123;
ActivityCompat.requestPermissions(this, new String[]{"android.permission.READ_SMS"}, REQUEST_CODE_ASK_PERMISSIONS);
}
}
Убедитесь, что у вас есть разрешения на использование полномочий READ_SMS
<uses-permission android:name="android.permission.READ_SMS"/>