Sending message through WhatsApp

AndroidAndroid IntentSocial NetworkingSharingWhatsapp

Android Problem Overview


Since I found some older posts, that tell that whatsapp doesn't support this, I was wondering if something had changed and if there is a way to open a whatsapp 'chat' with a number that I'm sending through an intent?

Android Solutions


Solution 1 - Android

UPDATE Please refer to https://faq.whatsapp.com/en/android/26000030/?category=5245251

> WhatsApp's Click to Chat feature allows you to begin a chat with > someone without having their phone number saved in your phone's > address book. As long as you know this person’s phone number, you can > create a link that will allow you to start a chat with them. > > Use: https://wa.me/15551234567 > > Don't use: https://wa.me/+001-(555)1234567

> >Example: https://wa.me/15551234567?text=I'm%20interested%20in%20your%20car%20for%20sale

Original answer Here is the solution

public void onClickWhatsApp(View view) {
	
    PackageManager pm=getPackageManager();
    try {

        Intent waIntent = new Intent(Intent.ACTION_SEND);
	    waIntent.setType("text/plain");
        String text = "YOUR TEXT HERE";

        PackageInfo info=pm.getPackageInfo("com.whatsapp", PackageManager.GET_META_DATA);
        //Check if package exists or not. If not then code 
        //in catch block will be called
	    waIntent.setPackage("com.whatsapp");

		waIntent.putExtra(Intent.EXTRA_TEXT, text);
		startActivity(Intent.createChooser(waIntent, "Share with"));
	    
   } catch (NameNotFoundException e) {
        Toast.makeText(this, "WhatsApp not Installed", Toast.LENGTH_SHORT)
				.show();
   }  

}

Also see http://www.whatsapp.com/faq/en/android/28000012

Solution 2 - Android

With this code you can open the whatsapp chat with the given number.

void openWhatsappContact(String number) {
	Uri uri = Uri.parse("smsto:" + number);
	Intent i = new Intent(Intent.ACTION_SENDTO, uri);
	i.setPackage("com.whatsapp");  
	startActivity(Intent.createChooser(i, ""));
}

Solution 3 - Android

I found the following solution, first you'll need the whatsapp id:

Matching with reports from some other threads here and in other forums the login name I found was some sort of: international area code without the 0's or + in the beginning + phone number without the first 0 + @s.whatsapp.net

For example if you live in the Netherlands and having the phone number 0612325032 it would be [email protected] -> +31 for the Netherlands without the 0's or + and the phone number without the 0.

public void sendWhatsAppMessageTo(String whatsappid) {

Cursor c = getSherlockActivity().getContentResolver().query(ContactsContract.Data.CONTENT_URI,
        new String[] { ContactsContract.Contacts.Data._ID }, ContactsContract.Data.DATA1 + "=?",
        new String[] { whatsappid }, null);
c.moveToFirst();

Intent whatsapp = new Intent(Intent.ACTION_VIEW, Uri.parse("content://com.android.contacts/data/" + c.getString(0)));
c.close();

 if (whatsapp != null) {
  
startActivity(whatsapp);      

} else {
        Toast.makeText(this, "WhatsApp not Installed", Toast.LENGTH_SHORT)
                .show();
//download for example after dialog
			    Uri uri = Uri.parse("market://details?id=com.whatsapp");
				Intent goToMarket = new Intent(Intent.ACTION_VIEW, uri);
    }

}





		   
		

Solution 4 - Android

Simple solution, try this.

String phoneNumberWithCountryCode = "+62820000000";
String message = "Hallo";

startActivity(
    new Intent(Intent.ACTION_VIEW,
        Uri.parse(
            String.format("https://api.whatsapp.com/send?phone=%s&text=%s", phoneNumberWithCountryCode, message)
        )
    )
);

Solution 5 - Android

> This should work whether Whatsapp is installed or not.

