Pregunta

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

¿Fue útil?

Solución

Código:

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

El permiso requerido:

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

Advertencias:

De acuerdo con los comentarios altamente upvoted, hay algunas advertencias a tener en cuenta. Esto puede volver null o "" o incluso "???????", y puede devolver un número de teléfono rancio que ya no es válida. Si quieres algo que identifica de manera única el dispositivo, debe utilizar getDeviceId() lugar.

Otros consejos

No hay una solución garantizada para este problema debido a que el número de teléfono no se almacena físicamente en todas las tarjetas SIM, o transmitido desde la red al teléfono. Esto es especialmente cierto en algunos países que requiere verificación de la dirección física, la asignación de números solamente ocurre después. la asignación de números de teléfono que sucede en la red - y se puede cambiar sin cambiar la tarjeta SIM o dispositivo (por ejemplo, esto es cómo se apoya portabilidad)

.

Sé que es el dolor, pero lo más probable es que la mejor solución es sólo para pedir al usuario que introduzca su / su número de teléfono de una vez y almacenarlo.

Actualizar: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 instalada esta aplicación 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);
}

Controlar actype para cuenta 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.

responder

El uso por debajo de código:

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

En AndroidManifest.xml, dar el permiso siguiente:

 <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 el operador de telefonía operador de red / célula.

Además, trata de leer en Teléfono -> Configuración -> Acerca de -> Teléfono Identidad Si usted es capaz de ver el número de allí, la probabilidad de obtener el número de teléfono desde arriba código es más alto. Si usted no es capaz de ver el número de teléfono en la configuración, entonces no va a ser capaz de obtener a través de este código!

Solución sugerida:

  1. Obtener el número de teléfono del usuario como la introducción manual del usuario.
  2. Enviar a un código de número de teléfono móvil del usuario a través de SMS.
  3. Preguntar al usuario que introduzca el código para confirmar el número de teléfono.
  4. Guarda el número en sharedpreference.

¿Los anteriores 4 pasos como la actividad de una vez durante el primer lanzamiento de la aplicación. Más tarde, cuando se requiere el número de teléfono, utilice el valor disponible en la preferencia compartida.

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- teléfono-número

Así que esa es la forma en que usted solicite un número de teléfono a través de la API de servicios de Play sin el permiso y hacks. Fuente y ejemplo completo .

En su build.gradle (versión 10.2.xy obligatorio más elevado):

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

En su actividad (el código se simplifica):

@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 diálogo como este:

 introducir descripción de la imagen aquí

Hay una nueva API de Android que permite al usuario seleccionar el numero de teléfono sin la necesidad de un permiso. Echa un vistazo a: 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);
} 

Sólo quiero añadir un poco aquí a las explicaciones anteriores en las respuestas anteriores. Lo que permitirá ahorrar tiempo para los demás también.

En mi caso este método no ha devuelto ningún número de teléfono móvil, se devuelve una cadena vacía. Fue debido al caso de que me había portado mi número en la nueva SIM. Así que si entro en los Ajustes> Acerca del teléfono> Estado> Mi número de teléfono que me muestra "Desconocido".

A veces, por debajo de código devuelve null o cadena en blanco.

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

Con el permiso a continuación

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

Hay otra manera usted será capaz de obtener su número de teléfono, no he probado esto en múltiples dispositivos, pero por encima de código no funciona todo el tiempo.

Trate a continuación código:

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

Usted tendrá que añadir estos dos permisos.

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

Espero que esta ayuda, Gracias!

Esta es una respuesta más simplificada:

public String getMyPhoneNumber()
{
    return ((TelephonyManager) getSystemService(TELEPHONY_SERVICE))
            .getLine1Number();
}

En primer lugar, obtener un número de teléfono móvil de los usuarios va en contra de la política ética; antes era posible, pero ahora, según mi investigación, no hay una solución sólida disponible para esto. Al usar algún código es posible obtener un número de teléfono móvil, pero no hay garantía de que funcione. sólo en pocos dispositivos.Después de mucha investigación, encontré solo tres soluciones, pero no funcionan en todos los dispositivos.

