通过WhatsApp发送消息

139

由于我发现一些较旧的帖子称whatsapp不支持此功能,因此我想知道是否有变化以及是否有办法通过意图打开一个whatsapp“聊天”,并将其中的号码发送出去?


你尝试过使用共享操作提供程序吗? - Basim Sherif
听起来很有趣,但这该怎么实现呢?我能分享一个字符串(电话号码),然后它会打开 WhatsApp(或选择器)吗?你能给一个小例子吗? - Diego
2
虽然WhatsApp中有ACTION_SENDTO意图,但它并未执行(正确),因此不可能针对特定的电话号码进行操作[这是我发现的]。 - Manan Sharma
2
可能是 将文本发送给特定联系人(WhatsApp) 的重复问题。 - Rishabh Maurya
我仍然期待能够同时附加图像和文本,但是没有找到成功的方法,唉 :( - gumuruh
26个回答

201

更新 请参考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/en/android/28000012


1
如何集成消息功能?以便用户可以选择使用WhatsApp或短信。 - Srikanth Pai
39
如果我们已经有联系人信息,是否可以在不触摸选中联系人并点击确认发送的情况下,直接添加联系人信息并发送消息? - user1492955
1
请参考以下链接:https://dev59.com/pGIk5IYBdhLWcg3wqPoi?lq=1 - Manan Sharma
4
@MananMerevikSharma的消息来源不撒谎(https://android.googlesource.com/platform/frameworks/base/+/refs/heads/master/core/java/android/content/Intent.java)。 另外,基本的Java原则是:对象存在直到没有任何引用指向它。 - JRomero
1
@MananMerevikSharma -1. 它不会“变成空指针”。else部分永远无法到达。当WhatsApp未安装时,Intent仍然会被发送,但是会打开一个对话框,显示没有匹配的应用程序。这意味着您没有提供任何方法来检查WhatsApp是否已安装。 - 0101100101
显示剩余12条评论

72

使用此代码,您可以打开带有给定号码的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, ""));
}

5
@user2957782 我按照这位先生的指示操作了,但当我点击启动WhatsApp的按钮时,它显示“没有应用程序可以执行此操作”。 - arjun narahari
1
检查过后,它会将我发送到所有聊天列表,而不是特定号码的聊天窗口。 - Darpan
如果您删除“setPackage”,它将直接带您到窗口,但您无法在那里添加任何消息。 - Darpan
9
只有当你的聊天列表或联系人列表中有该号码时,此功能才会起作用。 - Anshul Tyagi
1
使用startActivity(i);直接打开提供的号码聊天,而不是使用startActivity(Intent.createChooser(i, ""));。已在三星J7 Prime上测试过,可以正常工作。该号码既不在我的联系人列表中,也不在我的聊天列表中。如果该号码没有使用WhatsApp,则会出现一个对话框询问我是否想邀请该联系人加入WhatsApp。如果您想为应用程序用户提供WhatsApp联系人支持,我认为这是最佳解决方案。 - Muhammad Saqib
显示剩余2条评论

32

简单的解决方案,请试试这个。

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

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
2
@Eman87 Diego正在使用Action Bar Sherlock,所以使用getSherlockActivity()的地方应该替换为获取您活动的范围。 - Manan Sharma
4
在你之前的两行代码中已经定义了 Intent whatsapp = new Intent(...),所以 if (whatsapp != null) 是没有意义的。 - Carcamano
3
如果联系人存在,这是直接打开聊天窗口的好选择。那么对于不在我们联系人中的新号码,有没有类似的方法呢? - MohammedYakub M.
1
你需要在 AndroidManifest.xml 文件中添加 <uses-permission android:name="android.permission.READ_CONTACTS" /> 权限。 - Pratik Butani
显示剩余2条评论

17

这应该可以在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;
}

12
即使安装了 WhatsApp,仍出现“Activity Not Found”异常。 - itzhar
2
未找到可处理的活动意图 {act=android.intent.action.SENDTO typ=text/plain pkg=com.whatsapp (has extras)}。 - Rajesh
2
你需要删除这行代码才能使用sendIntent.setType("text/plain")。 - MSaudi
3
移除sendIntent.setType("text/plain")可以解决Activity Not Found异常未被抛出的问题,但是现在文本没有被添加为消息。 - Rik van Velzen
看起来现在不可能了,接收意图的活动与“sms_body”有一些引用,但我无法使其工作。 - sherpya

11

Marshmallow 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
如何在使用SENDTO时向发送者添加文本? - WardNsour

8
以下是关于如何通过WhatsApp发送信息的最新方法,即使收件人的电话号码不在您的WhatsApp聊天或手机通讯录中。

以下是关于如何通过WhatsApp发送信息的最新方法,即使收件人的电话号码不在您的WhatsApp聊天或手机通讯录中。

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")将帮助您避免出现打开方式选择器并直接打开Whatsapp

重要提示: 如果您处于catch语句中,即使已安装了Whatsapp,请按以下方式向manifest.xml添加queries

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

请查看此答案以获取更多详细信息。

感谢您提供这个有用的答案。getPackageInfo()调用的目的是什么?我问这个问题是因为结果似乎没有被使用。它是用来触发NameNotFoundException吗? - LarsH
1
你说得对,@LarsH。getPackageInfo() 的调用是为了确保手机中是否安装了Whatsapp。 - Chintan Bawa

7

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

4
检查设备中是否安装了 WhatsApp 并在 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() 会在 WhatsApp 没有安装时抛出 NameNotFoundException 异常。

internationalPhoneNumber 变量用于访问电话号码。

参考:


3
以下代码仅供Google Now应用使用,对于其他应用程序无效。
我写这篇文章是因为我很生气,WhatsApp除了谷歌之外,不允许其他开发者直接发送信息。
我希望其他自由职业开发者知道,这种合作正在进行,而谷歌仍在谈论“开放给任何人”,WhatsApp表示他们不想向开发者提供任何访问权限。
最近,WhatsApp为Google Now特别添加了一个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应用程序进行检查,以确定它是否由Google Now创建。

否则,WhatsApp将无法接受该消息。


有趣!但是你能更详细地解释一下“search_action_token”吗?我们该如何获取和实现它。 - Bilal Mustafa
APK com.google.android.googlequicksearchbox 类 com.google.android.search.verification.api.SearchActionVerificationService 方法 createGoogleVerificationIntent - black-hawk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接