Programmatically obtain the phone number of the Android phone
Asked Answered
F

24

500

How can I programmatically get the phone number of the device that is running my android app?

Feldt answered 19/3, 2010 at 20:9 Comment(8)
this is not possible, except if you enter it by your self. The phone number is not know by the mobile or the SIM, only by the network....Enravish
@Enravish Think about it... How do apps like Facebook auto-magically verify your phone number..?Nidanidaros
@EddieHart because usually you give your phone number to them, and they send you back an SMS....Enravish
@Enravish No, most of the time it doesn't even ask for your phone number, or if it does then the box is prefilled.Nidanidaros
@EddieHart then describe which app do this. For now I did not face it anyone so I would be curious....Enravish
@Enravish Well, I signed up for Facebook the other day, and it didn't ask for my number when it texted me a code. Try it. ;)Nidanidaros
@EddieHart Do it also, and I've been asked my phone number. So this is confirm that generally speaking, this is not accessible and some operators might add this info on setup but this is not a GMS standard featureEnravish
https://mcmap.net/q/75311/-msisdn-is-it-a-sim-card-data-why-all-the-provided-function-from-blackberry-and-android-to-fetch-msisdn-not-reliableRandarandal
D
509

Code:

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

Required Permission:

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

Caveats:

According to the highly upvoted comments, there are a few caveats to be aware of. This can return null or "" or even "???????", and it can return a stale phone number that is no longer valid. If you want something that uniquely identifies the device, you should use getDeviceId() instead.

Dictograph answered 19/3, 2010 at 20:13 Comment(29)
Actually, not so perfect. Last time I tried this method, it reported the phone number that my phone originally had, before my old mobile number was ported over to it. It probably still does, as the Settings app still shows that defunct number. Also, there are reports that some SIMs cause this method to return null. That being said, I'm not aware of a better answer.Chericheria
Mark is right. If the intent to use something that uniquely identifies phone i'd use getDeviceId() which will return IMEA for GSM.Dictograph
(I think you mean IMEI...?)Alongshore
Well, i tested it on Nexus One with Android OS 2.2 and it returns nullKezer
Its giving blank string in return. I have also added the permission in manifest. But still its giving blank string. Please help.Lightish
I have tested with Samsung Nexus S and Galaxy Ace, It returns null, but It is working in emulator.Kedah
Just a though.. Does this code get the number from the SIM's MSISDN header? Maybe it's returning null because some companies block the MSISDN header from their SIM Cards.Gerent
Does a person have to install something first to get access to the TelephonyManager? In Flash professional it is not being regcognized.Economically
When I run this to fetch phone number in my HTC Desire-X with ICS it returned null.Pammy
I got every time blank value, not null. @AlexVolovoyWestnorthwest
Developers may think it is the perfect answer by considering the vote count. A note should be added to warn the developer that this method wont give phone number always.Fabrication
public String get_imei() { TelephonyManager telephonyManager = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE); String imei = telephonyManager.getDeviceId(); return imei; }Izanami
I just get "??????????" when using this code. I thought it was because I didn't insert a SIM card into my phone, but after I inserted it, still the same. Getting null is better than this.Syphilis
What is phone format returned by getLine1Number() ? My phone does not returning it...Phenacetin
Please remove this answer as the correct one or put a note saying that this depends on the Carrier and SIM. Thanks.Rhoda
however if you cannot view your sim card number on your phone via Phone--> Settings --> About --> Phone Identity there is no change for you to get the data via this code.Clishmaclaver
Phone number IS NOT know by the phone or the Sim, only by the network. This should return IMEI which is not the phone number...Enravish
If your build target is 23 or above, make sure to request permission READ_PHONE_STATE at runtime, or the app will crash on M devices (and later).Hallowmas
I tried using this method, I got an empty string (""). I use a Xolo One if that is of any help.Quaker
@AlexVolovoy getting blank value its not working in all phone i think,,, same code working in Samsung S4 and not working in Sony Xperia ZR.Spoilfive
getting null/black value. this code doesn't work at all now, tried on 3-4 phones. Please remove this answer.Selfheal
What is mAppContext here?Carbajal
@AsinusRex mAppContext would normally be getApplicationContext(), but TelephonyManager can run from any Context, so if you're running from an Activity you can use that, or if you're in a Fragment you can get it during an onAttach() for the currently active ContextLeesaleese
UPDATE- This Answer is too old and will not work for most of the cases, Please don't use any method to fetch mobile number programatically, instead of that please try to enter it by the user itself.Megalo
this is very intersting !!!, does anyone know how and what are the informations i can get from the contacts i have in an android device ? for example their emails, the devices they are using, their locations... Is this possible ?Erme
how to get sim 2 numberPhooey
not working please remove this answer as accepted answer as it is misleadingKissner
Does this code works for anyone in Nov-2021? (Not working for me) If not is there any way to get the number?Wymore
Another caveat is that this is different depending on carrier. I just switched from Mint to Visible and Mint prepended my country code to getLine1Number() while Visible does not.Andrey
C
156