Existe la siguiente razón por la que no lo entendemos.

1.El dispositivo Android y la nueva tarjeta SIM no almacenan el número de móvil si el número de móvil no está disponible en el dispositivo y en la SIM, entonces, ¿cómo es posible obtener el número? Si alguna tarjeta SIM antigua tiene un número de móvil, entonces, usando el Administrador de telefonía, podemos obtener el otro número. En cuanto a esto, devolverá "nulo" o "" o "??????"

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

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

Nota:- He probado esta solución en el siguiente dispositivo Moto X, Samsung Tab 4, Samsung S4, Nexus 5 y Redmi 2 Prime, pero no funciona cada vez que regresa la cadena vacía, por lo que la conclusión es inútil

  1. Este método solo funciona en Redmi 2 Prime, pero para esto es necesario agregar el permiso de contacto de lectura en Manifest.

Nota:- Esta tampoco es la solución garantizada y eficiente, he probado esta solución en muchos dispositivos, pero funcionó solo en Redmi 2 Prime, que es un dispositivo SIM dual que me da dos, el primero de móvil primero es correcto, pero el segundo no es pertenece a mi segundo sim, pertenece a mi alguna tarjeta SIM antigua que no estoy usando.

 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. En mi investigación, descubrí que era posible obtener un número de móvil usando la cuenta de WhatsApp, pero ahora la nueva versión de Whatsapp no ​​almacena el número de móvil del usuario.

Conclusión:- Android no tiene ninguna solución garantizada para obtener el número de teléfono móvil del usuario mediante programación.

Sugerencia:- 1.Si desea verificar el número de teléfono móvil del usuario, solicite al usuario que proporcione su número, utilizando OTP puede verificarlo.

  1. Si desea identificar el dispositivo del usuario, puede obtener fácilmente el número IMEI del dispositivo.

TelephonyManager no es la solución adecuada, ya que en algunos casos el número no se almacena en la tarjeta SIM. Sugiero que se debe utilizar la preferencia compartida para almacenar el número de teléfono del usuario por primera vez la aplicación está abierta y el número será utilizado cuando lo necesite.

Una pequeña contribución. En mi caso, el código de error lanzó una excepción. Me han necesitado poner una anotación que el código se ejecuta y solucionar ese problema. Aquí dejo este código.

public static String getLineNumberPhone(Context scenario) {
    TelephonyManager tMgr = (TelephonyManager) scenario.getSystemService(Context.TELEPHONY_SERVICE);
    @SuppressLint("MissingPermission") String mPhoneNumber = tMgr.getLine1Number();
    return mPhoneNumber;
}

A pesar de que es posible tener varias cuentas de correo de voz, cuando se llama desde su propio número, los transportistas que la ruta al correo de voz. Así, TelephonyManager.getVoiceMailNumber() o TelephonyManager.getCompleteVoiceMailNumber(), dependiendo del sabor que necesita.

Espero que esto ayude.

mientras se trabaja en una aplicación de seguridad que necesitaba para obtener el número de teléfono de quien tan siempre mi teléfono podría entrar en sus manos, que tenía que hacer esto; 1. Arranque recibir completó y luego tratar de conseguir Line1_Number de telephonyManager que devuelve una cadena resultado. 2. Comparar el resultado de cuerda con mi propio número de teléfono y si no coinciden o vuelve cadena nula entonces, 3. enviar en secreto un SMS que contiene el resultado de cadena más un signo especial a mi número de la oficina. 4. si falla el envío de mensajes, iniciar un servicio y seguir tratando después de cada hora hasta que se envían SMS intención pendientes regresa con éxito. Con estos pasos podría conseguir el número de la persona que utiliza mi teléfono perdido. no importa si la persona está cargada.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top