Jak mogę programowo uzyskać numer telefonu urządzenia, na którym działa moja aplikacja na Androida?
Jak mogę programowo uzyskać numer telefonu urządzenia, na którym działa moja aplikacja na Androida?
Odpowiedzi:
Kod:
TelephonyManager tMgr = (TelephonyManager)mAppContext.getSystemService(Context.TELEPHONY_SERVICE);
String mPhoneNumber = tMgr.getLine1Number();
Wymagane pozwolenie:
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
Zgodnie z bardzo pozytywnymi komentarzami należy pamiętać o kilku zastrzeżeniach. Może to zwrócić null
lub ""
nawet "???????"
, i może zwrócić nieaktualny numer telefonu, który nie jest już ważny. Jeśli chcesz czegoś, co jednoznacznie identyfikuje urządzenie, powinieneś użyć getDeviceId()
zamiast tego.
null
. Biorąc to pod uwagę, nie znam lepszej odpowiedzi.
Nie ma gwarantowanego rozwiązania tego problemu, ponieważ numer telefonu nie jest fizycznie przechowywany na wszystkich kartach SIM ani nadawany z sieci do telefonu. Jest to szczególnie prawdziwe w niektórych krajach, które wymagają fizycznej weryfikacji adresu, a przypisanie numeru następuje dopiero później. Przypisanie numeru telefonu odbywa się w sieci - i można je zmienić bez zmiany karty SIM lub urządzenia (np. W ten sposób obsługiwane jest portowanie).
Wiem, że to ból, ale najprawdopodobniej najlepszym rozwiązaniem jest poproszenie użytkownika o jednorazowe wprowadzenie numeru telefonu i zapisanie go.
Istnieje alternatywne rozwiązanie, które możesz rozważyć, jeśli nie możesz uzyskać go za pośrednictwem usługi telefonii.
Na dzień dzisiejszy możesz polegać na innej dużej aplikacji Whatsapp AccountManager
. Miliony urządzeń ma zainstalowaną tę aplikację, a jeśli nie możesz uzyskać numeru telefonu TelephonyManager
, możesz spróbować.
Pozwolenie:
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
Kod:
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);
}
Sprawdź actype
konto WhatsApp
if(actype.equals("com.whatsapp")){
String phoneNumber = ac.name;
}
Oczywiście możesz go nie dostać, jeśli użytkownik nie zainstalował WhatsApp, ale i tak warto spróbować. I pamiętaj, że zawsze powinieneś poprosić użytkownika o potwierdzenie.
Jak napisano w mojej wcześniejszej odpowiedzi
Użyj poniższego kodu:
TelephonyManager tMgr = (TelephonyManager)mAppContext.getSystemService(Context.TELEPHONY_SERVICE);
String mPhoneNumber = tMgr.getLine1Number();
W AndroidManifest.xml udziel następujące uprawnienia:
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
Pamiętaj jednak, że ten kod nie zawsze działa, ponieważ numer telefonu komórkowego zależy od karty SIM i operatora sieci / operatora komórkowego.
Spróbuj także sprawdzić w Telefon -> Ustawienia -> Informacje -> Tożsamość telefonu , Jeśli możesz wyświetlić tam numer, prawdopodobieństwo uzyskania numeru telefonu z powyższego kodu jest wyższe. Jeśli nie możesz wyświetlić numeru telefonu w ustawieniach, nie będziesz w stanie uzyskać tego kodu!
Sugerowane obejście:
Wykonaj powyższe 4 kroki jako jednorazowe działanie podczas pierwszego uruchomienia aplikacji. Później, gdy wymagany jest numer telefonu, użyj wartości dostępnej w preferencjach wspólnych.
Tak właśnie prosisz o numer telefonu za pośrednictwem interfejsu API usług Play bez zgody i włamań. Źródło i pełny przykład .
W twoim build.gradle (wymagana wersja 10.2.xi wyższa):
compile "com.google.android.gms:play-services-auth:$gms_version"
W twojej działalności (kod jest uproszczony):
@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;
}
}
To wygeneruje takie okno dialogowe:
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;
}
Kod pochodzi z http://www.androidsnippets.com/get-my-phone-number
Istnieje nowy interfejs API Androida, który pozwala użytkownikowi wybrać numer telefonu bez konieczności uzyskania pozwolenia. Spójrz na: 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);
}
Po prostu chcę tutaj dodać trochę do powyższych wyjaśnień w powyższych odpowiedziach. Co pozwoli zaoszczędzić czas także innym.
W moim przypadku ta metoda nie zwróciła żadnego numeru telefonu komórkowego, zwrócony został pusty ciąg. Stało się tak z powodu przeniesienia mojego numeru na nową kartę SIM. Jeśli więc przejdę do opcji Ustawienia> Informacje o telefonie> Status> Mój numer telefonu, wyświetli się komunikat „Nieznany”.
Czasami poniżej kodu zwraca null
lub pusty ciąg.
TelephonyManager tMgr = (TelephonyManager)mAppContext.getSystemService(Context.TELEPHONY_SERVICE);
String mPhoneNumber = tMgr.getLine1Number();
Z poniższym pozwoleniem
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
Jest inny sposób na uzyskanie numeru telefonu. Nie testowałem tego na wielu urządzeniach, ale powyższy kod nie działa za każdym razem.
Wypróbuj poniższy kod:
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();
}
Musisz dodać te dwa uprawnienia.
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.READ_PROFILE" />
Mam nadzieję, że to pomaga, dzięki!
String s1
będzie numerem telefonu.
Po pierwsze uzyskanie numeru telefonu komórkowego przez użytkowników jest niezgodne z zasadami etycznymi, wcześniej było to możliwe, ale teraz, zgodnie z moimi badaniami, nie ma na to solidnego rozwiązania. Za pomocą kodu można uzyskać numer telefonu komórkowego, ale nie ma gwarancji, że zadziała. tylko w kilku urządzeniach. Po wielu badaniach znalazłem tylko trzy rozwiązania, ale nie działają one we wszystkich urządzeniach.
Istnieje następujący powód, dla którego nie otrzymujemy.
1.Urządzenie z Androidem i nowa karta SIM nie zapisuje numeru telefonu komórkowego, jeśli numer telefonu komórkowego nie jest dostępny w urządzeniu i w karcie SIM, w jaki sposób można uzyskać numer, jeśli dowolną starą kartę SIM posiadającą numer telefonu komórkowego, a następnie za pomocą Menedżera telefonii możemy uzyskać numer inny mądre zwróci „null” lub „” lub „??????”
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
TelephonyManager tel= (TelephonyManager)this.getSystemService(Context.
TELEPHONY_SERVICE);
String PhoneNumber = tel.getLine1Number();
Uwaga: - Testowałem to rozwiązanie w następujących urządzeniach Moto X, Samsung Tab 4, Samsung S4, Nexus 5 i Redmi 2 Prime, ale nie działa ono za każdym razem, gdy zwraca pusty ciąg, więc wniosek jest bezużyteczny
Uwaga: - To również nie jest gwarantowane i wydajne rozwiązanie, przetestowałem to rozwiązanie na wielu urządzeniach, ale działało tylko w Redmi 2 prime, które jest urządzeniem dual sim, daje mi dwa numery komórkowe, pierwszy z nich jest poprawny, ale drugi nie jest należą do mojej drugiej karty SIM, należą do mojej starej karty SIM, której nie używam.
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();
}
Wniosek : - Android nie ma żadnego gwarantowanego rozwiązania umożliwiającego programowe uzyskanie numeru telefonu komórkowego użytkownika.
Sugestia : - 1. Jeśli chcesz zweryfikować numer telefonu komórkowego użytkownika, poproś go o podanie jego numeru. Za pomocą otp możesz to sprawdzić.
- Jeśli chcesz zidentyfikować urządzenie użytkownika, w tym celu możesz łatwo uzyskać numer IMEI urządzenia.
TelephonyManager
nie jest właściwym rozwiązaniem, ponieważ w niektórych przypadkach numer nie jest przechowywany na karcie SIM. Sugeruję, abyś korzystał ze wspólnych preferencji, aby przechowywać numer telefonu użytkownika po raz pierwszy aplikacja jest otwarta, a numer zostanie użyty, kiedy będziesz potrzebować.
Oto kombinacja rozwiązań, które znalazłem (przykładowy projekt tutaj , jeśli chcesz również sprawdzić automatyczne wypełnianie):
oczywisty
<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 ""
}
}
}
Mały wkład. W moim przypadku kod uruchomił wyjątek błędu. Musiałem umieścić adnotację, aby uruchomić kod i naprawić ten problem. Tutaj pozwalam na ten kod.
public static String getLineNumberPhone(Context scenario) {
TelephonyManager tMgr = (TelephonyManager) scenario.getSystemService(Context.TELEPHONY_SERVICE);
@SuppressLint("MissingPermission") String mPhoneNumber = tMgr.getLine1Number();
return mPhoneNumber;
}
Chociaż możliwe jest posiadanie wielu kont poczty głosowej, dzwoniąc z własnego numeru, przewoźnicy kierują Cię do poczty głosowej. Więc TelephonyManager.getVoiceMailNumber()
lubTelephonyManager.getCompleteVoiceMailNumber()
, w zależności od potrzebnego smaku.
Mam nadzieję że to pomoże.
Dodaj tę zależność:
implementation 'com.google.android.gms:play-services-auth:18.0.0'
Aby pobrać listę numerów telefonów, użyj tego:
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
)
Po dotknięciu okna dialogowego usług odtwarzania:
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)
}
}
}
pracując nad aplikacją zabezpieczającą, która musiała uzyskać numer telefonu, od którego mój telefon mógł dostać się w ich ręce, musiałem to zrobić; 1. otrzymaj Boot zakończony, a następnie spróbuj uzyskać Line1_Number z telephonyManager, który zwraca wynik ciągu. 2. porównaj wynik Ciąg z moim własnym numerem telefonu, a jeśli się nie zgadzają lub ciąg zwraca wartość null, 3. potajemnie wyślij SMS-a zawierającego wynik ciągu plus specjalny znak na mój numer biura. 4. jeśli wysyłanie wiadomości nie powiedzie się, uruchom usługę i próbuj po każdej godzinie, aż do wysłania wiadomości SMS oczekującej na powrót. Dzięki tym krokom mogę uzyskać numer osoby używającej mojego zgubionego telefonu. nie ma znaczenia, czy dana osoba jest obciążona.