boolean isWhatsappInstalled = whatsappInstalledOrNot("com.whatsapp");
if (isWhatsappInstalled) {
    Uri uri = Uri.parse("smsto:" + "98*********7")
    Intent sendIntent = new Intent(Intent.ACTION_SENDTO, uri);
    sendIntent.putExtra(Intent.EXTRA_TEXT, "Hai Good Morning");
    sendIntent.setPackage("com.whatsapp");
    startActivity(sendIntent);
} else {
    Toast.makeText(this, "WhatsApp not Installed", Toast.LENGTH_SHORT).show();
    Uri uri = Uri.parse("market://details?id=com.whatsapp");
    Intent goToMarket = new Intent(Intent.ACTION_VIEW, uri);
    startActivity(goToMarket);

}

private boolean whatsappInstalledOrNot(String uri) {
    PackageManager pm = getPackageManager();
    boolean app_installed = false;
    try {
        pm.getPackageInfo(uri, PackageManager.GET_ACTIVITIES);
        app_installed = true;
    } catch (PackageManager.NameNotFoundException e) {
        app_installed = false;
    }
    return app_installed;
}

Solution 6 - Android

Tested on Marshmallow S5 and it works!

    Uri uri = Uri.parse("smsto:" + "phone number with country code");
    Intent sendIntent = new Intent(Intent.ACTION_SENDTO, uri);
    sendIntent.setPackage("com.whatsapp");
    startActivity(sendIntent); 

This will open a direct chat with a person, if whatsapp not installed this will throw exception, if phone number not known to whatsapp they will offer to send invite via sms or simple sms message

Solution 7 - Android

use this singleline code use to Sending message through WhatsApp

//NOTE : please use with country code first 2digits without plus signed
try {
      String mobile = "911234567890";
      String msg = "Its Working";
      startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("https://api.whatsapp.com/send?phone=" + mobile + "&text=" + msg)));
      }catch (Exception e){
        //whatsapp app not install
     }

Solution 8 - Android

To check if WhatsApp is installed in device and initiate "click to chat" in WhatsApp:

Kotlin:

try {
    // Check if whatsapp is installed
    context?.packageManager?.getPackageInfo("com.whatsapp", PackageManager.GET_META_DATA)
    val intent = Intent(Intent.ACTION_VIEW, Uri.parse("https://wa.me/$internationalPhoneNumber"))
    startActivity(intent)
} catch (e: NameNotFoundException) {
    Toast.makeText(context, "WhatsApp not Installed", Toast.LENGTH_SHORT).show()
}

Java:

try {
    // Check if whatsapp is installed
    getPackageManager().getPackageInfo("com.whatsapp", PackageManager.GET_META_DATA);
    Intent intent = Intent(Intent.ACTION_VIEW, Uri.parse("https://wa.me/" + internationalPhoneNumber));
    startActivity(intent);
} catch (NameNotFoundException e) {
    Toast.makeText(context, "WhatsApp not Installed", Toast.LENGTH_SHORT).show();
}

getPackageInfo() throws NameNotFoundException if WhatsApp is not installed.

The internationalPhoneNumber variable is used to access the phone number.

Reference:

Solution 9 - Android

Here is the latest way to send a message via Whatsapp, even if the receiver's phone number is not in your Whatsapp chat or phone's Contacts list.

private fun openWhatsApp(number: String) {
    try {
        packageManager.getPackageInfo("com.whatsapp", PackageManager.GET_ACTIVITIES)
        val intent = Intent(
            Intent.ACTION_VIEW,
            Uri.parse("https://wa.me/$number?text=I'm%20interested%20in%20your%20car%20for%20sale")
        )
        intent.setPackage("com.whatsapp")
        startActivity(intent)
    } catch (e: PackageManager.NameNotFoundException) {
        Toast.makeText(
            this,
            "Whatsapp app not installed in your phone",
            Toast.LENGTH_SHORT
        ).show()
        e.printStackTrace()
    }
}

intent.setPackage("com.whatsapp") will help you to avoid Open With chooser and open Whatsapp directly.

Importent Note: If You are ending in catch statement, even if Whatsapp is installed. Please add queries to manifest.xml as follows:

