Programowo uzyskaj numer telefonu z Androidem

443

Jak mogę programowo uzyskać numer telefonu urządzenia, na którym działa moja aplikacja na Androida?

jkap
źródło
nie jest to możliwe, z wyjątkiem sytuacji, gdy wprowadzisz je samodzielnie. Numer telefonu nie jest znany telefonowi ani karcie SIM, tylko przez sieć ....
tomsoft,
3
@tomsoft Pomyśl o tym ... W jaki sposób aplikacje takie jak Facebook automatycznie weryfikują twój numer telefonu?
Eddie Hart
1
@tomsoft Nie, przez większość czasu nawet nie pyta o Twój numer telefonu, a jeśli tak, to pole jest wstępnie wypełnione.
Eddie Hart,
1
@tomsoft Cóż, pewnego dnia zarejestrowałem się na Facebooku i nie poprosił o mój numer, kiedy napisał mi kod. Spróbuj. ;)
Eddie Hart
1
@EddieHart Zrób to również, a zostałem poproszony o mój numer telefonu. Potwierdza to, że ogólnie rzecz biorąc, nie jest to dostępne i niektórzy operatorzy mogą dodać te informacje podczas instalacji, ale nie jest to standardowa funkcja GMS
tomsoft,

Odpowiedzi:

484

Kod:

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

Wymagane pozwolenie:

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

Ostrzeżenia:

Zgodnie z bardzo pozytywnymi komentarzami należy pamiętać o kilku zastrzeżeniach. Może to zwrócić nulllub ""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.

Alex Volovoy
źródło
150
Właściwie nie tak idealnie. Ostatnim razem, gdy wypróbowałem tę metodę, zgłosił numer telefonu, który pierwotnie miał mój telefon, zanim mój stary numer telefonu komórkowego został do niego przeniesiony. Prawdopodobnie nadal tak jest, ponieważ aplikacja Ustawienia nadal pokazuje ten nieistniejący numer. Istnieją również doniesienia, że ​​niektóre karty SIM powodują zwrócenie tej metody null. Biorąc to pod uwagę, nie znam lepszej odpowiedzi.
CommonsWare
4
Mark ma rację. Jeśli zamierzasz użyć czegoś, co jednoznacznie identyfikuje telefon, użyłbym getDeviceId (), który zwróci IMEA dla GSM.
Alex Volovoy,
15
(Myślę, że masz na myśli IMEI ...?)
ChaimKut,
23
Testowałem go na Nexus One z systemem Android OS 2.2 i zwraca wartość null
Omar Rehman
43
Deweloperzy mogą pomyśleć, że jest to idealna odpowiedź, biorąc pod uwagę liczbę głosów. Należy dodać uwagę, aby ostrzec programistę, że ta metoda nie zawsze da numer telefonu.
Habeeb Perwad
151

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.

Johan
źródło
18
Aby zweryfikować pobrany numer, możesz wysłać sms (zawierający kod) na numer i kontrolować odpowiedź, umieszczając detektor na „android.provider.Telephony.SMS_RECEIVED”. w ten sposób możesz upewnić się, że numer jest poprawny i działa
Hossein Shahdoost,
1
Kreatywne rozwiązanie, ale możesz poinformować użytkownika, że ​​robisz to na wypadek, gdyby został za to obciążony.
Norman H,
3
Czy jest jakiś dostawca opłat za odbieranie prostych wiadomości tekstowych ?!
ThiefMaster
9
Tak, absolutnie. Przed dodaniem SMS-ów do mojego abonamentu naliczono mi 0,30 USD za otrzymaną wiadomość tekstową. Rogers w Kanadzie.
John Kroetch,
44

Aktualizacja: ta odpowiedź nie jest już dostępna, ponieważ Whatsapp przestał wyświetlać numer telefonu jako nazwę konta, uprzejmie zignoruj ​​tę odpowiedź.

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ź actypekonto 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.

Chor Wai Chun
źródło
1
Właśnie to widziałem dzisiaj, gdy bałaganiłem kont. To bardzo źle, że liczba jest w ten sposób ujawniona. Oczywiście potrzebujesz uprawnień GET_ACCOUNTS, a użytkownik prawdopodobnie nie dba o to, jakie uprawnienia ma aplikacja.
jargetz
9
To rozwiązanie jest nieaktualne, Whatsapp nie zapisuje już numeru telefonu w nazwie konta, czy wiesz, gdzie WhatsApp zapisuje numer telefonu po nowej aktualizacji?
Cohelad,
@Chelhelad, dziękuję za aktualizację, później sprawdzę i przekreślę tę odpowiedź po potwierdzeniu, tymczasem nie mam pojęcia, gdzie zapisują numer
Chor Wai Chun 18'14
3
Ale Viber NARAŻA numer! com.viber.voip.account
xnagyg
32

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:

  1. Uzyskaj numer telefonu użytkownika jako ręczne wprowadzenie od użytkownika.
  2. Wyślij kod na numer telefonu komórkowego użytkownika SMS-em.
  3. Poproś użytkownika o wprowadzenie kodu w celu potwierdzenia numeru telefonu.
  4. Zapisz numer w preferencjach wspólnych.

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.

Nishanthi Grashia
źródło
Ta odpowiedź obejmuje wszystkie czynniki, powinna być zaakceptowana =)
Slava Fomin II
Jak mogę uzyskać numer telefonu komórkowego, jeśli na telefonie jest dostępna podwójna karta SIM? z powyższym kodem. Dla pojedynczej karty SIM działa dobrze
Amrit Chakradhari
26

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:

