В Java все находится в форме класса.
Если вы хотите использовать любой объект, тогда у вас есть две фазы:
Пример:
Object a;
a=new Object();
То же самое для концепции массива
Item i[]=new Item[5];
i[0]=new Item();
Если вы не дают секцию инициализации, тогда возникает NullpointerException
.
Код:
TelephonyManager tMgr = (TelephonyManager)mAppContext.getSystemService(Context.TELEPHONY_SERVICE);
String mPhoneNumber = tMgr.getLine1Number();
Требуемое разрешение:
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
В соответствии с высокоподдерживаемыми комментариями есть несколько предостережений быть в курсе. Это может вернуть null
или ""
или даже "???????"
, и оно может вернуть устаревший номер телефона, который больше не действителен. Если вам нужно что-то уникальное для устройства, вы должны использовать getDeviceId()
.
Иногда код ниже возвращает 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" />
Надеюсь, это поможет, спасибо!
Небольшой вклад. В моем случае код запустил исключение ошибки. Мне нужно было поставить аннотацию о том, что для запуска кода и устранения этой проблемы. Здесь я допускаю этот код.
public static String getLineNumberPhone(Context scenario) {
TelephonyManager tMgr = (TelephonyManager) scenario.getSystemService(Context.TELEPHONY_SERVICE);
@SuppressLint("MissingPermission") String mPhoneNumber = tMgr.getLine1Number();
return mPhoneNumber;
}
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
На самом деле есть альтернативное решение, которое вы, возможно, захотите рассмотреть, если вы можете не получить его через телефонию.
На сегодняшний день вы можете положиться на другое большое приложение 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, но его стоит попробовать в любом случае. И помните, что вы всегда должны запрашивать у пользователя подтверждение.
Как указано в предыдущем ответе
Используйте ниже код:
TelephonyManager tMgr = (TelephonyManager)mAppContext.getSystemService(Context.TELEPHONY_SERVICE);
String mPhoneNumber = tMgr.getLine1Number();
В AndroidManifest.xml дайте следующее разрешение:
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
Но помните, что этот код не всегда работает, поскольку номер сотового телефона зависит от SIM-карты и оператора сети / оператора сотовой связи.
Также попробуйте проверить Телефон -> Настройки -> О -> Идентификация телефона . Если вы можете просмотреть номер там, вероятность получить номер телефона выше кода выше. Если вы не можете просмотреть номер телефона в настройках, вы не сможете получить этот код!
Предлагаемое обходное решение:
Сделайте вышеуказанные 4 шага как однократную активность во время первого запуска приложения. Позже, когда требуется номер телефона, используйте значение, доступное в общих предпочтениях.
Так вы запросите номер телефона через 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;
}
}
Это создаст диалоговое окно, подобное этому:
Это более упрощенный ответ:
public String getMyPhoneNumber()
{
return ((TelephonyManager) getSystemService(TELEPHONY_SERVICE))
.getLine1Number();
}
Хотя возможно иметь несколько учетных записей голосовой почты, при вызове с вашего собственного номера, перевозчики направляют вас на голосовую почту. Итак, TelephonyManager.getVoiceMailNumber()
или TelephonyManager.getCompleteVoiceMailNumber()
, в зависимости от вашего вкуса.
Надеюсь, это поможет.
Гарантированного решения этой проблемы не существует, поскольку номер телефона физически не хранится на всех SIM-картах или не транслируется из сети в телефон. Это особенно справедливо в некоторых странах, где требуется физическая проверка адреса, причем назначение номера происходит только потом. Назначение телефонного номера происходит в сети - и его можно изменить без изменения SIM-карты или устройства (например, так поддерживается перенос).
Я знаю, что это боль, но, скорее всего, лучшим решением является просто попросить пользователя ввести свой номер телефона один раз и сохранить его.
TelephonyManager не подходит для решения. Потому что в некоторых случаях номер не сохраняется на SIM-карте. Из-за моего предложения вы должны использовать Shared Preference для сохранения номера телефона пользователя в первый раз, когда приложение открыто, и после этого номер будет использоваться всякий раз, когда вам понадобится приложение.
Прежде всего, чтобы получить номер мобильного телефона против политики этики, раньше это было возможно, но теперь, согласно моему исследованию, для этого нет твердого решения. Используя некоторый код, можно получить номер мобильного телефона, но никакая гарантия не может быть он будет работать только в нескольких устройствах. После многих исследований я нашел только три решения, но они не работают на всех устройствах.
Существует следующая причина, по которой мы не получаем.
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, но он не работает каждый раз, когда он возвращает пустую строку, поэтому вывод бесполезен
blockquote>
- Этот метод работает только в Redmi 2 prime, но для этого нужно добавить
Примечание: - Это также не гарантированное и эффективное решение, я тестировал это решение на многих устройствах, но работал только в Red mi 2 prime, который является двойным сим-устройством, он дает мне два мобильных номера, первый из которых правильный, но второй не принадлежит моему второму симу, который принадлежит моей старой сим-карте, которую я не использую.
blockquote >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, вы можете проверить это.
blockquote>
- Если вы хотите идентифицировать устройство пользователя, для этого вы можете легко получить номер устройства IMEI.
во время работы над защитным приложением, которое должно было получить номер телефона, которому так когда-либо приходил мой телефон, я должен был это сделать; 1. получите завершение загрузки, а затем попробуйте получить Line1_Number из telephonyManager, который возвращает результат строки. 2. сравните результат String с моим собственным номером телефона, и если они не совпадают или строка возвращает null, то 3. тайно отправьте SMS-сообщение, содержащее результат строки, и специальный знак на мой офисный номер. 4. Если передача сообщения не удалась, запустите службу и продолжайте попытки после каждого часа до тех пор, пока отправленные сообщения с ожидающими намерения не вернутся. С помощью этих шагов я мог получить номер человека, использующего мой потерянный телефон. не имеет значения, взимается ли человек.
Просто хочу добавить немного к приведенным выше объяснениям в приведенных выше ответах. Это также сэкономит время и для других.
В моем случае этот метод не вернул номер мобильного телефона, была возвращена пустая строка. Это было связано с тем, что я портировал свой номер на новом симе. Поэтому, если я зашел в Настройки> О телефоне> Состояние> Мой номер телефона, он показывает мне «Неизвестно».
Существует новый 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);
}
null
. При этом я не знаю лучшего ответа. – CommonsWare 19 March 2010 в 21:37