以编程方式将文本发送到特定联系人(whatsapp)

问题描述 投票:51回答:17

我想知道如何将文本发送到特定的WhatsApp联系人。我找到了一些代码来查看特定联系人,但不发送数据。

Cursor c = getContentResolver().query(ContactsContract.Data.CONTENT_URI,
    new String[] { ContactsContract.Contacts.Data._ID }, ContactsContract.Data.DATA1 + "=?",
    new String[] { id }, null);
c.moveToFirst();
Intent i = new Intent(Intent.ACTION_VIEW, Uri.parse("content://com.android.contacts/data/" + c.getString(0)));

startActivity(i);
c.close();

这适用于查看whatsapp-contact,但我现在如何添加一些文本?或者Whatsapp开发人员没有实现这样的api?

android android-intent contact whatsapp
17个回答
63
投票

我认为答案是你的问题和这个答案的混合:https://stackoverflow.com/a/15931345/734687所以我会尝试以下代码:

  1. 将ACTION_VIEW更改为ACTION_SENDTO
  2. 像你一样设置Uri
  3. 将包设置为whatsapp
Intent i = new Intent(Intent.ACTION_SENDTO, 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);

我查看了Whatsapp清单,发现ACTION_SEND已注册到活动ContactPicker,所以这对你没有帮助。但是,ACTION_SENDTO已注册到活动com.whatsapp.Conversation,这听起来更适合您的问题。

Whatsapp可以作为发送短信的替代品,所以它应该像短信一样工作。如果您未指定所需的应用程序(通过q​​azxswpoi),Android将显示应用程序选择器。因此,您应该查看通过意图发送SMS的代码,然后提供其他包信息。

setPackage

首先尝试将Uri uri = Uri.parse("smsto:" + smsNumber); Intent i = new Intent(Intent.ACTION_SENDTO, uri); i.putExtra("sms_body", smsText); i.setPackage("com.whatsapp"); startActivity(i); 替换为ACTION_SEND。如果这不起作用,而不是提供额外的额外ACTION_SENDTO。如果这不起作用,请尝试更改uri。

更新我试图自己解决这个问题,但无法找到解决方案。 Whatsapp打开聊天记录,但不接收文本并发送。似乎这个功能没有实现。


2
投票

现在可以通过See also the documentation of WhatsApp实现。只有企业可以申请使用它。这是直接向电话号码发送消息的唯一方法,无需任何人为干预。

发送正常消息是免费的。看起来您需要在服务器上托管MySQL数据库和WhatsApp Business Client。


0
投票

检查这个答案。这里你的号码以“91 **********”开头。

WhatsApp Business API

0
投票

试试这个,为我工作! 。只是使用意图

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

sendIntent.setType("text/plain");                    
sendIntent.putExtra(Intent.EXTRA_TEXT, "This is my text to send.");                   sendIntent.putExtra("jid",PhoneNumberUtils.stripSeparators("91**********")                   + "@s.whatsapp.net");                    
sendIntent.setPackage("com.whatsapp");                    
startActivity(sendIntent);

构建whatsapp网址。在whatsapp电话号码 Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(whatsappUrl())); startActivity(intent); 中添加国家代码

https://countrycode.org/

0
投票

这将首先搜索指定的联系人,然后打开聊天窗口。

注意:phone_number和str是变量。

public static String whatsappUrl(){

    final String BASE_URL = "https://api.whatsapp.com/";
    final String WHATSAPP_PHONE_NUMBER = "628123232323";    //'62' is country code for Indonesia
    final String PARAM_PHONE_NUMBER = "phone";
    final String PARAM_TEXT = "text";
    final String TEXT_VALUE = "Hello, How are you ?";

    String newUrl = BASE_URL + "send";

    Uri builtUri = Uri.parse(newUrl).buildUpon()
            .appendQueryParameter(PARAM_PHONE_NUMBER, WHATSAPP_PHONE_NUMBER)
            .appendQueryParameter(PARAM_TEXT, TEXT_VALUE)
            .build();

    return buildUrl(builtUri).toString();
}

public static URL buildUrl(Uri myUri){

    URL finalUrl = null;
    try {
        finalUrl = new URL(myUri.toString());
    } catch (MalformedURLException e) {
        e.printStackTrace();

    }
    return finalUrl;
}

0
投票
Uri mUri = Uri.parse("https://api.whatsapp.com/send?
phone=" + phone_no + "&text=" + str);
Intent mIntent = new Intent("android.intent.action.VIEW", mUri);
mIntent.setPackage("com.whatsapp");
startActivity(mIntent);

0
投票
 private void openWhatsApp() {
       //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("jid",whatsappId);
            sendIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            sendIntent.setPackage("com.whatsapp");
            startActivity(sendIntent);
        } catch(Exception e) {
            Toast.makeText(this, "Error/n" + e.toString(), Toast.LENGTH_SHORT).show();
            Log.e("Error",e+"")    ;    }
    }

