¿Cómo abrir una pantalla de chat de contacto específica en varias aplicaciones populares de chat / redes sociales?

Fondo

Descubrí que hay una forma de abrir una pantalla de conversación de contacto específica en WhatsApp, aquí .

No solo eso, sino que descubrí que una aplicación llamada ” Drupa ” hace lo mismo, y tal vez incluso más:

https://lh3.googleusercontent.com/EQrs1jplMlP8SkOTdpqT4NzmgzGa5Wz2qageG1Pkjc6rKg0HBb-rwlOVW07_G7bAWgo=h900

El problema

No puedo encontrar ninguna API oficial para abrirlo de esta manera, así que no estoy seguro de cuán seguro es.

He encontrado SDK, pero no las instrucciones.

Las preguntas

Me gustaría saber más sobre lo que está disponible para varias redes sociales y aplicaciones de chat:

  • WhatsApp
  • Facebook Messenger
  • Viber
  • Línea
  • Telegtwig
  • Hangouts

Las posibles características pueden ser:

  • abrir la conversación de un contacto, cuando la entrada es su número de teléfono
  • tener un nuevo texto que estará listo para enviarse en la nueva pantalla
  • para Facebook, quizás también se pueda abrir usando el ID de Facebook de la persona (es decir, esta es la entrada), en lugar de un número de teléfono.

¿Están estas características disponibles para cada una de esas redes sociales y aplicaciones de chat?

Para Facebook-messenger, he encontrado esto (de https://developers.facebook.com/docs/messenger-platform/discovery/m-me-links#format ):

final Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://m.me/" + facebookId)); 

Funciona, pero me pregunto si hay otra forma de acceder a él (usando el número de teléfono, por ejemplo).


Para WhatsApp, he encontrado esto (desde aquí ):

  final String formattedPhoneNumber = getFormattedPhoneNumber(this, phone); final String contactId = getContactIdFromPhoneNumber(phone); final String contactMimeTypeDataId = getContactMimeTypeDataId(contactId, "vnd.android.cursor.item/vnd.com.whatsapp.profile"); if (contactMimeTypeDataId != null) { intent = new Intent(Intent.ACTION_SENDTO, Uri.parse("smsto:" + formattedPhoneNumber)); intent.setPackage("com.whatsapp"); } else Toast.makeText(this, "cannot find this contact on whatsapp", Toast.LENGTH_SHORT).show(); public static String getFormattedPhoneNumber(Context context, String input) { final PhoneNumberUtil phoneNumberUtil = PhoneNumberUtil.getInstance(); String normalizedPhone = input.replaceAll("[^0-9+]", ""); try { TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); String countryCode = tm.getSimCountryIso(); final PhoneNumber phoneNumber = phoneNumberUtil.parse(normalizedPhone, countryCode.toUpperCase()); final String formattedPhoneNumber = phoneNumberUtil.format(phoneNumber, PhoneNumberFormat.E164).replaceAll("[^0-9]", ""); return formattedPhoneNumber; } catch (NumberParseException e) { e.printStackTrace(); } return null; } private String getContactIdFromPhoneNumber(String phone) { if (TextUtils.isEmpty(phone)) return null; final Uri uri = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, Uri.encode(phone)); final ContentResolver contentResolver = getContentResolver(); final Cursor phoneQueryCursor = contentResolver.query(uri, new String[]{PhoneLookup._ID}, null, null, null); if (phoneQueryCursor != null) { if (phoneQueryCursor.moveToFirst()) { String result = phoneQueryCursor.getString(phoneQueryCursor.getColumnIndex(PhoneLookup._ID)); phoneQueryCursor.close(); return result; } phoneQueryCursor.close(); } return null; } public String getContactMimeTypeDataId(@NonNull Context context, String contactId, @NonNull String mimeType) { if (TextUtils.isEmpty(mimeType)) return null; ContentResolver cr = context.getContentResolver(); Cursor cursor = cr.query(ContactsContract.Data.CONTENT_URI, new String[]{Data._ID}, Data.MIMETYPE + "= ? AND " + ContactsContract.Data.CONTACT_ID + "= ?", new String[]{mimeType, contactId}, null); if (cursor == null) return null; if (!cursor.moveToFirst()) { cursor.close(); return null; } String result = cursor.getString(cursor.getColumnIndex(Data._ID)); cursor.close(); return result; } 

Funciona, pero no agrega el mensaje. También podría decir que el contacto no tiene WhatsApp.


Para Viber, he encontrado esto (desde aquí ):

  final String contactId = getContactIdFromPhoneNumber(phone); final String contactMimeTypeDataId = getContactMimeTypeDataId(contactId, "vnd.android.cursor.item/vnd.com.viber.voip.viber_number_message"); if (contactMimeTypeDataId != null) { intent = new Intent(Intent.ACTION_VIEW, Uri.parse("content://com.android.contacts/data/" + contactMimeTypeDataId)); intent.addFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT | Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET | Intent.FLAG_ACTIVITY_PREVIOUS_IS_TOP); intent.setPackage("com.viber.voip"); } else { intent = new Intent("android.intent.action.VIEW", Uri.parse("tel:" + Uri.encode(formattedPhoneNumber))); intent.setClassName("com.viber.voip", "com.viber.voip.WelcomeActivity"); } private String getContactIdFromPhoneNumber(String phone) { final Uri uri = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, Uri.encode(phone)); final ContentResolver contentResolver = getContentResolver(); final Cursor phoneQueryCursor = contentResolver.query(uri, new String[]{PhoneLookup._ID}, null, null, null); if (phoneQueryCursor != null) { if (phoneQueryCursor.moveToFirst()) { String result = phoneQueryCursor.getString(phoneQueryCursor.getColumnIndex(PhoneLookup._ID)); phoneQueryCursor.close(); return result; } phoneQueryCursor.close(); } return null; } 