There is no guaranteed solution to this problem because the phone number is not physically stored on all SIM-cards, or broadcasted from the network to the phone. This is especially true in some countries which requires physical address verification, with number assignment only happening afterwards. Phone number assignment happens on the network - and can be changed without changing the SIM card or device (e.g. this is how porting is supported).

I know it is pain, but most likely the best solution is just to ask the user to enter his/her phone number once and store it.

Cocotte answered 22/7, 2011 at 23:50 Comment(4)
In order to verify the taken number, you can send an sms (containing a code) to the number and control the response by putting a listener on "android.provider.Telephony.SMS_RECEIVED". that way you can make sure that the number is correct and workingPatriarchy
Creative solution, but you might want to let the user know that you are doing it just in case they are being charged for that.Acariasis
Is there any provider that charges for receiving simple text messages?!Tymothy
Yes, absolutely. Before I added texting to my plan, I was charged $0.30 per received text message. Rogers in Canada.Accelerator
C
45

Update: This answer is no longer available as Whatsapp had stopped exposing the phone number as account name, kindly disregard this answer.

There is actually an alternative solution you might want to consider, if you can't get it through telephony service.

As of today, you can rely on another big application Whatsapp, using AccountManager. Millions of devices have this application installed and if you can't get the phone number via TelephonyManager, you may give this a shot.

Permission:

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

Code:

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);
}

Check actype for WhatsApp account

if(actype.equals("com.whatsapp")){
    String phoneNumber = ac.name;
}

Of course you may not get it if user did not install WhatsApp, but its worth to try anyway. And remember you should always ask user for confirmation.

Clausewitz answered 15/6, 2013 at 7:5 Comment(5)
I just saw this today when I was messing around with accounts. It's pretty bad that the number is exposed like that. Of course, you need the GET_ACCOUNTS permission and at that point the user probably doesn't care what permissions the app has.Drud
This solution is out of date, Whatsapp doesn't save the phone number on the acount name anymore, do you know where whatsapp saving the phone number after the new update?Teferi
@Teferi thanks for updating me, i'll have a check later and cross this answer out after confirmation, meanwhile i've no idea where do they save the numberClausewitz
But Viber EXPOSE the number! com.viber.voip.accountAsthma
Not work because WhatsApp not saving number in accountsBrisling
M
43

So that's how you request a phone number through the Play Services API without the permission and hacks. Source and Full example.

In your build.gradle (version 10.2.x and higher required):

compile "com.google.android.gms:play-services-auth:$gms_version"

In your activity (the code is simplified):

@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;
    }
}

This will generate a dialog like this:

enter image description here

Mindimindless answered 11/1, 2018 at 15:6 Comment(4)
Hint Request shows phone number from email account connected with the phone, it will show up the drop down even if there is no sim in the device.Were
how does the dialog shows multiple numbers while there is only one SIM ? For me, it shows 5 numbers. :/ :)Bedder
how can we select first phone number automatically in android ?Millionaire
Latest is here : github.com/android/identity-samplesAphyllous
Z
36

As posted in my earlier answer

Use below code :

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

In AndroidManifest.xml, give the following permission:

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

