通过WhatsApp发送消息


112

由于我发现了一些较早的帖子,说明whatsapp不支持此功能,所以我想知道是否已更改某些内容,以及是否可以通过意图发送的号码打开whatsapp“聊天”?


您是否尝试过共享操作提供商?
2013年

听起来很有趣,但是那将如何工作。我可以共享一个字符串(电话号码),它可以打开whatsapp(或选择器吗?),您可以举个例子吗?
2013年

2
尽管whatsapp中有ACTION_SENDTO意图,但并未执行(正确),因此无法对特定的电话号码进行操作(这就是我所发现的)
Manan Sharma 2014年


我仍然期待同时附上图片和文字,但没有发现运气,叹息:(
gumuruh

Answers:


180

更新 请参考https://faq.whatsapp.com/en/android/26000030/?category=5245251

WhatsApp的“单击聊天”功能使您可以与某人开始聊天,而无需将其电话号码保存在手机的通讯簿中。只要您知道此人的电话号码,就可以创建一个链接,让您与他们开始聊天。

使用:https : //wa.me/15551234567

不要使用:https : //wa.me/+001-(555)1234567

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

原始答案 这是解决方案

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

}

另请参阅http://www.whatsapp.com/faq/zh/android/28000012


如何与消息传递集成?以便用户可以选择whatsapp或消息传递
Srikanth Pai

33
如果我们已经有了联系人信息,则可以添加联系人信息并发送消息,而无需触摸联系人来选择并单击“确定”发送?
user1492955 2013年


4
@MananMerevikSharma的来源并不存在(android.googlesource.com/platform/frameworks/base/+/refs/heads/…)。此外,Java的基本原理是:对象一直存在,直到不再有对其的引用为止。
JRomero

1
@MananMerevikSharma -1。它不会“转向空指针”。else部分永远无法到达。未安装WhatsApp时,仍会发送Intent,但会打开一个对话框,提示没有匹配的应用程序。这意味着您没有提供任何方法来检查是否已安装WhatsApp。
0101100101

64

使用此代码,您可以使用给定的号码打开whatsapp聊天。

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
@ user2957782我跟随了这位先生,但是当我单击我的按钮以启动我的whatsapp时,它说“没有应用程序可以执行此操作”
arjun narahari 2014年

@VihaanVerma您可以分享如何使用它吗?我针对whatsapp版本2.11.56021实现了相同的代码,但我一无所获...
Alamgir Mand

1
选中后,它会将我发送到所有聊天列表,而不是特定号码的聊天窗口。
达尔潘

8
仅当您的聊天列表或联系人列表中有该号码时,此功能才有效。
Anshul Tyagi 2016年

1
而不是startActivity(Intent.createChooser(i, ""));使用startActivity(i);直接开提供的号码聊天。1.在Samsung J7 prime上进行过测试,可以正常工作。2.该号码既不在我的联系人列表中,也不在我的聊天列表中。3.如果号码未使用whatsapp,则会出现一个对话框,询问我是否想在whatsapp上邀请该联系人。我想这是最好的解决方案,如果您想为您的应用程序用户提供whatsapp联系人支持。
穆罕默德·萨奇布

25

我找到了以下解决方案,首先您需要whatsapp id:

与来自此处和其他论坛中其他一些线程的报告相匹配,我发现的登录名是某种形式的:国际区号开头不带0或+,开头的电话号码不带前0 + @ s.whatsapp.net

例如,如果您住在荷兰,电话号码为0612325032,对于荷兰来说,电话号码为31612325023@s.whatsapp.net-> +31(对于没有0或+的荷兰,而没有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);
    }

}

我正在尝试此代码,但它告诉我getSherlockActivity()是未定义的。如何解决这个问题?
Eman87 2013年

2
@ Eman87 Diego使用的是Action Bar Sherlock,因此是该方法。获取您的活动范围,以代替getSherlockActivity()。
Manan Sharma

4
有在任何点if (whatsapp != null)为2行以上你做Intent whatsapp = new Intent(...)
Carcamano 2014年

2
如果此人存在于联系人中,则这是直接打开聊天窗口的好选择。有没有办法对我们联系人中不存在的新号码执行相同的操作?
MohammedYakub Moriswala 2014年

1
您需要<uses-permission android:name="android.permission.READ_CONTACTS" />AndroidManifest.xml
Pratik Butani中

16

