-->

Sending message through WhatsApp

2018-12-31 14:17发布

问题:

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?

回答1:

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://api.whatsapp.com/send?phone=15551234567

Don\'t use: https://api.whatsapp.com/send?phone=+001-(555)1234567

Example: https://api.whatsapp.com/send?phone=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



回答2:

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, \"\"));
}


回答3:

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 31612325023@s.whatsapp.net -> +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);
    }

}


回答4:

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.setType(\"text/plain\");
            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;
}


回答5:

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 whatsup not installed this will throw exception, if phone number not known to whatsup they will offer to send invite via sms or simple sms message



回答6:

Try this, this code launch WhatsApp via Intent.ACTION_VIEW, don\'t forget to use country code to the phone number.

startActivity(new Intent(Intent.ACTION_VIEW,
                        Uri.parse(
                                \"https://api.whatsapp.com/send?phone=+628119xxx&text=I\'m%20interested%20in%20your%20car%20for%20sale\"
                        )));


回答7:

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.\");
}


回答8:

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.



回答9:

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



回答10:

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

}


回答11:

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



回答12:

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


回答13:

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


回答14:

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


回答15:

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


回答16:

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