【问题标题】:Open conversation in Whatsapp and populate the text在 Whatsapp 中打开对话并填充文本
【发布时间】:2014-07-24 20:25:54
【问题描述】:

我想打开 WhatsApp 到一个特定的对话,并用一些字符串填充文本字段。

我拥有的代码并且我设法打开了与联系人的对话:

private void openConversationWithWhatsapp(String e164PhoneNumber){
    String whatsappId = e164PhoneNumber+"@s.whatsapp.net";
    Uri uri = Uri.parse("smsto:" + whatsappId);
    Intent intent = new Intent(Intent.ACTION_SENDTO, uri);
    intent.setPackage("com.whatsapp");

    intent.putExtra(Intent.EXTRA_TEXT, "text");
    intent.putExtra(Intent.EXTRA_SUBJECT, "subject");
    intent.putExtra(Intent.EXTRA_TITLE, "title");
    intent.putExtra(Intent.EXTRA_EMAIL, "email");
    intent.putExtra("sms_body", "The text goes here");
    intent.putExtra("text","asd");
    intent.putExtra("body","body");
    intent.putExtra("subject","subjhect");

    startActivity(intent);
}

但是文本框没有填充内容。我试图查看AndroidManifest.xml 文件,发现以下关于他们的对话活动的信息:

<activity android:theme="@style/Theme.App.CondensedActionBar" android:name="com.whatsapp.Conversation" android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize" android:windowSoftInputMode="stateUnchanged">
    <intent-filter>
        <action android:name="android.intent.action.SENDTO" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
        <data android:scheme="sms" />
        <data android:scheme="smsto" />
    </intent-filter>
</activity>

有人知道要使用的额外功能吗? 他们是故意阻止的吗? 我在他们的FAQ 页面中看到了适用于 iOS 的 API。

【问题讨论】:

标签: android whatsapp


【解决方案1】:
        try {
            PackageManager packageManager = getApplicationContext().getPackageManager();
            String url = "https://api.whatsapp.com/send?phone=" + number + "&text=" + URLEncoder.encode(message, "UTF-8");
            Intent whatappIntent = new Intent(Intent.ACTION_VIEW);
            whatappIntent.setPackage("com.whatsapp");
            whatappIntent.setData(Uri.parse(url));
            whatappIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            if (whatappIntent.resolveActivity(packageManager) != null) {
               startActivity(whatappIntent);
            } else {
                Log.d("msg","WhatsApp Not installed")
            }
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }

【讨论】:

【解决方案2】:
public void sendMessageOnWhatsApp(String number, String text, Context context){
    String url = "https://api.whatsapp.com/send?phone="+number+"&text="+text;
    Intent whatsappIntent = new Intent(Intent.ACTION_VIEW,Uri.parse(url));
    whatsappIntent.setPackage("com.whatsapp");
    whatsappIntent.setFlags(FLAG_ACTIVITY_NEW_TASK);
    try {
        context.startActivity(whatsappIntent);
    } catch (android.content.ActivityNotFoundException ex) {
        Toaster.showMessageShort(context.getString(R.string.no_whatsapp_msg));
    }

}

【讨论】:

  • 适用于将whats app消息发送给不在联系人列表中的o
【解决方案3】:

方法一——使用android组件名

 public static void openWhatsAppConversation(Context context, String number, String message) {

    number = number.replace(" ", "").replace("+", "");

    Intent sendIntent = new Intent("android.intent.action.MAIN");

    sendIntent.setType("text/plain");
    sendIntent.putExtra(Intent.EXTRA_TEXT, message);
    sendIntent.setComponent(new ComponentName("com.whatsapp", "com.whatsapp.Conversation"));
    sendIntent.putExtra("jid", PhoneNumberUtils.stripSeparators(number) + "@s.whatsapp.net");

    context.startActivity(sendIntent);
}

方法2 - 使用whatsapp api uri

public static void openWhatsAppConversationUsingUri(Context context, String numberWithCountryCode, String message) {

    Uri uri = Uri.parse("https://api.whatsapp.com/send?phone=" + numberWithCountryCode + "&text=" + message);

    Intent sendIntent = new Intent(Intent.ACTION_VIEW, uri);

    context.startActivity(sendIntent);
}