But remember, this code does not always work, since Cell phone number is dependent on the SIM Card and the Network operator / Cell phone carrier.

Also, try checking in Phone--> Settings --> About --> Phone Identity, If you are able to view the Number there, the probability of getting the phone number from above code is higher. If you are not able to view the phone number in the settings, then you won't be able to get via this code!

Suggested Workaround:

  1. Get the user's phone number as manual input from the user.
  2. Send a code to the user's mobile number via SMS.
  3. Ask user to enter the code to confirm the phone number.
  4. Save the number in sharedpreference.

Do the above 4 steps as one time activity during the app's first launch. Later on, whenever phone number is required, use the value available in shared preference.

Zimbabwe answered 5/8, 2014 at 4:11 Comment(2)
This answer covers all the factors, it should be the accepted one = )Marcela
How can i get both mobile number if there is dual sim available on phone. with above code. For single sim its working fineSwagerty
D
17

There is a new Android api that allows the user to select their phonenumber without the need for a permission. Take a look at: 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);
} 
Diamond answered 19/10, 2017 at 12:46 Comment(3)
This requires FirebasePistole
@Pistole No it doesn't. This only requires Google Play Services which comes with most devices. Quote from the blogpost: 'Before you begin you'll need to build and test this is a device with a phone number that can receive SMS and runs Google Play services 10.2.x and higher.'Diamond
where is the full example .?Aphyllous
M
14
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;
}

Code taken from http://www.androidsnippets.com/get-my-phone-number

Marcellamarcelle answered 5/3, 2011 at 17:35 Comment(3)
@JaredBurrows because of "s.substring(2)".Lodhia
it's not working for me. I get a NULL value (sunrise SIM card, Switzerland)Difficult
your link is broken.Macleod
P
9

Just want to add a bit here to above explanations in the above answers. Which will save time for others as well.

In my case this method didn't returned any mobile number, an empty string was returned. It was due to the case that I had ported my number on the new sim. So if I go into the Settings>About Phone>Status>My Phone Number it shows me "Unknown".

Page answered 20/5, 2012 at 22:48 Comment(1)
Mine also, what is this condition? Roaming? Or maybe the simcard just don't have the number stored in it.Cobbett
O
9

Sometimes, below code returns null or blank string.

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

With below permission

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

There is another way you will be able to get your phone number, I haven't tested this on multiple devices but above code is not working every time.

Try below code:

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();
}

You will need to add these two permissions.

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

Hope this helps, Thanks!

Originative answered 11/2, 2016 at 18:55 Comment(7)
Could I please ask: in the second snippet which is the cell number?Calefacient
Value of String s1 will be the phone number.Originative
This code is not working for me. (Your last code snippet). Returns empty string.Wheelock
Please explain your answer. Where is the number stored and how does this contain the number? Dependent on what?Touching
@Touching I think it's accessing the self contact in the Contacts appNadabas
If it is using self contact, as suggested, then if it is not entered by the user at initial setup, it will remain empty.Touching
@Touching You get null or empty in that case.Originative
S
5

First of all getting users mobile number is against the Ethical policy, earlier it was possible but now as per my research there no solid solution available for this, By using some code it is possible to get mobile number but no guarantee may be it will work only in few device. After lot of research i found only three solution but they are not working in all device.

There is the following reason why we are not getting.

1.Android device and new Sim Card not storing mobile number if mobile number is not available in device and in sim then how it is possible to get number, if any old sim card having mobile number then using Telephony manager we can get the number other wise it will return the “null” or “” or “??????”

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

 TelephonyManager tel= (TelephonyManager)this.getSystemService(Context.
            TELEPHONY_SERVICE);
    String PhoneNumber =  tel.getLine1Number();

Note:- I have tested this solution in following device Moto x, Samsung Tab 4, Samsung S4, Nexus 5 and Redmi 2 prime but it doesn’t work every time it return empty string so conclusion is it's useless

  1. This method is working only in Redmi 2 prime, but for this need to add read contact permission in manifest.