<queries>
   <package android:name="com.whatsapp" />
</queries>

Please see this answer for more details.

Solution 10 - Android

The following code is used by Google Now App and will NOT work for any other application.

I'm writing this post because it makes me angry, that WhatsApp does not allow any other developers to send messages directly except for Google.

And I want other freelance-developers to know, that this kind of cooperation is going on, while Google keeps talking about "open for anybody" and WhatsApp says they don't want to provide any access to developers.

Recently WhatsApp has added an Intent specially for Google Now, which should look like following:

Intent intent = new Intent("com.google.android.voicesearch.SEND_MESSAGE_TO_CONTACTS");
intent.setPackage("com.whatsapp");
intent.setComponent(new ComponentName("com.whatsapp", "com.whatsapp.VoiceMessagingActivity"));

intent.putExtra("com.google.android.voicesearch.extra.RECIPIENT_CONTACT_CHAT_ID", number);
intent.putExtra("android.intent.extra.TEXT", text);
intent.putExtra("search_action_token", ?????);

I could also find out that "search_action_token" is a PendingIntent that contains an IBinder-Object, which is sent back to Google App and checked, if it was created by Google Now.

Otherwise WhatsApp will not accept the message.

Solution 11 - Android

Currently, the only official API that you may make a GET request to:

https://api.whatsapp.com/send?phone=919773207706&text=Hello

Anyways, there is a secret API program already being ran by WhatsApp

Solution 12 - Android

This is what worked for me :

        Uri uri = Uri.parse("https://api.whatsapp.com/send?phone=" + "<number>" + "&text=" + "Hello WhatsApp!!");
        Intent sendIntent = new Intent(Intent.ACTION_VIEW, uri);
        startActivity(sendIntent);

Solution 13 - Android

This works to me:

PackageManager pm = context.getPackageManager();
try {
    pm.getPackageInfo("com.whatsapp", PackageManager.GET_ACTIVITIES);
    Intent intent = new Intent();
			intent.setComponent(new ComponentName(packageName,
					ri.activityInfo.name));
			intent.setType("text/plain");
			intent.putExtra(Intent.EXTRA_TEXT, element);

} catch (NameNotFoundException e) {
    ToastHelper.MakeShortText("Whatsapp have not been installed.");
}

Solution 14 - Android

As the documentation says you can just use an URL like:

https://wa.me/15551234567

Where the last segment is the number in in E164 Format

Uri uri = Uri.parse("https://wa.me/15551234567");
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
startActivity(intent);

Solution 15 - Android

Use direct URL of whatsapp

String url = "https://api.whatsapp.com/send?phone="+number;
Intent i = new Intent(Intent.ACTION_VIEW);
i.setData(Uri.parse(url));
startActivity(i);

Solution 16 - Android

You'll want to use a URL in the following format...

https://api.whatsapp.com/send?text=text

Then you can have it send whatever text you'd like. You also have the option to specify a phone number...

https://api.whatsapp.com/send?text=text&phone=1234

What you CANNOT DO is use the following:

https://wa.me/send?text=text

You will get...

> We couldn't find the page you were looking for

wa.me, though, will work if you supply both a phone number and text. But, for the most part, if you're trying to make a sharing link, you really don't want to indicate the phone number, because you want the user to select someone. In that event, if you don't supply the number and use wa.me as URL, all of your sharing links will fail. Please use app.whatsapp.com.

Solution 17 - Android

this is much lengthy but surly working. enjoy your code:)

 //method used to show IMs
