Як я можу програмно отримати номер телефону пристрою, на якому працює мій додаток для Android?
Як я можу програмно отримати номер телефону пристрою, на якому працює мій додаток для Android?
Відповіді:
Код:
TelephonyManager tMgr = (TelephonyManager)mAppContext.getSystemService(Context.TELEPHONY_SERVICE);
String mPhoneNumber = tMgr.getLine1Number();
Необхідний дозвіл:
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
Відповідно до висококваліфікованих коментарів, слід знати кілька застережень. Це може повернутися null
або ""
навіть навіть "???????"
, і він може повернути несвіжий номер телефону, який більше не дійсний. Якщо ви хочете щось, що унікально ідентифікує пристрій, вам слід скористатися getDeviceId()
натомість.
null
. Коли це було сказано, я не знаю кращої відповіді.
Немає гарантованого вирішення цієї проблеми, оскільки номер телефону фізично не зберігається на всіх SIM-картах або не передається з мережі в телефон. Особливо це стосується деяких країн, які потребують фізичної перевірки адреси, присвоєння номера відбувається лише після цього. Присвоєння телефонного номера відбувається в мережі - і його можна змінити, не змінюючи SIM-карту чи пристрій (наприклад, так підтримується перенос).
Я знаю, що це біль, але, швидше за все, найкращим рішенням є просто попросити користувача ввести один раз свій номер телефону та зберегти його.
Насправді є альтернативне рішення, яке ви хочете розглянути, якщо ви не можете його отримати через послугу телефонії.
На сьогоднішній день ви можете розраховувати на інший великий додаток 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, але варто все-таки спробувати. І пам’ятайте, що ви завжди повинні просити користувача підтвердження.
Як було розміщено в моїй попередній відповіді
Використовуйте код нижче:
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 служб 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;
}
}
Це створить діалогове вікно, подібне до цього:
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
Існує нова програма для 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);
}
Просто хочу трохи додати сюди вищезазначені пояснення у наведених вище відповідях. Що заощадить час і для інших.
У моєму випадку цей метод не повернув жодного мобільного номера, повернувся порожній рядок. Через те, що я переніс свій номер на новому симі. Тож якщо я заходжу в Налаштування> Про телефон> Статус> Мій номер телефону, він відображатиметься "Невідомий".
Іноді під кодом повертається 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" />
Сподіваюся, це допомагає, дякую!
String s1
буде номер телефону.
Це більш спрощена відповідь:
public String getMyPhoneNumber()
{
return ((TelephonyManager) getSystemService(TELEPHONY_SERVICE))
.getLine1Number();
}
Перш за все, отримання мобільних номерів користувачів суперечить Етичній політиці, раніше це було можливо, але зараз, згідно з моїми дослідженнями, для цього не існує надійного рішення. За допомогою деякого коду можна отримати мобільний номер, але жодної гарантії може не працювати. лише в декількох пристроях. Після багатьох досліджень я знайшов лише три рішення, але вони працюють не у всіх пристроях.
Є наступна причина, чому ми не отримуємо.
1.Андроїдний пристрій та нова сим-карта не зберігають номер мобільного телефону, якщо номер мобільного телефону не доступний у пристрої та в 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, але воно не працює кожен раз, коли повертає порожню рядок, тому висновок - марний
Примітка: - Це також не гарантоване та ефективне рішення, я протестував це рішення на багатьох пристроях, але він працював лише у 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();
}
Висновок : - Android не має жодного гарантованого рішення для програмного отримання мобільного номера користувача.
Пропозиція : - 1. Якщо ви хочете підтвердити мобільний номер користувача, тоді попросіть користувача надати його номер, використовуючи otp, ви можете це підтвердити.
- Якщо ви хочете ідентифікувати пристрій користувача, для цього ви можете легко отримати номер IMEI пристрою.
TelephonyManager
не є правильним рішенням, оскільки в деяких випадках число не зберігається в SIM-картці. Я пропоную вам скористатися спільним уподобанням, щоб зберігати номер телефону користувача вперше, коли програма відкрита, і номер буде використовуватися, коли вам потрібно.
Ось комбінація знайдених нами рішень (зразок проекту тут , якщо ви хочете також перевірити автоматичне заповнення):
маніфест
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
build.gradle
implementation "com.google.android.gms:play-services-auth:17.0.0"
MainActivity.kt
class MainActivity : AppCompatActivity() {
private lateinit var googleApiClient: GoogleApiClient
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
tryGetCurrentUserPhoneNumber(this)
googleApiClient = GoogleApiClient.Builder(this).addApi(Auth.CREDENTIALS_API).build()
if (phoneNumber.isEmpty()) {
val hintRequest = HintRequest.Builder().setPhoneNumberIdentifierSupported(true).build()
val intent = Auth.CredentialsApi.getHintPickerIntent(googleApiClient, hintRequest)
try {
startIntentSenderForResult(intent.intentSender, REQUEST_PHONE_NUMBER, null, 0, 0, 0);
} catch (e: IntentSender.SendIntentException) {
Toast.makeText(this, "failed to show phone picker", Toast.LENGTH_SHORT).show()
}
} else
onGotPhoneNumberToSendTo()
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if (requestCode == REQUEST_PHONE_NUMBER) {
if (resultCode == Activity.RESULT_OK) {
val cred: Credential? = data?.getParcelableExtra(Credential.EXTRA_KEY)
phoneNumber = cred?.id ?: ""
if (phoneNumber.isEmpty())
Toast.makeText(this, "failed to get phone number", Toast.LENGTH_SHORT).show()
else
onGotPhoneNumberToSendTo()
}
}
}
private fun onGotPhoneNumberToSendTo() {
Toast.makeText(this, "got number:$phoneNumber", Toast.LENGTH_SHORT).show()
}
companion object {
private const val REQUEST_PHONE_NUMBER = 1
private var phoneNumber = ""
@SuppressLint("MissingPermission", "HardwareIds")
private fun tryGetCurrentUserPhoneNumber(context: Context): String {
if (phoneNumber.isNotEmpty())
return phoneNumber
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
val subscriptionManager = context.getSystemService(Context.TELEPHONY_SUBSCRIPTION_SERVICE) as SubscriptionManager
try {
subscriptionManager.activeSubscriptionInfoList?.forEach {
val number: String? = it.number
if (!number.isNullOrBlank()) {
phoneNumber = number
return number
}
}
} catch (ignored: Exception) {
}
}
try {
val telephonyManager = context.getSystemService(Context.TELEPHONY_SERVICE) as TelephonyManager
val number = telephonyManager.line1Number ?: ""
if (!number.isBlank()) {
phoneNumber = number
return number
}
} catch (e: Exception) {
}
return ""
}
}
}
Невеликий внесок. У моєму випадку код запустив виняток з помилками. Мені потрібно поставити анотацію, що для запуску коду, і виправити цю проблему. Ось я пустив цей код.
public static String getLineNumberPhone(Context scenario) {
TelephonyManager tMgr = (TelephonyManager) scenario.getSystemService(Context.TELEPHONY_SERVICE);
@SuppressLint("MissingPermission") String mPhoneNumber = tMgr.getLine1Number();
return mPhoneNumber;
}
Хоча можливо мати кілька облікових записів голосової пошти, коли дзвоните з власного номера, оператори направляють вас на голосову пошту. Отже, TelephonyManager.getVoiceMailNumber()
або TelephonyManager.getCompleteVoiceMailNumber()
, залежно від потрібного вам аромату.
Сподіваюсь, це допомагає.
Додайте цю залежність:
implementation 'com.google.android.gms:play-services-auth:18.0.0'
Щоб отримати список номерів телефонів, скористайтеся цим:
val hintRequest = HintRequest.Builder()
.setPhoneNumberIdentifierSupported(true)
.build()
val intent = Credentials.getClient(context).getHintPickerIntent(hintRequest)
startIntentSenderForResult(
intent.intentSender,
PHONE_NUMBER_FETCH_REQUEST_CODE,
null,
0,
0,
0,
null
)
Після натискання діалогового вікна служб відтворення:
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent? {
super.onActivityResult(requestCode, resultCode, data)
if (requestCode == PHONE_NUMBER_FETCH_REQUEST_CODE) {
data?.getParcelableExtra<Credential>(Credential.EXTRA_KEY)?.id?.let {
useFetchedPhoneNumber(it)
}
}
}
працюючи над додатком безпеки, який потребував отримання номера телефону того, хто міг би мій телефон потрапити до їхніх рук, мені довелося це зробити; 1. отримайте завантаження завершеним, а потім спробуйте отримати Line1_Number від telephonyManager, який повертає рядковий результат. 2. порівняйте результат String з моїм власним номером телефону, і якщо вони не збігаються або рядок не повертається до нуля, 3. таємно надішліть SMS, що містить результат рядка плюс спеціальний знак, на мій номер офісу. 4. якщо надсилання повідомлення не вдається, запустіть послугу та продовжуйте пробувати кожну годину, поки відправлений SMS у очікуванні наміру не буде успішним. Цими кроками я міг отримати номер людини, яка використовує мій загублений телефон. не має значення, якщо особа стягується.