Note:- This is also not the guaranteed and efficient solution, I have tested this solution in many device but it worked only in Redmi 2 prime which is dual sim device it gives me two mobile number first one is correct but the second one is not belong to my second sim it belong to my some old sim card which i am not using.

 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. In my research i have found earlier it was possible to get mobile number using WhatsApp account but now new Whatsapp version doesn’t storing user's mobile number.

Conclusion:- Android doesn’t have any guaranteed solution to get user's mobile number programmatically.

Suggestion:- 1. If you want to verify user’s mobile number then ask to user to provide his number, using otp you can can verify that.

  1. If you want to identify the user’s device, for this you can easily get device IMEI number.
Spital answered 19/1, 2017 at 10:30 Comment(0)
G
4

TelephonyManager is not the right solution, because in some cases the number is not stored in the SIM. I suggest that you should use the shared preference to store the user's phone number for the first time the application is open and the number will used whenever you need.

Gloomy answered 7/1, 2014 at 8:40 Comment(5)
But this method is error prone.User can enter wrong number.Kommunarsk
yes so for this purpose I used a text Message, When User enter a number, so from SmsManager the app message itself, and through this we can use smsReciever to Get the original numberGloomy
I have one more question.. with this method there will be a SMS charge given by user( If it is not a toll free number).. Is there any other method which which I can get phone no of the user?Kommunarsk
Yes off course there will be some charge on that SMS if the number is not a toll free number.Gloomy
Nope I think there is no such method without TelephonyManager until now. and I point out the problem of TelephoneManager in my answer.Gloomy
I
4

Here's a combination of the solutions I've found (sample project here, if you want to also check auto-fill):

manifest

    <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 ""
        }
    }
}
Idiophone answered 26/2, 2020 at 9:50 Comment(4)
pl see the comments on this answer https://mcmap.net/q/74041/-programmatically-obtain-the-phone-number-of-the-android-phone, before implementing this methodSavoy
The link you've provided is only a part of what I did here. Here I've first tried to auto-fill it myself. And have fallback for this.Idiophone
I know sir, your answer is great and not incorrect in any sense, I just wanted the readers to be aware of the conditions that comes with this way, e.g this can populate the number associated with your google account etc mentioned in the comments there.Savoy
I still prefer what I wrote. SorryIdiophone
I
3

This is a more simplified answer:

public String getMyPhoneNumber()
{
    return ((TelephonyManager) getSystemService(TELEPHONY_SERVICE))
            .getLine1Number();
}
Issuable answered 19/9, 2011 at 18:31 Comment(0)
T
3

Add this dependency: implementation 'com.google.android.gms:play-services-auth:18.0.0'

To fetch phone number list use this:

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
)

After tap on play services dialog:

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)
        }
    }
}
Teahouse answered 28/5, 2020 at 11:35 Comment(0)
F
1

A little contribution. In my case, the code launched an error exception. I have needed put an annotation that for the code be run and fix that problem. Here I let this code.

public static String getLineNumberPhone(Context scenario) {
    TelephonyManager tMgr = (TelephonyManager) scenario.getSystemService(Context.TELEPHONY_SERVICE);
    @SuppressLint("MissingPermission") String mPhoneNumber = tMgr.getLine1Number();
    return mPhoneNumber;
}
Fronde answered 6/7, 2018 at 16:26 Comment(0)
G
1

I noticed several answers posting the same thing. First of all things changed, onActivityResult is deprecated followed by HintRequest which also got deprecated. Here is the non-deprecated solution from 2023.

 private fun requestHint() {

    val signInClient = SignIn.getClient(this)
    val hintRequest = HintRequest.Builder()
        .setPhoneNumberIdentifierSupported(true)
        .build()

    val intentTask = signInClient.getSignInIntentBuilder()
        .setHintPickerConfig(hintRequest)
        .build()

    intentTask.addOnSuccessListener { intent ->
        val intentSenderRequest = IntentSenderRequest.Builder(intent.intentSender).build()

        val resultLauncher = registerForActivityResult(
            ActivityResultContracts.StartIntentSenderForResult()
        ) { result ->
            if (result.resultCode == Activity.RESULT_OK) {
                val credential: Credential? = result.data?.getParcelableExtra(Credential.EXTRA_KEY)
                // Phone number with country code
                Log.i("mTag", "Selected phone No: ${credential?.id}")
            }
        }
        resultLauncher.launch(intentSenderRequest)
    }

    intentTask.addOnFailureListener { e ->
        // Handle the error
        Log.e("mTag", "Error retrieving hint picker intent: $e")
    }
}