private void show_custom_chooser(String value) {
	List<ResolveInfo> list = null;
	final Intent email = new Intent(Intent.ACTION_SEND);
	email.setData(Uri.parse("sms:"));
	email.putExtra(Intent.EXTRA_TEXT, "" + value);
	email.setType("text/plain"); // vnd.android-dir/mms-sms

	WindowManager.LayoutParams WMLP = dialogCustomChooser.getWindow()
			.getAttributes();
	WMLP.gravity = Gravity.CENTER;
	dialogCustomChooser.getWindow().setAttributes(WMLP);
	dialogCustomChooser.getWindow().setBackgroundDrawable(
			new ColorDrawable(android.graphics.Color.TRANSPARENT));
	dialogCustomChooser.setCanceledOnTouchOutside(true);
	dialogCustomChooser.setContentView(R.layout.about_dialog);
	dialogCustomChooser.setCancelable(true);
	ListView lvOfIms = (ListView) dialogCustomChooser
			.findViewById(R.id.listView1);
	PackageManager pm = getPackageManager();
	List<ResolveInfo> launchables = pm.queryIntentActivities(email, 0);
	// ////////////new
	list = new ArrayList<ResolveInfo>();
	for (int i = 0; i < launchables.size(); i++) {
		String string = launchables.get(i).toString();
		Log.d("heh", string);
//check only messangers
		if (string.contains("whatsapp")) {
			list.add(launchables.get(i));
		}
	}
	Collections.sort(list, new ResolveInfo.DisplayNameComparator(pm));
	int size = launchables.size();
	adapter = new AppAdapter(pm, list, MainActivity.this);
	lvOfIms.setAdapter(adapter);
	lvOfIms.setOnItemClickListener(new OnItemClickListener() {
		@Override
		public void onItemClick(AdapterView<?> arg0, View arg1,
				int position, long arg3) {
			ResolveInfo launchable = adapter.getItem(position);
			ActivityInfo activity = launchable.activityInfo;
			ComponentName name = new ComponentName(
					activity.applicationInfo.packageName, activity.name);
			email.addCategory(Intent.CATEGORY_LAUNCHER);
			email.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
					| Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
			email.setComponent(name);
			startActivity(email);
			dialogCustomChooser.dismiss();
		}
	});
	dialogCustomChooser.show();

}

Solution 18 - Android

I'm really late here but I believe that nowadays we have shorter and better solutions to send messages through WhatsApp.

You can use the following to call the system picker, then choose which app you will use to share whatever you want.

Intent sendIntent = new Intent();
sendIntent.setAction(Intent.ACTION_SEND);
sendIntent.putExtra(Intent.EXTRA_TEXT, "This is my text to send.");
sendIntent.setType("text/plain");
startActivity(sendIntent);

If you are really need to send through WhatsApp all you need to do is the following (You will skip the system picker)

 Intent sendIntent = new Intent();
    sendIntent.setAction(Intent.ACTION_SEND);
    sendIntent.putExtra(Intent.EXTRA_TEXT, "This is my text to send.");
    sendIntent.setType("text/plain");
    // Put this line here
    sendIntent.setPackage("com.whatsapp");
    //
    startActivity(sendIntent);

If you need more information you can find it here: WhatsApp FAQ

Solution 19 - Android

private fun sendWhatsappMessage(phoneNumber:String, text:String) {        
  val url = if (Intent().setPackage("com.whatsapp").resolveActivity(packageManager) != null) {
        "whatsapp://send?text=Hello&phone=$phoneNumber"
    } else {
        "https://api.whatsapp.com/send?phone=$phoneNumber&text=$text"
    }

    val browserIntent = Intent(Intent.ACTION_VIEW, Uri.parse(url))
    startActivity(browserIntent)
}

This is a much easier way to achieve this. This code checks if whatsapp is installed on the device. If it is installed, it bypasses the system picker and goes to the contact on whatsapp and prefields the text in the chat. If not installed it opens whatsapp link on your web browser.

Solution 20 - Android

Check this code,

    public void share(String subject,String text) {
     final Intent intent = new Intent(Intent.ACTION_SEND);

String score=1000;
     intent.setType("text/plain");
     intent.putExtra(Intent.EXTRA_SUBJECT, score);
     intent.putExtra(Intent.EXTRA_TEXT, text);

     startActivity(Intent.createChooser(intent, getString(R.string.share)));
}

Solution 21 - Android

This works to me:

public static void shareWhatsApp(Activity appActivity, String texto) {
	
	Intent sendIntent = new Intent(Intent.ACTION_SEND);		
	sendIntent.setType("text/plain");
	sendIntent.putExtra(android.content.Intent.EXTRA_TEXT, texto);
	
	PackageManager pm = appActivity.getApplicationContext().getPackageManager();
    final List<ResolveInfo> matches = pm.queryIntentActivities(sendIntent, 0);
    boolean temWhatsApp = false;
    for (final ResolveInfo info : matches) {
      if (info.activityInfo.packageName.startsWith("com.whatsapp"))  {
    	  final ComponentName name = new ComponentName(info.activityInfo.applicationInfo.packageName, info.activityInfo.name);
    	  sendIntent.addCategory(Intent.CATEGORY_LAUNCHER);
    	  sendIntent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY | Intent.FLAG_ACTIVITY_NEW_TASK);
    	  sendIntent.setComponent(name);
    	  temWhatsApp = true;
    	  break;
      }
    }				

	if(temWhatsApp) {
		//abre whatsapp
		appActivity.startActivity(sendIntent);
	} else {
		//alerta - você deve ter o whatsapp instalado
		Toast.makeText(appActivity, appActivity.getString(R.string.share_whatsapp), Toast.LENGTH_SHORT).show();
	}
}

Solution 22 - Android

get the contact number whom you want to send the message and create uri for whatsapp, here c is a Cursor returning the selected contact.

Uri.parse("content://com.android.contacts/data/" + c.getString(0)));
i.setType("text/plain");
i.setPackage("com.whatsapp");           // so that only Whatsapp reacts and not the chooser
i.putExtra(Intent.EXTRA_SUBJECT, "Subject");
i.putExtra(Intent.EXTRA_TEXT, "I'm the body.");
startActivity(i);

Solution 23 - Android

From the documentation

> To create your own link with a pre-filled message that will > automatically appear in the text field of a chat, use > https://wa.me/whatsappphonenumber/?text=urlencodedtext where > whatsappphonenumber is a full phone number in international format and > URL-encodedtext is the URL-encoded pre-filled message. > > Example:https://wa.me/15551234567?text=I'm%20interested%20in%20your%20car%20for%20sale

Code example

val phoneNumber = "13492838472"
    val text = "Hey, you know... I love StackOverflow :)"
    val uri = Uri.parse("https://wa.me/$phoneNumber/?text=$text")
    val sendIntent = Intent(Intent.ACTION_VIEW, uri)
    startActivity(sendIntent)

Solution 24 - Android

This one worked finally for me in Kotlin:

private fun navigateToWhatsApp() {
        try {
            val url = "https://api.whatsapp.com/send?phone=+91${getString(R.string.contact)}"
            startActivity(Intent(Intent.ACTION_VIEW, Uri.parse(url)).setPackage("com.whatsapp"))
        } catch (e: Exception) {
            showToast("Whatsapp app not installed in your device")
        }
    }

Solution 25 - Android

The following API can be used in c++ as shown in my article.

You need to define several constants:

//
#define    GroupAdmin                <YOUR GROUP ADMIN MOBILE PHONE>
#define GroupName                <YOUR GROUP NAME>
#define CLIENT_ID                <YOUR CLIENT ID>
#define CLIENT_SECRET            <YOUR CLIENT SECRET>

#define GROUP_API_SERVER        L"api.whatsmate.net"
#define GROUP_API_PATH          L"/v3/whatsapp/group/text/message/12"
#define IMAGE_SINGLE_API_URL    L"http://api.whatsmate.net/v3/whatsapp/group/image/message/12"

//

Then you connect to the API’s endpoint.

hOpenHandle = InternetOpen(_T("HTTP"), INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0);
if (hOpenHandle == NULL)
{
    return false;
}

hConnectHandle = InternetConnect(hOpenHandle,
    GROUP_API_SERVER,
    INTERNET_DEFAULT_HTTP_PORT,
    NULL, NULL, INTERNET_SERVICE_HTTP,
    0, 1);

