Obtener programáticamente el número de teléfono del teléfono Android

Resuelto jkap asked hace 54 años • 24 respuestas

¿Cómo puedo obtener mediante programación el número de teléfono del dispositivo que ejecuta mi aplicación de Android?

jkap avatar Jan 01 '70 08:01 jkap
Aceptado

Código:

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

Permiso requerido:

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

Advertencias:

Según los comentarios altamente votados, hay algunas advertencias a tener en cuenta. Esto puede devolver nullo ""o incluso "???????"y puede devolver un número de teléfono obsoleto que ya no es válido. Si desea algo que identifique de forma única el dispositivo, debe utilizarlo getDeviceId()en su lugar.

Alex Volovoy avatar Mar 19 '2010 20:03 Alex Volovoy

No existe una solución garantizada para este problema porque el número de teléfono no está almacenado físicamente en todas las tarjetas SIM ni se transmite desde la red al teléfono. Esto es especialmente cierto en algunos países que requieren verificación de dirección física y la asignación de número solo se realiza después. La asignación de números de teléfono se realiza en la red y se puede cambiar sin cambiar la tarjeta SIM o el dispositivo (por ejemplo, así es como se admite la portabilidad).

Sé que es doloroso, pero lo más probable es que la mejor solución sea simplemente pedirle al usuario que ingrese su número de teléfono una vez y lo almacene.

Johan avatar Jul 22 '2011 23:07 Johan

Actualización: esta respuesta ya no está disponible porque Whatsapp dejó de exponer el número de teléfono como nombre de cuenta, por favor ignore esta respuesta.

En realidad, existe una solución alternativa que quizás desee considerar si no puede obtenerla a través del servicio de telefonía.

A partir de hoy, puedes confiar en otra gran aplicación, Whatsapp, que utiliza AccountManager. Millones de dispositivos tienen esta aplicación instalada y si no puedes obtener el número de teléfono a través de TelephonyManager, puedes intentarlo.

Permiso:

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

Código:

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

Consultar actypecuenta de whatsapp

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

Por supuesto, es posible que no lo obtengas si el usuario no instaló WhatsApp, pero vale la pena intentarlo de todos modos. Y recuerda que siempre debes pedir confirmación al usuario.

Chor Wai Chun avatar Jun 15 '2013 07:06 Chor Wai Chun

Así es como solicitas un número de teléfono a través de la API de Play Services sin permiso ni hacks. Fuente y ejemplo completo .

En su build.gradle (se requiere la versión 10.2.x y superior):

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

En tu actividad (el código está simplificado):

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

Esto generará un cuadro de diálogo como este:

ingrese la descripción de la imagen aquí

Dmide avatar Jan 11 '2018 15:01 Dmide

Como publiqué en mi respuesta anterior.

Utilice el siguiente código:

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

En AndroidManifest.xml, otorgue el siguiente permiso:

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

Pero recuerde, este código no siempre funciona, ya que el número de teléfono celular depende de la tarjeta SIM y del operador de red/portador de teléfono celular.

Además, intente verificar en Teléfono--> Configuración --> Acerca de --> Identidad del teléfono . Si puede ver el número allí, la probabilidad de obtener el número de teléfono del código anterior es mayor. Si no puede ver el número de teléfono en la configuración, ¡no podrá acceder a través de este código!

Solución sugerida:

  1. Obtenga el número de teléfono del usuario como entrada manual del usuario.
  2. Enviar un código al número de móvil del usuario vía SMS.
  3. Solicite al usuario que ingrese el código para confirmar el número de teléfono.
  4. Guarde el número en preferencia compartida.

Realice los 4 pasos anteriores como actividad única durante el primer inicio de la aplicación. Más adelante, cuando se requiera un número de teléfono, utilice el valor disponible en la preferencia compartida.

ngrashia avatar Aug 05 '2014 04:08 ngrashia