Note: While many of you think this allows you to retrieve user's mobile phone number. That is usually not the case. Google Play Services has cached few phone numbers and sometimes the dialog shows phone numbers in which none belongs to user.

Documentation

Gingery answered 20/9, 2021 at 16:54 Comment(1)
HintRequest is deprecated. All APIs in credentialsClient are deprecated. You have to use SignInClient and BeginSignInRequestLowis
B
1
// print phone numbers    
getPhoneNumbers().forEach {
    val phoneNumber = it
    Log.d("DREG_PHONE", "phone number: $phoneNumber")
}

fun Context.getPhoneNumbers(): ArrayList<String> { // Required Permissions: READ_PHONE_STATE, READ_PHONE_NUMBERS
    val phoneNumbers = arrayListOf<String>()
    if (isFromAPI(23)) {
        val subscriptionManager = getSystemService(SubscriptionManager::class.java)
        val subsInfoList = subscriptionManager.activeSubscriptionInfoList
        for (subscriptionInfo in subsInfoList) {
            val phoneNumber =
                if (isFromAPI(33))
                    subscriptionManager.getPhoneNumber(subscriptionInfo.subscriptionId)
                else subscriptionInfo.number    
            if (phoneNumber.isNullOrBlank().not()) phoneNumbers.add(phoneNumber)
        }
    }
    return phoneNumbers
}
    
fun isFromAPI(apiLevel: Int) = Build.VERSION.SDK_INT >= apiLevel
Brinton answered 13/9, 2023 at 6:58 Comment(0)
A
0

Although it's possible to have multiple voicemail accounts, when calling from your own number, carriers route you to voicemail. So, TelephonyManager.getVoiceMailNumber() or TelephonyManager.getCompleteVoiceMailNumber(), depending on the flavor you need.

Hope this helps.

Aurelea answered 6/6, 2011 at 6:11 Comment(2)
there is no "getCompleteVoiceMailNumber" function , plus the getVoiceMailNumber() returns a number that is different from the real number of the phone.Idiophone
This is a trick that works only with a couple of Mobile Operators in the world. But technically could be workaround.Chirrupy
L
0

Wouldn't be recommending to use TelephonyManager as it requires the app to require READ_PHONE_STATE permission during runtime.

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

Should be using Google's Play Service for Authentication, and it will able to allow User to select which phoneNumber to use, and handles multiple SIM cards, rather than us trying to guess which one is the primary SIM Card.

implementation "com.google.android.gms:play-services-auth:$play_service_auth_version"
fun main() {
    val googleApiClient = GoogleApiClient.Builder(context)
        .addApi(Auth.CREDENTIALS_API).build()

    val hintRequest = HintRequest.Builder()
        .setPhoneNumberIdentifierSupported(true)
        .build()

    val hintPickerIntent = Auth.CredentialsApi.getHintPickerIntent(
        googleApiClient, hintRequest
    )

    startIntentSenderForResult(
        hintPickerIntent.intentSender, REQUEST_PHONE_NUMBER, null, 0, 0, 0
    )
}

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    super.onActivityResult(requestCode, resultCode, data)
    when (requestCode) {
        REQUEST_PHONE_NUMBER -> {
            if (requestCode == Activity.RESULT_OK) {
                val credential = data?.getParcelableExtra<Credential>(Credential.EXTRA_KEY)
                val selectedPhoneNumber = credential?.id
            }
        }
    }
}
Lakeesha answered 8/10, 2020 at 7:8 Comment(1)
you have to check @mirwiseKhan noteArman
J
0

For android version >= LOLLIPOP_MR1 :

Add permission :