if (hConnectHandle == NULL)
{
    InternetCloseHandle(hOpenHandle);
    return false;
}

Then send both header and body and wait for the result that needs to be “OK”.

Step 1 - open an HTTP request:

const wchar_t *AcceptTypes[] = { _T("application/json"),NULL };
HINTERNET hRequest = HttpOpenRequest(hConnectHandle, _T("POST"), GROUP_API_PATH, NULL, NULL, AcceptTypes, 0, 0);

if (hRequest == NULL)
{
    InternetCloseHandle(hConnectHandle);
    InternetCloseHandle(hOpenHandle);
    return false;
}

Step 2 - send the header:

std::wstring HeaderData;

HeaderData += _T("X-WM-CLIENT-ID: ");
HeaderData += _T(CLIENT_ID);
HeaderData += _T("\r\nX-WM-CLIENT-SECRET: ");
HeaderData += _T(CLIENT_SECRET);
HeaderData += _T("\r\n");
HttpAddRequestHeaders(hRequest, HeaderData.c_str(), HeaderData.size(), NULL);

Step 3 - send the message:

std::wstring WJsonData;
WJsonData += _T("{");
WJsonData += _T("\"group_admin\":\"");
WJsonData += groupAdmin;
WJsonData += _T("\",");
WJsonData += _T("\"group_name\":\"");
WJsonData += groupName;
WJsonData += _T("\",");
WJsonData += _T("\"message\":\"");
WJsonData += message;
WJsonData += _T("\"");
WJsonData += _T("}");

const std::string JsonData(WJsonData.begin(), WJsonData.end());

bResults = HttpSendRequest(hRequest, NULL, 0, (LPVOID)(JsonData.c_str()), JsonData.size());

Now just check the result:

TCHAR StatusText[BUFFER_LENGTH] = { 0 };
DWORD StatusTextLen = BUFFER_LENGTH;
HttpQueryInfo(hRequest, HTTP_QUERY_STATUS_TEXT, &StatusText, &StatusTextLen, NULL);
bResults = (StatusTextLen && wcscmp(StatusText, L"OK")==FALSE);

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionDiegoView Question on Stackoverflow
Solution 1 - AndroidManan SharmaView Answer on Stackoverflow
Solution 2 - Androiduser2957782View Answer on Stackoverflow
Solution 3 - AndroidDiegoView Answer on Stackoverflow
Solution 4 - AndroidLatief AnwarView Answer on Stackoverflow
Solution 5 - AndroidSatheeshView Answer on Stackoverflow
Solution 6 - AndroidIlya GazmanView Answer on Stackoverflow
Solution 7 - Androidmilan pithadiaView Answer on Stackoverflow
Solution 8 - AndroidAbhimanyuView Answer on Stackoverflow
Solution 9 - AndroidChintan BawaView Answer on Stackoverflow
Solution 10 - Androidblack-hawkView Answer on Stackoverflow
Solution 11 - AndroidxameeramirView Answer on Stackoverflow
Solution 12 - Androidmchouhan_googleView Answer on Stackoverflow
Solution 13 - AndroidCabezasView Answer on Stackoverflow
Solution 14 - AndroidGVillani82View Answer on Stackoverflow
Solution 15 - AndroidPierre AlexandreView Answer on Stackoverflow
Solution 16 - AndroidHoldOffHungerView Answer on Stackoverflow
Solution 17 - AndroidJohn smithView Answer on Stackoverflow
Solution 18 - AndroidWillView Answer on Stackoverflow
Solution 19 - AndroidAdekola AkanoView Answer on Stackoverflow
Solution 20 - AndroidBasim SherifView Answer on Stackoverflow
Solution 21 - Androiduser3124158View Answer on Stackoverflow
Solution 22 - AndroidKiran ManiyaView Answer on Stackoverflow
Solution 23 - AndroidGastón SaillénView Answer on Stackoverflow
Solution 24 - AndroidShailendra MaddaView Answer on Stackoverflow
Solution 25 - AndroidMichael HaephratiView Answer on Stackoverflow