Para Hangouts, parece que es similar a Viber, pero con este tipo mimético: “vnd.android.cursor.item / vnd.googleplus.profile.comm”. Sin embargo, no funciona, ya que probablemente necesite pasos adicionales (establecer G + para mantener los contactos actualizados y tener los contactos en los círculos de G +). Sin embargo, de alguna manera tuve éxito al abrir el video chat de una persona:

  intent =new Intent(Intent.ACTION_VIEW,Uri.parse("content://com.android.contacts/data/"+contactMimeTypeDataId)); intent.addFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT |Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET |Intent.FLAG_ACTIVITY_PREVIOUS_IS_TOP); 

Para Telegram, alguien ( aquí ) sugirió usar el siguiente código, pero no funciona:

  intent = new Intent(android.content.Intent.ACTION_SENDUri.parse("http://telegram.me/"+profile))); intent.setPackage("org.telegram.messenger"); 

Para Line, he encontrado esto (basado en aquí y aquí ), pero ninguno funciona:

  Intent intent = new Intent("jp.naver.line.android.intent.action.LINESHORTCUT"); intent.putExtra("shortcutType", "chatmid"); intent.putExtra("shortcutTargetId", target); intent.putExtra("shortcutTargetName", ""); intent.putExtra("shortcutFromOS", false); startActivity(intent); Intent intent = new Intent(); intent.setAction(Intent.ACTION_VIEW); intent.setData(Uri.parse("line://msg/text/" + getMongon())); 

skype: este funciona (se encuentra en varios enlaces, aquí , por ejemplo):

  final String skypeUserName = getSkypeUserName(phone); intent = new Intent(Intent.ACTION_VIEW, Uri.parse("skype:" + skypeUserName + "?chat")); public String getSkypeUserName(String phoneNumber) { if (TextUtils.isEmpty(phoneNumber)) return null; ContentResolver cr = getContentResolver(); final Uri uri = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, Uri.encode(phoneNumber)); Cursor cursor = cr.query(uri, new String[]{PhoneLookup.LOOKUP_KEY}, null, null, null); if (cursor == null) return null; final Set contactKeys = new HashSet<>(); // get contact keys { final int contactKeyIdx = cursor.getColumnIndex(PhoneLookup.LOOKUP_KEY); for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) { String contactKey = cursor.getString(contactKeyIdx); contactKeys.add(contactKey); } cursor.close(); } if (contactKeys.isEmpty()) return null; //get raw ids final Set contactRawIdsSet = new HashSet<>(); { final StringBuilder sb = new StringBuilder(); for (int i = 0; i < contactKeys.size(); ++i) sb.append(sb.length() == 0 ? "?" : ",?"); String inParameters = sb.toString(); final String[] selectionArgs = contactKeys.toArray(new String[contactKeys.size()]); cursor = cr.query(ContactsContract.Data.CONTENT_URI, new String[]{ContactsContract.Data.RAW_CONTACT_ID}, ContactsContract.Data.LOOKUP_KEY + " IN (" + inParameters + ")", selectionArgs, null); if (cursor == null) return null; final int rawContactColIdx = cursor.getColumnIndex(ContactsContract.Data.RAW_CONTACT_ID); for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) { String rawContactId = cursor.getString(rawContactColIdx); contactRawIdsSet.add(rawContactId); } cursor.close(); } if (contactRawIdsSet.isEmpty()) return null; //find the skype name //TODO think of a better way to query, as it looks weird to search within a set of ids... final StringBuilder sb = new StringBuilder(); for (int i = 0; i < contactRawIdsSet.size(); ++i) sb.append(sb.length() == 0 ? "?" : ",?"); String inParameters = sb.toString(); final String[] selectionArgs = new String[2 + contactRawIdsSet.size()]; selectionArgs[0] = "com.skype.contacts.sync"; selectionArgs[1] = "vnd.android.cursor.item/name"; int i = 2; for (String rawId : contactRawIdsSet) selectionArgs[i++] = rawId; cursor = cr.query(ContactsContract.Data.CONTENT_URI, new String[]{RawContacts.SOURCE_ID}, ContactsContract.RawContacts.ACCOUNT_TYPE + " = ? AND " + Data.MIMETYPE + " = ? AND " + ContactsContract.Data.CONTACT_ID + " IN (" + inParameters + ")", selectionArgs, null); if (cursor == null) return null; if (!cursor.moveToFirst()) { cursor.close(); return null; } String result = cursor.getString(cursor.getColumnIndex(RawContacts.SOURCE_ID)); cursor.close(); return result; } 

esto funciona para mi

  try { String toNumber = "+91 8*******36"; // contains spaces. toNumber = toNumber.replace("+", "").replace(" ", ""); Intent sendIntent = new Intent(Intent.ACTION_SENDTO,Uri.parse("smsto:" + "" + toNumber + "?body=" + "")); sendIntent.putExtra(Intent.EXTRA_TEXT, "hello"); sendIntent.setPackage("com.whatsapp"); startActivity(sendIntent); } catch (Exception e){ Toast.makeText(getActivity(),"it may be you dont have whats app",Toast.LENGTH_LONG).show(); } 

Otros mensajes aquí tienen buena información. Quería agregar para LINE porque la información falta en muchos lugares.

 String userId = findUserId(); String sendText = "line://ti/p/~" + userId; Intent intent = null; try { intent = Intent.parseUri(sendText, Intent.URI_INTENT_SCHEME); } catch (URISyntaxException e) { e.printStackTrace(); } startActivity(intent);