0
投票
Bitmap bmp = null;
            bmp = ((BitmapDrawable) tmpimg.getDrawable()).getBitmap();
            Uri bmpUri = null;
            try {
                File file = new File(getBaseContext().getExternalFilesDir(Environment.DIRECTORY_PICTURES), "share_image_" + System.currentTimeMillis() + ".jpg");
                FileOutputStream out = new FileOutputStream(file);
                bmp.compress(Bitmap.CompressFormat.PNG, 90, out);
                out.close();
                bmpUri = Uri.fromFile(file);

            } catch (IOException e) {
                e.printStackTrace();
            }

            String toNumber = "+919999999999"; 
            toNumber = toNumber.replace("+", "").replace(" ", "");
            Intent shareIntent =new Intent("android.intent.action.MAIN");
            shareIntent.setAction(Intent.ACTION_SEND);
            String ExtraText;
            ExtraText =  "Share Text";
            shareIntent.putExtra(Intent.EXTRA_TEXT, ExtraText);
            shareIntent.putExtra(Intent.EXTRA_STREAM, bmpUri);
            shareIntent.setType("image/jpg");
            shareIntent.setPackage("com.whatsapp");
            shareIntent.putExtra("jid", toNumber + "@s.whatsapp.net");
            shareIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
            try {

                startActivity(shareIntent);
            } catch (android.content.ActivityNotFoundException ex) {
                Toast.makeText(getBaseContext(), "Sharing tools have not been installed.", Toast.LENGTH_SHORT).show();
            }

        }

0
投票

private void sendToContactUs() {
     String phoneNo="+918000874386";

    Intent sendIntent = new Intent("android.intent.action.MAIN");
    sendIntent.setAction(Intent.ACTION_VIEW);
    sendIntent.setPackage("com.whatsapp");
    String url = "https://api.whatsapp.com/send?phone=" + phoneNo + "&text=" + "Unique Code - "+CommonUtils.getMacAddress();
    sendIntent.setDataAndType(Uri.parse(url),"text/plain");


    if(sendIntent.resolveActivity(getPackageManager()) != null){
        startActivity(sendIntent);
    }else{
        Toast.makeText(getApplicationContext(),"Please Install Whatsapp Massnger App in your Devices",Toast.LENGTH_LONG).show();
    }
}

0
投票
 public void shareWhatsup(String text) {


        String smsNumber = "91+" + "9879098469"; // E164 format without '+' sign

        Intent intent = new Intent(Intent.ACTION_VIEW);

        try {
            String url = "https://api.whatsapp.com/send?phone=" + smsNumber + "&text=" + URLEncoder.encode(text, "UTF-8");
            intent.setPackage("com.whatsapp");
            intent.setData(Uri.parse(url));
        } catch (Exception e) {
            e.printStackTrace();
        }

        //    intent.setAction(Intent.ACTION_SEND);
        //   intent.setType("image/jpeg");
        //   intent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, imageUriArray);
        startActivity(intent);


    }

55
投票

我已经做了!

sms_body

51
投票