wprowadź opis zdjęcia tutaj

Dmide
źródło
2
Wskazówka Podpowiedź pokazuje numer telefonu z konta e-mail połączonego z telefonem, wyświetli listę rozwijaną, nawet jeśli w urządzeniu nie ma karty SIM.
Ari
w jaki sposób okno dialogowe pokazuje wiele numerów, gdy jest tylko jedna karta SIM? Dla mnie pokazuje 5 liczb. : / :)
cgr
jak możemy automatycznie wybrać pierwszy numer telefonu w Androidzie?
Noorul
13
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

Emil Hajric
źródło
@JaredBurrows z powodu „s.substring (2)”.
Cookie Monster
1
to nie działa dla mnie. Dostaję wartość NULL (wschodnia karta SIM, Szwajcaria)
e-natura
twój link jest zepsuty.
Ümañg ßürmån
11

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);
} 
Wirować
źródło
Wymaga to Firebase
Vlad
@Vlad Nie, nie ma. Wymaga to tylko usług Google Play, które są dostarczane z większością urządzeń. Cytat z postu na blogu: „Zanim zaczniesz, musisz zbudować i przetestować to urządzenie z numerem telefonu, które może odbierać SMS-y i obsługuje usługi Google Play 10.2.xi wyższe”.
Wirling
9

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”.

user_CC
źródło
Mój też, co to za warunek? Roaming A może karta SIM po prostu nie ma zapisanego numeru.
Alexandre Marcondes
8

Czasami poniżej kodu zwraca nulllub 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!

activesince93
źródło
Czy mogę zapytać: w drugim fragmencie, który jest numerem komórki?
iOSAndroidWindowsMobileAppsDev
1
Wartość String s1będzie numerem telefonu.
activesince93
Ten kod nie działa dla mnie. (Twój ostatni fragment kodu). Zwraca pusty ciąg.
Kristy Welsh
Proszę wyjaśnić swoją odpowiedź. Gdzie jest przechowywany numer i jak go zawiera? Zależy od czego?
not2qubit
3
@ not2qubit Wydaje mi się, że uzyskuje dostęp do samodzielnego kontaktu w aplikacji Kontakty
Samplasion
4

To jest bardziej uproszczona odpowiedź:

public String getMyPhoneNumber()
{
    return ((TelephonyManager) getSystemService(TELEPHONY_SERVICE))
            .getLine1Number();
}
EP Lewis
źródło
3

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

  1. Ta metoda działa tylko w Redmi 2 Prime, ale w tym celu należy dodać zezwolenie na kontakt do odczytu w manifeście.

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();
    }
  1. W moich badaniach odkryłem wcześniej, że można uzyskać numer telefonu komórkowego za pomocą konta WhatsApp, ale teraz nowa wersja Whatsapp nie przechowuje numeru telefonu komórkowego użytkownika.

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ć.

  1. Jeśli chcesz zidentyfikować urządzenie użytkownika, w tym celu możesz łatwo uzyskać numer IMEI urządzenia.
ramkrishna kushwaha
źródło
2

TelephonyManagernie 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ć.

Naveed Ahmad
źródło
1
Ale ta metoda jest podatna na błędy. Użytkownik może wprowadzić nieprawidłowy numer.
Zohra Khan,
3
tak, w tym celu użyłem SMS-a, gdy użytkownik wprowadzi numer, więc od SmsManager sama wiadomość aplikacji, a dzięki temu możemy użyć smsReciever, aby uzyskać oryginalny numer
Naveed Ahmad
1
Mam jeszcze jedno pytanie .. przy użyciu tej metody użytkownik pobierze opłatę SMS (jeśli nie jest to bezpłatny numer) .. Czy jest jakaś inna metoda, na którą nie mogę uzyskać numeru telefonu użytkownika?
Zohra Khan
Tak, oczywiście, że za ten SMS zostanie naliczona pewna opłata, jeśli numer nie jest numerem bezpłatnym.
Naveed Ahmad
Nie, myślę, że do tej pory nie ma takiej metody bez TelephonyManager. i zwracam uwagę na problem z TelephoneManager w mojej odpowiedzi.
Naveed Ahmad
2

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 ""
        }
    }
}
programista Androida
źródło
pl zobacz komentarze do tej odpowiedzi stackoverflow.com/a/48210130/5457916 , przed wdrożeniem tej metody
humble_wolf
Podany przez Ciebie link to tylko część tego, co tutaj zrobiłem. Tutaj najpierw sam próbowałem go wypełnić. I wycofaj się z tego.
programista Androida
Wiem, proszę pana, twoja odpowiedź jest świetna i nie jest niepoprawna w żadnym sensie, chciałem tylko, aby czytelnicy byli świadomi warunków, które przychodzą w ten sposób, np. Może to wypełnić liczbę związaną z twoim kontem Google itp. Wymienioną w komentarzach tam.
humble_wolf
Nadal wolę to, co napisałem. Przepraszamy
programista Androida
1

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;
}
Ariel Alejandro Wagner
źródło
0

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.

Jim
źródło
5
nie ma funkcji „getCompleteVoiceMailNumber”, a funkcja getVoiceMailNumber () zwraca liczbę inną niż rzeczywista liczba telefonu.
programista Androida
Jest to sztuczka, która działa tylko z kilkoma operatorami mobilnymi na świecie. Ale technicznie może to być obejście.
technik
0

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)
        }
    }
}
Reyaz Ahmad
źródło
-6

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.

Promień
źródło
dlaczego przegłosować?
humble_wolf