Отправка сообщения через WhatsApp

Так как я нашел несколько старых постов, в которых говорится, что WhatsApp не поддерживает это, мне стало интересно, изменилось ли что-то и есть ли способ открыть чат WhatsApp с номером, который я отправляю через намерение?

26 ответов

Решение

ОБНОВЛЕНИЕ Пожалуйста, обратитесь к https://faq.whatsapp.com/en/android/26000030/?category=5245251

Функция WhatsApp Click to Chat позволяет вам начать чат с кем-то, не сохраняя номер телефона в адресной книге вашего телефона. Если вы знаете номер телефона этого человека, вы можете создать ссылку, которая позволит вам начать чат с ним.

Использование: https://api.whatsapp.com/send?phone=15551234567

Не используйте: https://api.whatsapp.com/send?phone=+001-(555)1234567

Пример: https://api.whatsapp.com/send?phone=15551234567&text=I20интересуется%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

С помощью этого кода вы можете открыть чат 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, ""));
}

Попробуйте, этот код запускает WhatsApp через Intent.ACTION_VIEW, не забудьте использовать код страны для номера телефона.

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

Я нашел следующее решение, сначала вам понадобится идентификатор WhatsApp:

В соответствии с отчетами из некоторых других тем здесь и на других форумах, имя входа, которое я нашел, было чем-то вроде: международный код города без 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);
    }

}

Это должно работать независимо от того, установлен 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.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;
}

Проверено на Зефире 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); 

Это откроет прямой чат с человеком, если Whatsup не установлен, это вызовет исключение, если телефонный номер не известен Whatsup, они предложат отправить приглашение с помощью SMS или простого SMS-сообщения.

Here is the latest way to send a message via , even if the receiver's phone number is not in your chat or phone's Contacts list.

      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") will help you to avoid Open With chooser and open directly.

Importent Note: If You are ending in catch statement, even if Whatsapp is installed. Please add queries to manifest.xml as follows:

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

Please see this answer for more details.

использовать этот однострочный код использовать для отправки сообщения через 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
     }

Чтобы проверить, установлен ли WhatsApp на устройстве, и инициировать "нажмите для чата" в WhatsApp:

Котлин:

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

Джава:

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() бросает NameNotFoundException если WhatsApp не установлен.

В internationalPhoneNumber переменная используется для доступа к номеру телефона.

Ссылка:

Вот что сработало для меня:

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

Следующий код используется приложением Google Now и НЕ будет работать для других приложений.

Я пишу этот пост, потому что меня бесит то, что WhatsApp не позволяет другим разработчикам отправлять сообщения напрямую, кроме Google.

И я хочу, чтобы другие внештатные разработчики знали, что такое сотрудничество продолжается, в то время как Google продолжает говорить "открыто для всех", а 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" является PendingIntent, который содержит IBinder-объект, который отправляется обратно в Google App и проверяется, был ли он создан Google Now.

В противном случае WhatsApp не примет сообщение.

Как сказано в документации, вы можете просто использовать URL-адрес, например:

https://wa.me/15551234567

Где последний сегмент - число в формате E164

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

В настоящее время единственный официальный API, который вы можете сделать GET просьба:

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

В любом случае, WhatsApp уже запускает секретную API-программу.

Это работает для меня:

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

Вы захотите использовать URL-адрес в следующем формате...

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.

Используйте прямой URL-адрес WhatsApp

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

Отправка на номер WhatsApp, который существует в вашем списке контактов. Обратите внимание, что мы используем ACTION_SEND

       Intent whatsappIntent = new Intent(Intent.ACTION_SEND);
 whatsappIntent.setType("text/plain");
 whatsappIntent.setPackage("com.whatsapp");
 whatsappIntent.putExtra(Intent.EXTRA_TEXT, "SMS TEXT, TEXT THAT YOU NEED TO SEND");
 try {
   startActivityForResult(whatsappIntent, 100);
 } catch (Exception e) {
   Toast.makeText(YourActivity.this, "App is not installed", Toast.LENGTH_SHORT).show();
 }

Если номер не существует в списке контактов . Используйте API WhatsApp .

       String number = number_phone.getText().toString(); // I toke it from Dialog box
 number = number.substring(1); // To remove 0 at the begging of number (Optional) but needed in my case
 number = "962" + number; // Replace it with your country code
 String url = "https://api.whatsapp.com/send?phone=" + number + "&text=" + Uri.parse("Text that you want to send to the current user");
 Intent whatsappIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
 whatsappIntent.setPackage("com.whatsapp");
 whatsappIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
 try {
   context.startActivity(whatsappIntent);
 } catch (android.content.ActivityNotFoundException ex) {
   Toast.makeText(YourActivity.this, "App is not installed", Toast.LENGTH_SHORT).show();
 }

Я действительно опаздываю сюда, но я считаю, что в настоящее время у нас есть более короткие и лучшие решения для отправки сообщений через 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 FAQ

Это очень долго, но неприлично работает. наслаждайся своим кодом:)

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

}

Проверьте этот код,

    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)));
}
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 и предварительно заполняет текст в чате. Если он не установлен, он открывает ссылку WhatsApp в вашем браузере.

Это работает для меня:

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

Получите контактный номер, которому вы хотите отправить сообщение, и создайте URI для WhatsApp, здесь 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);

Из документации

Чтобы создать свою собственную ссылку с предварительно заполненным сообщением, которое автоматически появится в текстовом поле чата, используйте https://wa.me/whatsappphonenumber/?text=urlencodedtext, где whatsappphonenumber - это полный номер телефона в международном формате и URL. -encodedtext - это предварительно заполненное сообщение в кодировке URL.

Пример:https://wa.me/15551234567?text=I'm%20intehibited%20in%20your%20car%20for%20sale

Пример кода

val phoneNumber = "13492838472"
    val text = "Hey, you know... I love Stackru :)"
    val uri = Uri.parse("https://wa.me/$phoneNumber/?text=$text")
    val sendIntent = Intent(Intent.ACTION_VIEW, uri)
    startActivity(sendIntent)

Наконец, это сработало для меня в Котлине:

      private fun navigateToWhatsApp() {
        try {
            val url = "https://api.whatsapp.com/send?phone=+91${getString(R.string.contact)}"
            startActivity(Intent(Intent.ACTION_VIEW, Uri.parse(url)).setPackage("com.whatsapp"))
        } catch (e: Exception) {
            showToast("Whatsapp app not installed in your device")
        }
    }

Следующий API можно использовать в C++, как показано в моей статье.

Вам нужно определить несколько констант:

//
#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);
Другие вопросы по тегам