【讨论】:

    【解决方案4】:

    使用下面的代码在 what's App 中打开对话

      Intent intent = new Intent(Intent.ACTION_VIEW);
                intent.setPackage("com.whatsapp");
                intent.setData(Uri.parse(String.format("https://api.whatsapp.com/send?phone=%s", "91xxxxxxxxxx")));
                if (getPackageManager().resolveActivity(intent, 0) != null) {
                    startActivity(intent);
                } else {
                    Toast.makeText(this, "Please install whatsApp", Toast.LENGTH_SHORT).show();
                }
    

    注意:输入国家/地区代码时始终不带“+”号。

    【讨论】:

      【解决方案5】:

      这段代码对我有用。其中 jid 是不带“+”的电话号码 这支持 MODIFIED 版本的 WhatsApp,例如 WhatsApp+ 等。 仅通过传递 WhatsApp 包名称 。 你可以在MyApp找到完整的代码

         private void openChat(String text, String packageName) {
              if (text.trim().isEmpty())
                  Toast.makeText(context, "Please Enter Number", Toast.LENGTH_SHORT).show();
              else {
                  try {
                      String smsNumber = Util.getNumber(text) + "@s.whatsapp.net";
                      Uri uri = Uri.parse("smsto:" + smsNumber);
                      Intent i = new Intent(Intent.ACTION_SENDTO, uri);
                      i.putExtra("jid", smsNumber);
                      i.setPackage(packageName);
                      context.startActivity(i);
                  } catch (ActivityNotFoundException e) {
                      Toast.makeText(context, "Make Sure you have WhatsApp App Installed on Your Device", Toast.LENGTH_SHORT).show();
                  }
              }
          }
      

      【讨论】:

        【解决方案6】:

        2017 年更新

        基于此Whatsapp FAQ

        我正在使用这个网址

        https://api.whatsapp.com/send?phone=62xxxxxxx&text=Hello,%20from%20my%20Apps
        

        其中 62 是印度尼西亚的拨号代码

        然后我使用这样的意图(我使用 kotlin)

        val uri = Uri.parse("https://api.whatsapp.com/send?phone=62xxxxxxx&text=Hello,%20from%20my%20Apps")
                val intent = Intent(Intent.ACTION_VIEW, uri)
                startActivity(intent)
        

        将 62xxxx 替换为您的号码 这对我来说很好

        【讨论】:

        • 您必须指定国家/地区拨号代码才能使此意图生效。否则whatsapp 将显示错误消息
        【解决方案7】:

        我做到了!

        private void openWhatsApp() {
            String smsNumber = "7****"; //without '+'
            try {
                Intent sendIntent = new Intent("android.intent.action.MAIN");
                //sendIntent.setComponent(new ComponentName("com.whatsapp", "com.whatsapp.Conversation"));
                sendIntent.setAction(Intent.ACTION_SEND);
                sendIntent.setType("text/plain");
                sendIntent.putExtra(Intent.EXTRA_TEXT, "This is my text to send.");
                sendIntent.putExtra("jid", smsNumber + "@s.whatsapp.net"); //phone number without "+" prefix
                sendIntent.setPackage("com.whatsapp");
                startActivity(sendIntent);
            } catch(Exception e) {
                Toast.makeText(this, "Error/n" + e.toString(), Toast.LENGTH_SHORT).show();
            }
        }
        

        【讨论】:

        • 这是否仍在按 SEND 按钮/模仿 ENTER 键? @Alexey
        • 设置电话号码时的“jid”部分是什么?
        【解决方案8】:

        尝试使用以下解决方案发送图像和文本。

        您可以将Type设置为“文本”并删除extra_stream以仅用于发送文本。

                    Intent sendIntent = new Intent("android.intent.action.SEND");
                    File f=new File("path to the file");
                    Uri uri = Uri.fromFile(f);
                    sendIntent.setComponent(new ComponentName("com.whatsapp","com.whatsapp.ContactPicker"));
                    sendIntent.setType("image");
                    sendIntent.putExtra(Intent.EXTRA_STREAM,uri);
                    sendIntent.putExtra("jid", PhoneNumberUtils.stripSeparators("919xxxxxxxxx")+"@s.whatsapp.net");
                    sendIntent.putExtra(Intent.EXTRA_TEXT,"sample text you want to send along with the image");
                    startActivity(sendIntent);
        

        关于寻找解决方案过程的额外信息:

        在对 WhatsApp 进行逆向工程后,我发现了以下 Android 清单的 sn-p,

        普通分享意图,使用“SEND”,不允许您发送给特定联系人,需要联系人选择器。

        具体联系人被Conversation类拾取,使用“SEND_TO”动作,但使用短信正文,不能占用图片等附件。

         <activity android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|screenSize|smallestScreenSize|uiMode" android:name="com.whatsapp.Conversation" android:theme="@style/Theme.App.CondensedActionBar" android:windowSoftInputMode="stateUnchanged">
                    <intent-filter>
                        <action android:name="android.intent.action.SENDTO"/>
                        <category android:name="android.intent.category.DEFAULT"/>
                        <category android:name="android.intent.category.BROWSABLE"/>
                        <data android:scheme="sms"/>
                        <data android:scheme="smsto"/>
                    </intent-filter>
                </activity>
        

        进一步挖掘,我遇到了这个,

         <activity android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|screenSize|smallestScreenSize|uiMode" android:name="com.whatsapp.ContactPicker" android:theme="@style/Theme.App.NoActionBar">
                    <intent-filter>
                        <action android:name="android.intent.action.PICK"/>
                        <category android:name="android.intent.category.DEFAULT"/>
                        <category android:name="com.whatsapp"/>
                    </intent-filter>
                    <intent-filter>
                        <action android:name="android.intent.action.SEND"/>
                        <category android:name="android.intent.category.DEFAULT"/>
                        <data android:mimeType="audio/*"/>
                        <data android:mimeType="video/*"/>
                        <data android:mimeType="image/*"/>
                        <data android:mimeType="text/plain"/>
                        <data android:mimeType="text/x-vcard"/>
                        <data android:mimeType="application/pdf"/>
                        <data android:mimeType="application/vnd.openxmlformats-officedocument.wordprocessingml.document"/>
                        <data android:mimeType="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"/>
                        <data android:mimeType="application/vnd.openxmlformats-officedocument.presentationml.presentation"/>
                        <data android:mimeType="application/msword"/>
                        <data android:mimeType="application/vnd.ms-excel"/>
                        <data android:mimeType="application/vnd.ms-powerpoint"/>
                    </intent-filter>
                    <intent-filter>
                        <action android:name="android.intent.action.SEND_MULTIPLE"/>
                        <category android:name="android.intent.category.DEFAULT"/>
                        <data android:mimeType="audio/*"/>
                        <data android:mimeType="video/*"/>
                        <data android:mimeType="image/*"/>
                    </intent-filter>
                    <intent-filter>
                        <action android:name="android.intent.action.VIEW"/>
                        <category android:name="android.intent.category.DEFAULT"/>
                        <category android:name="android.intent.category.BROWSABLE"/>
                        <data android:host="send" android:scheme="whatsapp"/>
                    </intent-filter>
                    <meta-data android:name="android.service.chooser.chooser_target_service" android:value=".ContactChooserTargetService"/>
                </activity>
        

        最后对ContactPicker和Conversation类使用反编译器,发现电话号码的额外键值是“jid”。

        【讨论】:

        • 你知道如何将预置消息发送到会话类吗?它的键值对是什么
        【解决方案9】:

        遗憾的是,他们没有在 android 上实现此功能(也许他们将来会这样做)。

        我已经问过a similar question,但没有任何结果。虽然 whatsapp 会对您在代码中显示的某些意图做出反应,但它们根本不使用您发送的文本。我想这是出于安全原因,想象一下 Play 商店中有多少垃圾邮件应用程序……我不知道它是如何(以及为什么)在 iOS 中实现的……

        与您的解决方案接近的两个替代方案

        1. 发送文字和create a chooser(无需输入,选择whatsapp即可)
        2. open the contact(文字需要输入,但无需选择联系人)

        【讨论】:

        • 说得对。出于安全原因。但是 Google Now 的新更新会直接向特定联系人发送 WhatsApp 消息。他们怎么能做到?有没有在whatsApp或其他地方开辟了新的API?
        • Google Now 与 3rd 方消息传递合作以使其发挥作用。 whatsapp 肯定没有 API。
        • 这个答案已经过时了,@Ekky Hermestian IW 有正确答案:stackoverflow.com/a/47635819/2614353
        【解决方案10】:

        您可以在 WhatsApp 中使用以下 sn-p:

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

        【讨论】:

        • 这个sn-p上好像没有使用PackageInfo。为什么需要它?
        • 这是一个复制的答案! PackageInfo 用于检查是否安装了whatsapp。如果未安装whatsapp,它将返回null。后来,根据一些 cmets,这已从该答案中删除。所以,回答的人把else块的代码放在catch块中。
        • @ChristianSisti:该行用于检查是否安装了 WhatsApp。如果未安装,getPackageInfo() 将引发异常并执行 catch 块。查看 developer.android.com/reference/android/content/pm/… 获取有关 getPackageInfo() 工作原理的文档。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-12-23
        • 1970-01-01
        • 2023-04-10
        • 1970-01-01
        • 2019-07-12
        • 2015-09-21
        • 1970-01-01
        相关资源
        最近更新 更多