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

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

Código:

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

Permiso requerido:

  

Advertencias:

De acuerdo con los comentarios summente vistos, hay algunas advertencias que debes tener en cuenta. Esto puede devolver null o "" o incluso "???????" y puede devolver un número obsoleto que ya no es válido. Si desea algo que identifique de manera única el dispositivo, debe usar getDeviceId() lugar.

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

Sé que es doloroso, 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 dejó de exponer el número de teléfono como nombre de cuenta, ignore amablemente esta respuesta.

En realidad, hay 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, puede confiar en otra gran aplicación de 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:

  

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

Verifique la cuenta de actype para whatsapp

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

Por supuesto, puede que no lo consigas 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 fue publicado en mi respuesta anterior

Use el siguiente código:

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

En AndroidManifest.xml, conceda el siguiente permiso:

   

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 / operador del teléfono celular.

Además, intente marcar 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á obtenerlo a través de este código!

Solución sugerida:

  1. Obtenga el número de teléfono del usuario como una entrada manual del usuario.
  2. Envíe un código al número de teléfono móvil del usuario por SMS.
  3. Pídale 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 una actividad única durante el primer lanzamiento de la aplicación. Más adelante, cuando se requiera un número de teléfono, use el valor disponible en 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 tomado de http://www.androidsnippets.com/get-my-phone-number

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

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

Con permiso debajo

  

Hay otra manera en que podrá obtener su número de teléfono, no lo he probado en múltiples dispositivos, pero el código anterior no está funcionando todo el tiempo.

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

Necesitarás agregar estos dos permisos.

   

Espero que esto ayude, gracias!

Solo quiero agregar 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 la nueva tarjeta SIM. Entonces, si entro en Configuración> Acerca del teléfono> Estado> Mi número de teléfono, aparece “Desconocido”.

Hay una nueva API de Android que permite al usuario seleccionar su número de teléfono sin la necesidad de un permiso. Eche 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); } 

Esta es una respuesta más simplificada:

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

TelephonyManager no es la solución correcta, porque en algunos casos el número no está almacenado 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 luego el número se usará siempre lo necesitas en la aplicación.

En primer lugar, obtener el número de teléfono móvil de los usuarios es contrario a 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 un código, es posible obtener un número móvil, pero no hay garantía de que funcione. solo en pocos dispositivos. Después de mucha investigación encontré solo tres soluciones, pero no están funcionando en todos los dispositivos.

Existe la siguiente razón por la cual no estamos obteniendo.

1. Dispositivo Android y nueva tarjeta SIM que no guardan el número móvil si el número móvil no está disponible en el dispositivo y en la tarjeta SIM, entonces ¿cómo es posible obtener el número, si una tarjeta SIM antigua tiene número de móvil y luego el administrador de telefonía podemos obtener el número sabio devolverá el “nulo” o “” o “??????”

  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 una cadena vacía, por lo que la conclusión es que es inútil

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

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 dual sim, me da dos números de móvil, el primero es correcto pero el segundo no es pertenecen a mi segunda tarjeta SIM que pertenecen a mi vieja tarjeta SIM 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 anteriormente que era posible obtener un número de teléfono móvil con la cuenta de WhatsApp, pero ahora la nueva versión de Whatsapp no ​​almacena el número de teléfono móvil del usuario.

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

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

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

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

En su build.gradle (se requiere la versión 10.2.xy 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 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:

enter image description here

Aunque es posible tener varias cuentas de correo de voz, al llamar desde su propio número, los operadores lo dirigen al correo de voz. Entonces, TelephonyManager.getVoiceMailNumber() o TelephonyManager.getCompleteVoiceMailNumber() , dependiendo del sabor que necesite.

Espero que esto ayude.

Una pequeña contribución. En mi caso, el código lanzó una excepción de error. He necesitado poner una anotación para que se corra el código 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; } 

mientras trabajaba en una aplicación de seguridad que necesitaba obtener el número de teléfono de quien mi teléfono podría tener en sus manos, tuve que hacer esto; 1. reciba Boot completed y luego intente obtener Line1_Number de telefononyManager 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 nulo, entonces 3. enviar secretamente un SMS que contenga el resultado de la cadena más un signo especial a mi número de oficina. 4. si el envío de mensajes falla, inicie un servicio y siga intentándolo cada hora hasta que los SMS enviados pendientes de bash regresen con éxito. 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.