WhatsAppを介したメッセージの送信


112

whatsappがこれをサポートしていないという古い投稿をいくつか見つけたので、何かが変更されたかどうか、また、意図を介して送信している番号でwhatsappの「チャット」を開く方法があるかどうか疑問に思っていましたか?


共有アクションプロバイダーを試しましたか?
Basim Sherif 2013

面白そうに聞こえますが、それはどのように機能しますか。文字列(電話番号)を共有して、whatsapp(またはセレクター)を開くことはできますか?
ディエゴ

2
whatsappにはACTION_SENDTOインテントがありますが、それは(適切に)実行されないため、特定の電話番号にアクセスすることはできません[私が見つけたもの]
Manan Sharma 14


私はまだ画像とテキストの両方を同時に添付することを楽しみにしていますが、運が見つかりませんでした、ため息:(
gumuruh

回答:


180

更新https://faq.whatsapp.com/en/android/26000030/?category=5245251を 参照してください

WhatsAppのClick to Chat機能を使用すると、電話のアドレス帳に電話番号を保存しなくても、誰かとチャットを開始できます。この人の電話番号を知っていれば、相手とチャットを開始できるリンクを作成できます。

使用: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も参照してください


メッセージングと統合するには?ユーザーがwhatsappまたはメッセージングを選択できるようにするため
Srikanth Pai

33
連絡先情報がすでにある場合は、連絡先をタップして[OK]をクリックして送信しなくても、連絡先情報を追加してメッセージを送信できますか?
user1492955


4
@MananMerevikSharmaソースが嘘をつきません(android.googlesource.com/platform/frameworks/base/+/refs/heads/…)。さらに、Javaの基本原則:オブジェクトへの参照がなくなるまでオブジェクトは存続します。
JRomero 2014年

1
@MananMerevikSharma -1。「nullポインタに戻る」ことはありません。else部分には到達できません。WhatsAppがインストールされていない場合でも、インテントは送信されますが、一致するアプリがないことを示すダイアログが開きます。これは、WhatsAppがインストールされているかどうかを確認する方法を提供していないことを意味します。
0101100101 2014

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 14

@VihaanVerma、これを機能させる方法を教えてください。whatsappバージョン2.11.56021に対して同じコードを実装しましたが、何も得られません...
Alamgir Mand

1
チェックすると、特定の番号のチャットウィンドウではなく、すべてのチャットリストに移動します。
Darpan、2015年

8
チャットリストまたは連絡先リストにその番号がある場合にのみ機能します。
Anshul Tyagi 2016

1
指定された番号のチャットを直接開くためにstartActivity(Intent.createChooser(i, ""));使用する代わりにstartActivity(i);。1.動作しているSamsung J7プライムでテスト済み。2.番号がチャットリストにも連絡先リストにもありませんでした。3.番号がwhatsappを使用していない場合、whatsappでその連絡先を招待するかどうかを尋ねるダイアログボックスが表示されます。アプリのユーザーにwhatsappの連絡先サポートを提供する場合は、これが最良のソリューションだと思います。
ムハンマドサキブ2017

25

私は次の解決策を見つけました、最初にwhatsapp idが必要です:

ここの他のスレッドや他のフォーラムからのレポートと一致するのは、私が見つけたログイン名がなんらかの種類でした。0のない国際市外局番または先頭に+あり+最初の0なしの電話番号+ @ s.whatsapp.net

たとえば、オランダに住んでいて、電話番号が0612325032である場合、オランダの場合、0または+のない+31と0のない電話番号は、31612325023 @ s.whatsapp.net-> +31になります。

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はアクションバーSherlockを使用しているため、メソッドです。getSherlockActivity()の代わりにアクティビティのスコープを取得します。
Manan Sharma

4
if (whatsapp != null)あなたがしIntent whatsapp = new Intent(...)た上の2行としては意味がありません。
Carcamano 14

2
これは、その人が連絡先に存在する場合にチャットウィンドウを直接開くのに適したオプションです。私たちの連絡先に存在しない新しい番号に対して同じことをする方法はありますか?
MohammedYakub Moriswala 2014年

1
<uses-permission android:name="android.permission.READ_CONTACTS" />許可を追加する必要があります AndroidManifest.xml
Pratik Butani 2015

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
whatsappがインストールされていても例外ではないアクティビティ
itzhar 2015

2
インテントを処理するアクティビティが見つかりません{act = android.intent.action.SENDTO typ = text / plain pkg = com.whatsapp(extrasあり)}
Rajesh

2
sendIntent.setType( "text / plain");を使用するには、この行を削除する必要があります。
MSaudi 2017

2
sendIntent.setType( "text / plain")を削除すると、アクティビティが見つからない
例外

もはや不可能のようです。インテントを受け取るアクティビティには「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がインストールされていない場合、これは人との直接チャットを開きます、SMSまたは単純なSMSメッセージを介して招待を送信することを提供するwhatsappに電話番号がわからない場合は、例外スローされます


「送信ボタン」はどうですか?プログラムでそれを行うこともできますか?
gumuruh

3

次のコードはGoogle Nowアプリで使用され、他のアプリケーションでは機能しません。

WhatsAppでは、Google以外の開発者がメッセージを直接送信することを許可していないことに腹を立てているので、この投稿を書いています。

そして、私は他のフリーランスの開発者にこの種の協力が行われていることを知ってもらいたいが、Googleは「誰にでもオープン」について話し続けており、WhatsAppは開発者にアクセスを提供したくないと言っている。

最近WhatsAppは、Google Nowのために特別にインテントを追加しました。これは次のようになります。

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 Nowによって作成されたものであるかどうか、Googleアプリに返送され、チェックされます。

そうでない場合、WhatsAppはメッセージを受け入れません。


面白い!「search_action_token」の詳細と、それを取得して実装する方法を説明してください。
ビラルムスタファ

APK com.google.android.googlequicksearchbox Class com.google.android.search.verification.api.SearchActionVerificationService Method createGoogleVerificationIntent
black-hawk

3

現在、リクエストできる唯一の公式APIGET

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

とにかく、WhatsAppによって既に実行されている秘密のAPIプログラムがあります。


1
このリンクで質問に答えることができますが、回答の重要な部分をここに含め、参照用のリンクを提供することをお勧めします。リンクされたページが変更されると、リンクのみの回答が無効になる可能性があります。- レビューから
Kumar Saurabh

1
@KumarSaurabhこれはリンクではなく、GETリクエストです
Zameer

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 FAQをご覧ください。


1

ドキュメントは言うあなただけのようなURLを使用することができます。

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

次の形式の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.meURLとして使用すると、すべての共有リンクが失敗します。 使用してください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を使用し ます //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

私の記事に示すように次の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;
}

次に、ヘッダーと本文の両方を送信し、「OK」になる必要がある結果を待ちます。

ステップ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);
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.