无论是否安装了Whatsapp,这都应该起作用。

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

11
活动没有润版液exeption即使WhatsApp的安装
itzhar

2
找不到用于处理Intent的活动{act = android.intent.action.SENDTO typ = text / plain pkg = com.whatsapp(有其他功能)}
Rajesh

2
您需要删除此行才能与sendIntent.setType(“ text / plain”);一起使用。
MSaudi

2
删除sendIntent.setType(“ text / plain”)可以解决未引发的Activity Not Found异常,但是现在不将文本作为消息添加
Rik van Velzen

似乎已经不可能了,接收到该意图的活动对“ sms_body”有一些引用,但我无法使其工作
sherpya

15

简单的解决方案,请尝试此。

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

10

棉花糖S5上测试过,可以正常工作!

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

这将打开与某人的直接聊天,如果未安装whatsapp,则会引发异常;如果whatsapp未知的电话号码,他们将提供通过短信或简单短信发送邀请的功能


那“发送按钮”呢?我们也可以通过编程方式来做吗...?
gumuruh

3

以下代码由Google即时应用使用,不适用于任何其他应用。

我写这篇文章是因为它让我很生气,因为WhatsApp不允许除Google之外的任何其他开发人员直接发送消息。

我希望其他自由开发者知道这种合作正在进行,而Google一直在谈论“对所有人开放”,而WhatsApp表示他们不想向开发人员提供任何访问权限。

最近,WhatsApp添加了专门用于Google即时的Intent,其外观应如下所示:

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

我还可以发现“ search_action_token”是一个包含IBinder-Object的PendingIntent,该对象将被发送回Google App,并检查它是否由Google Now创建。

否则,WhatsApp将不接受该消息。


有趣!但您能否解释一下有关“ search_action_token”的更多信息,我们如何获得和实施它。
Bilal Mustafa

APK com.google.android.googlequicksearchbox类com.google.android.search.verification.api.SearchActionVerificationService方法createGoogleVerificationIntent
black-hawk


3

使用此单行代码用于通过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
     }

2

这对我有效:

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

2

这对我有用:

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

2

使用whatsapp的直接URL

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

1

这是很漫长的,但工作正常。享受你的代码:)

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

}

1

我真的来晚了,但是我相信如今我们有更短,更好的解决方案来通过WhatsApp发送消息。

您可以使用以下命令调用系统选择器,然后选择要用于共享任何内容的应用。

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

如果确实需要通过WhatsApp发送,则只需执行以下操作(您将跳过系统选择器)

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

如果您需要更多信息,可以在这里找到:WhatsApp常见问题解答


1

文档所述,您可以仅使用如下网址:

https://wa.me/15551234567

最后一段是E164格式的数字

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

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

这是实现此目的的简便得多的方法。此代码检查设备上是否安装了whatsapp。如果已安装,它将绕过系统选择器,并转到whatsapp上的联系人,并在聊天中预先准备文本。如果未安装,它将在您的Web浏览器上打开whatsapp链接。


1

您将要使用以下格式的网址...

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

然后,您可以让它发送您想要的任何文本。您还可以选择指定电话号码...

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

不能使用以下内容:

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

你会得到...

我们找不到您想要的页面

wa.me但是,如果您同时提供电话号码和文字,则可以使用。但是,在大多数情况下,如果您尝试建立共享链接,则实际上并不想指明电话号码,因为您希望用户选择某人。在这种情况下,如果您不提供该号码并wa.me用作URL,则所有共享链接都将失败。 请使用app.whatsapp.com


0

检查此代码,

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

0

这对我有效:

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

0

获取要向其发送消息的联系人的号码,并为whatsapp创建uri,此处c是一个游标,返回选定的联系人。

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

0

文档中

要使用预先填充的消息创建您自己的链接,该链接将自动显示在聊天的文本字段中,请使用 https://wa.me/whatsappphonenumber/?text=urlencodedtext,其中whatsappphonenumber是国际格式和URL的完整电话号码-encodedtext是URL编码的预填充消息。

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

代码示例

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)

-1

我的文章所示,可以在c ++中使用以下API 。

您需要定义几个常量:

//
#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"

//

然后,您连接到API的端点。

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

然后发送标头和正文,并等待需要“确定”的结果。

第1步-打开HTTP请求:

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

第2步-发送标头:

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

第3步-发送消息:

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

现在只需检查结果:

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);
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.