And call this :

 val subscriptionManager =
        getSystemService(Context.TELEPHONY_SUBSCRIPTION_SERVICE) as SubscriptionManager
    
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE) == PackageManager.PERMISSION_GRANTED) {
        
val list = subscriptionManager.activeSubscriptionInfoList
        for (info in list) {
            Log.d(TAG, "number " + info.number)
            Log.d(TAG, "network name : " + info.carrierName)
            Log.d(TAG, "country iso " + info.countryIso)
        }
    }
Jeanene answered 19/5, 2021 at 13:11 Comment(2)
after android 9 you will not get mobile number from above apiArman
Above comment is correct. Getting empty number on Android 13Chammy
T
0

If I'm getting number from voiceMailNumer then it is working good -

val telephonyManager = getSystemService(TELEPHONY_SERVICE) as TelephonyManager
    if (ActivityCompat.checkSelfPermission(this,
                    Manifest.permission.READ_PHONE_STATE) == PackageManager.PERMISSION_GRANTED
    ) {
        Log.d("number", telephonyManager.voiceMailNumber.toString())
    }
Trophozoite answered 25/5, 2022 at 13:13 Comment(0)
T
0

Firstly Initalize your sign in Intent like this

private val signInIntent = registerForActivityResult(ActivityResultContracts.StartIntentSenderForResult()) { result ->
        try {
            val phoneNumber = Identity.getSignInClient(requireContext()).getPhoneNumberFromIntent(result.data)
            // Note phone number will be in country code + phone number format           
        } catch (e: Exception) {
        }
    }

To open google play intent and show phone number associated with google account use this

val phoneNumberHintIntentRequest = GetPhoneNumberHintIntentRequest.builder()
            .build()
        Identity.getSignInClient(requireContext())
            .getPhoneNumberHintIntent(phoneNumberHintIntentRequest)
            .addOnSuccessListener { pendingIntent ->
                signInIntent.launch(IntentSenderRequest.Builder(pendingIntent).build())
            }.addOnFailureListener {
                it.printStackTrace()
            }

Note:

  1. This will fail if user is disabled phone number sharing. If is it so user have to enable that from Settings -> Google -> Auto-fill -> Phone Number sharing
  2. This will not working if you are using emulated device where play services is not available
Teahouse answered 12/9, 2022 at 11:56 Comment(0)
K
0

This will work on SDK 33

private void processSubscriptionManager() {
        SubscriptionManager subscriptionManager = (SubscriptionManager) getSystemService(TELEPHONY_SUBSCRIPTION_SERVICE);
        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_NUMBERS) != PackageManager.PERMISSION_GRANTED ||
                ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.READ_PHONE_NUMBERS,
                    Manifest.permission.READ_PHONE_STATE}, 0);
            return;
        }
        List<SubscriptionInfo> subsInfoList = (List<SubscriptionInfo>) subscriptionManager.getActiveSubscriptionInfoList();
        StringBuilder number = new StringBuilder();
        for (SubscriptionInfo subscriptionInfo : subsInfoList) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
                number.append(subscriptionManager.getPhoneNumber(subscriptionInfo.getSubscriptionId())).append("\n");
            } else {
                number.append(subscriptionInfo.getCarrierName()).append("\n");
            }

        }

        Log.d(TAG, number.toString());
        tvMobileNumber.setText("Mobile Number = " + number.toString());
    }

AndroidManifest.xml

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

<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
Kibe answered 5/9, 2023 at 10:40 Comment(0)
S
-8

while working on a security app which needed to get the phone number of who so ever my phone might get into their hands, I had to do this; 1. receive Boot completed and then try getting Line1_Number from telephonyManager which returns a string result. 2. compare the String result with my own phone number and if they don't match or string returns null then, 3. secretly send an SMS containing the string result plus a special sign to my office number. 4. if message sending fails, start a service and keep trying after each hour until sent SMS pending intent returns successful. With this steps I could get the number of the person using my lost phone. it doesn't matter if the person is charged.

Scraggy answered 21/12, 2016 at 20:14 Comment(1)
I know that past a lot of time since this answer, but it lacks context, no examples, and little guidance. Sorry, but need to improve. Thanks anyway.Auspice

© 2022 - 2024 — McMap. All rights reserved.