我找到了正确的方法,这很简单,你只需要阅读这篇文章:private void openWhatsApp() { String smsNumber = "7****"; // E164 format without '+' sign Intent sendIntent = new Intent(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"); if (intent.resolveActivity(getActivity().getPackageManager()) == null) { Toast.makeText(this, "Error/n" + e.toString(), Toast.LENGTH_SHORT).show(); return; } startActivity(sendIntent); }

源代码:http://howdygeeks.com/send-whatsapp-message-unsaved-number-android/phone都是message

String

请享用!


18
投票

这种方法也适用于WhatsApp Business应用程序!

将包名更改为sendIntent.setPackage(“com.whatsapp.w4b”);为WhatsApp业务。

非常好的黑客Rishabh,非常感谢,自从过去3年以来我一直在寻找这个解决方案。

根据Rishabh Maurya上面的回答,我已经实现了这个代码,它在WhatsApp上的文本和图像共享都很好。

请注意,在这两种情况下,它都会打开一个whatsapp对话(如果toNumber存在于用户whatsapp联系人列表中),但用户必须单击“发送”按钮才能完成操作。这意味着它有助于跳过联系人选择步骤。

用于短信

    PackageManager packageManager = context.getPackageManager();
    Intent i = new Intent(Intent.ACTION_VIEW);

    try {
        String url = "https://api.whatsapp.com/send?phone="+ phone +"&text=" + URLEncoder.encode(message, "UTF-8");
        i.setPackage("com.whatsapp");
        i.setData(Uri.parse(url));
        if (i.resolveActivity(packageManager) != null) {
            context.startActivity(i);
        }
    } catch (Exception e){
        e.printStackTrace();
    }

用于共享图像

String toNumber = "+91 98765 43210"; // contains spaces.
toNumber = toNumber.replace("+", "").replace(" ", "");

Intent sendIntent = new Intent("android.intent.action.MAIN");
sendIntent.putExtra("jid", toNumber + "@s.whatsapp.net");
sendIntent.putExtra(Intent.EXTRA_TEXT, message);
sendIntent.setAction(Intent.ACTION_SEND);
sendIntent.setPackage("com.whatsapp");
sendIntent.setType("text/plain");
startActivity(sendIntent);

享受WhatsApping!


14
投票

它允许您为您尝试与之通信的特定用户打开WhatsApp对话屏幕:

String toNumber = "+91 98765 43210"; // contains spaces.
toNumber = toNumber.replace("+", "").replace(" ", "");

Intent sendIntent = new Intent("android.intent.action.MAIN");
sendIntent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(imageFile));
sendIntent.putExtra("jid", toNumber + "@s.whatsapp.net");
sendIntent.putExtra(Intent.EXTRA_TEXT, message);
sendIntent.setAction(Intent.ACTION_SEND);
sendIntent.setPackage("com.whatsapp");
sendIntent.setType("image/png");
context.startActivity(sendIntent);

10
投票

看看我的答案:private void openWhatsApp() { String smsNumber = "91XXXXXXXX20"; boolean isWhatsappInstalled = whatsappInstalledOrNot("com.whatsapp"); if (isWhatsappInstalled) { Intent sendIntent = new Intent("android.intent.action.MAIN"); sendIntent.setComponent(new ComponentName("com.whatsapp", "com.whatsapp.Conversation")); sendIntent.putExtra("jid", PhoneNumberUtils.stripSeparators(smsNumber) + "@s.whatsapp.net");//phone number without "+" prefix startActivity(sendIntent); } else { Uri uri = Uri.parse("market://details?id=com.whatsapp"); Intent goToMarket = new Intent(Intent.ACTION_VIEW, uri); Toast.makeText(this, "WhatsApp not Installed", Toast.LENGTH_SHORT).show(); 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; }

https://stackoverflow.com/a/40285262/5879376

6
投票

这将首先搜索指定的联系人,然后打开聊天窗口。如果没有安装WhatsApp,那么try-catch块处理这个。

 Intent sendIntent = new Intent("android.intent.action.MAIN");
 sendIntent.setComponent(new  ComponentName("com.whatsapp","com.whatsapp.Conversation"));
 sendIntent.putExtra("jid", PhoneNumberUtils.stripSeparators("YOUR_PHONE_NUMBER")+"@s.whatsapp.net");//phone number without "+" prefix

 startActivity(sendIntent);

5
投票

Whatsapp有自己的API

 String digits = "\\d+";
    Sring mob_num = 987654321;     
    if (mob_num.matches(digits)) 
            {
        try {
              /linking for whatsapp
              Uri uri = Uri.parse("whatsapp://send?phone=+91" + mob_num);
              Intent i = new Intent(Intent.ACTION_VIEW, uri);
              startActivity(i);
            }
            catch (ActivityNotFoundException e){
                    e.printStackTrace();
                    Toast.makeText(this, "WhatsApp not installed.", Toast.LENGTH_SHORT).show();
            }
        }

为活动添加的代码更新检查是否可用。

Intent sendIntent = new Intent("android.intent.action.MAIN"); sendIntent.setAction(Intent.ACTION_VIEW); sendIntent.setPackage("com.whatsapp"); String url = "https://api.whatsapp.com/send?phone=" + "Phone with international format" + "&text=" + "your message"; sendIntent.setData(Uri.parse(url)); if(sendIntent.resolveActivity(context.getPackageManager()) != null){ startActivity(sendIntent); }


3
投票

这是最短的方式

this documentation

String mPhoneNumber = "+972505555555"; mPhoneNumber = mPhoneNumber.replaceAll("+", "").replaceAll(" ", "").replaceAll("-",""); String mMessage = "Hello world"; String mSendToWhatsApp = "https://wa.me/" + mPhoneNumber + "?text="+mMessage; startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse( mSendToWhatsApp )));

© www.soinside.com 2019 - 2024. All rights reserved.