Obtenga programaticamente el número de teléfono del teléfono Android

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

    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:

    De acuerdo con los comentarios altamente upvoted, hay algunas advertencias a tener en cuenta. Esto puede devolver null o "" o incluso "???????" , Y puede devolver un viejo número de teléfono que ya no es válido. Si desea algo que identifique de forma única el dispositivo, debe utilizar getDeviceId() lugar.

    No existe una solución garantizada a este problema porque el número de teléfono no se almacena 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 requiere verificación de direcciones físicas, con la asignación de números que sólo sucede después. La asignación de números de teléfono ocurre en la red – y se puede cambiar sin cambiar la tarjeta SIM o el dispositivo (por ejemplo, esto es lo que admite el portado).

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

    Actualización: Esta respuesta ya no está disponible ya que Whatsapp había dejado de exponer el número de teléfono como nombre de cuenta, por favor, no tenga en cuenta esta respuesta.

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

    A partir de hoy, puede confiar en otra aplicación grande Whatsapp, utilizando AccountManager. Millones de dispositivos tienen esta aplicación instalada y si no puede obtener el número de teléfono a través de TelephonyManager, puede darle una oportunidad.

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

    Comprobar el tipo de cuenta de WhatsApp

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

    Por supuesto que no puede obtenerlo si el usuario no instaló Whatsapp, pero vale la pena intentarlo de todos modos. Y recuerde que siempre debe pedir confirmación al usuario.

    Como se publicó en mi respuesta anterior

    Utilice el siguiente código:

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

    En AndroidManifest.xml, dé 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 el operador de red / portadora de teléfono celular.

    También, intente comprobar en Teléfono -> Configuración -> Acerca de -> Identidad del teléfono , Si usted es capaz de 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, entonces no podrá obtener 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. Envíe un código al número de móvil del usuario a través de SMS.
    3. Pida al usuario que ingrese el código para confirmar el número de teléfono.
    4. Guarde el número en la preferencia compartida.

    Realice los 4 pasos anteriores como actividad única durante el primer lanzamiento de la aplicación. Más adelante, siempre que se necesite un 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; } 

    Código extraído de http://www.androidsnippets.com/get-my-phone-number

    Sólo quiero añadir un poco aquí a las explicaciones anteriores en las respuestas anteriores. Lo cual ahorrará tiempo para otros también.

    En mi caso este método no devolvió ningún número de móvil, se devolvió una cadena vacía. Fue debido al caso que había portado mi número en el nuevo sim. Así que si entro en Configuración> Acerca del teléfono> Estado> Mi número de teléfono me muestra "Desconocido".

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

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

    Con permiso debajo

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

    Hay otra manera que usted será capaz de obtener su número de teléfono, no he probado esto en varios dispositivos, pero encima del código no funciona cada vez.

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

    Deberá agregar estos dos permisos.

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

    Espero que esto ayude, gracias!

    Esta es una respuesta más simplificada:

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

    TelephonyManager no es la solución correcta, ya que en algunos casos el número no se almacena en la tarjeta SIM, debido a mi sugerencia, debe usar la preferencia compartida para almacenar el número de teléfono del usuario la primera vez que la aplicación está abierta y después Que necesita en la aplicación.

    En primer lugar, conseguir que el número de usuarios móviles es contra la política de ética, antes era posible, pero ahora como por mi investigación no existe una solución sólida disponible para esto, mediante el uso de algún código es posible obtener número de móvil, pero no garantiza que va a funcionar Sólo en pocos dispositivos. Después de mucha investigación encontré solamente la solución tres pero no están trabajando en todo el dispositivo.

    Hay la siguiente razón por la que no estamos recibiendo.

    Dispositivo 1.Android y la nueva tarjeta de Sim no almacenar el número de móvil si el número de móvil no está disponible en el dispositivo y en el sim, entonces cómo es posible obtener el número, si alguna tarjeta SIM antigua con número de móvil, a continuación, utilizando el administrador de telefonía podemos obtener el número de otros Sabio que devolverá el "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 devuelve cadena vacía para concluir es que es inútil

    1. Este método está funcionando sólo en primario Redmi 2, pero para esta necesidad de agregar permiso de contacto de lectura en manifiesto.

    Nota: – Esta no es también la solución garantizada y eficiente, he probado esta solución en muchos dispositivos, pero funcionó sólo en Redmi 2 prime que es el dispositivo dual sim me da dos números móviles primero es correcto, pero el segundo no es Pertenecen a mi segundo sim que pertenecen a mi tarjeta de sim algunos antiguos 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 he encontrado antes era posible conseguir el número móvil usando la cuenta de WhatsApp pero ahora la nueva versión de Whatsapp no ​​almacena el número móvil del usuario.

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

    Sugerencia : – 1. Si desea verificar el número de teléfono del usuario, pida al usuario que proporcione su número, utilizando otp puede verificarlo.

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

    Aunque es posible tener varias cuentas de buzón de voz, al llamar desde su propio número, las operadoras lo envían al buzón de voz. Por lo tanto, TelephonyManager.getVoiceMailNumber() o TelephonyManager.getCompleteVoiceMailNumber() , dependiendo del sabor que necesita.

    Espero que esto ayude.

    Aquí está cómo usted debe hacer este mundo del poste M:

     private void getPhoneInfo() { if(ContextCompat.checkSelfPermission(getBaseContext(), "android.permission.READ_SMS") == PackageManager.PERMISSION_GRANTED) { TelephonyManager tMgr = (TelephonyManager)this.getSystemService(Context.TELEPHONY_SERVICE); Log.e(LOGGING_TAG, "PHONE NUMBER = " + tMgr.getLine1Number()); } else { final int REQUEST_CODE_ASK_PERMISSIONS = 123; ActivityCompat.requestPermissions(this, new String[]{"android.permission.READ_SMS"}, REQUEST_CODE_ASK_PERMISSIONS); } } 

    Asegúrese de que manifiesta el permiso de solicitud para utilizar el estado READ_SMS

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

    Mientras trabajaba en una aplicación de seguridad que necesitaba para obtener el número de teléfono de que por lo que mi teléfono podría entrar en sus manos, tuve que hacer esto, 1. Reciba Boot completado y luego intente obtener Line1_Number de telephonyManager que devuelve un resultado de cadena. 2. comparar el resultado de String con mi propio número de teléfono y si no coinciden o la cadena devuelve null entonces 3. enviar secretamente un SMS que contenga el resultado de la cadena más una señal especial a mi número de oficina. 4. Si falla el envío de mensajes, inicie un servicio y continúe intentando cada hora hasta que la intención pendiente de SMS pendiente se obtenga correctamente. Con estos pasos podría obtener el número de la persona que usa mi teléfono perdido. No importa si la persona es acusada.

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.