web-dev-qa-db-ja.com

Whatsappメッセージを特定の連絡先に送信する

私はこれに従いました link そしてこれは私のコードです

Intent i = new Intent(Intent.ACTION_VIEW, Uri.parse("content://com.Android.contacts/data/" + "[email protected]"));
                i.setPackage("com.whatsapp");
                startActivity(i);

これは私のログです

Android.content.ActivityNotFoundException: No Activity found to handle Intent { act=Android.intent.action.VIEW dat=content://com.Android.contacts/data/[email protected] pkg=com.whatsapp }
        at Android.app.Instrumentation.checkStartActivityResult(Instrumentation.Java:1545)
        at Android.app.Instrumentation.execStartActivity(Instrumentation.Java:1416)
        at Android.app.Activity.startActivityForResult(Activity.Java:3351)
        at Android.app.Activity.startActivityForResult(Activity.Java:3312)
        at Android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.Java:824)
        at Android.app.Activity.startActivity(Activity.Java:3522)
        at Android.app.Activity.startActivity(Activity.Java:3490)
        at com.sieryuu.maidchan.MainActivity.onClick(MainActivity.Java:61)
        at Android.view.View.performClick(View.Java:4147)
        at Android.view.View$PerformClick.run(View.Java:17161)
        at Android.os.Handler.handleCallback(Handler.Java:615)
        at Android.os.Handler.dispatchMessage(Handler.Java:92)
        at Android.os.Looper.loop(Looper.Java:213)
        at Android.app.ActivityThread.main(ActivityThread.Java:4787)
        at Java.lang.reflect.Method.invokeNative(Native Method)
        at Java.lang.reflect.Method.invoke(Method.Java:511)
        at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:789)
        at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:556)

私の質問:バックグラウンドでwhatsapp連絡先にテキストを送信する方法(連絡先番号を選択せず​​に、すでにIDを知っています)? Root必要な場合

17
Sieryuu

これを行う正しい方法を見つけましたが、この記事を読んだ後は簡単です: http://howdygeeks.com/send-whatsapp-message-unsaved-number-Android/

電話とメッセージは両方とも文字列です。

ソースコード:

try {
            PackageManager packageManager = context.getPackageManager();
            Intent i = new Intent(Intent.ACTION_VIEW);
            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();
        }

楽しい!

8
Crono

Whatsappを開かずにバックグラウンドで特定のユーザーにメッセージを送信する場合、デバイスをルート化した場合は、次のコードを使用すると役立ちます。

 protected void whatsAppSendMessage(String[] paramArrayOfString, String paramString) {
  try {
   Shell shell = Shell.startRootShell();
   int j = paramArrayOfString.length;
   for (int i = 0; i < j; i++) {
    String str3;
    long l1;
    long l2;
    int k;
    String str1;
    String str2;
    Random localRandom = new Random(20L);

    Log.d("AUTO",
      "ps | grep -w 'com.whatsapp' | awk '{print $2}' | xargs kill");
    commandsTestOnClick("ps | grep -w 'com.whatsapp' | awk '{print $2}' | xargs kill");

    str3 = paramArrayOfString[i] + "@s.whatsapp.net";
    l1 = System.currentTimeMillis();
    l2 = l1 / 1000L;
    k = localRandom.nextInt();

    str1 = "sqlite3 /data/data/com.whatsapp/databases/msgstore.db \"INSERT INTO messages (key_remote_jid, key_from_me, key_id, status, needs_Push, data, timestamp, MEDIA_URL, media_mime_type, media_wa_type, MEDIA_SIZE, media_name , latitude, longitude, thumb_image, remote_resource, received_timestamp, send_timestamp, receipt_server_timestamp, receipt_device_timestamp, raw_data, media_hash, recipient_count, media_duration, Origin)VALUES ('"
      + str3
      + "', 1,'"
      + l2
      + "-"
      + k
      + "', 0,0, '"
      + paramString
      + "',"
      + l1
      + ",'','', '0', 0,'', 0.0,0.0,'','',"
      + l1
      + ", -1, -1, -1,0 ,'',0,0,0); \"";

    str2 = "sqlite3 /data/data/com.whatsapp/databases/msgstore.db \"insert into chat_list (key_remote_jid) select '"
      + str3
      + "' where not exists (select 1 from chat_list where key_remote_jid='"
      + str3 + "');\"";

    str3 = "sqlite3 /data/data/com.whatsapp/databases/msgstore.db \"update chat_list set message_table_id = (select max(messages._id) from messages) where chat_list.key_remote_jid='"
      + str3 + "';\"";

    Log.d("AUTO", str1);
    Log.d("AUTO", str2);
    Log.d("AUTO", str3);

    Shell.add(
      new SimpleCommand(
        "chmod 777 /data/data/com.whatsapp/databases/msgstore.db"))
      .waitForFinish();
    Shell.add(new SimpleCommand(str1)).waitForFinish();
    Shell.add(new SimpleCommand(str2)).waitForFinish();
    Shell.add(new SimpleCommand(str3)).waitForFinish();
   }
   Shell.close();
  } catch (Exception e) {
   e.printStackTrace();
  }
 }

詳細については、このブログをご覧ください...私はそれが正常に動作していることをテストしました

http://siddhpuraamit.blogspot.in/

4
Siddhpura Amit

少しググリングした後、私は次のコードを見つけました

    public void onClickWhatsApp(View view) {

    Intent waIntent = new Intent(Intent.ACTION_SEND);
    waIntent.setType("text/plain");
            String text = "YOUR TEXT HERE";
    waIntent.setPackage("com.whatsapp");
    if (waIntent != null) {
        waIntent.putExtra(Intent.EXTRA_TEXT, text);//
        startActivity(Intent.createChooser(waIntent, "Share with"));
    } else {
        Toast.makeText(this, "WhatsApp not Installed", Toast.LENGTH_SHORT)
                .show();
    }

}

したがって、メッセージを送信するインテントを送信できますが、これまでのところ、特定の連絡先に送信することはできません

2
Daniel Bo
private void openWhatsApp(String id) {

Cursor c = getSherlockActivity().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();
}

Idはapp uriのようなものです

 [email protected]
2
Ahmed Ekri

画像とテキストに次のソリューションを使用してみてください。

テキストメッセージのみを送信する場合は、setType( "text")を変更し、ExtraStreamを削除するだけです。

            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マニフェストのスニペット、

通常の共有インテント。「[〜#〜] send [〜#〜]」を使用します。これは特定の連絡先への送信を許可せず、連絡先ピッカーを必要とします。

特定の連絡先は会話クラスによって取得され、「SEND_TO」アクションを使用しますが、SMSボディを使用し、画像やその他の添付ファイルを取得できません。

 <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」であることがわかりました。

1
Bhavita Lalwani

次を試してください:

Intent i = new Intent(Intent.ACTION_VIEW).setData(Uri.parse("content://com.Android.contacts/data/" + "[email protected]"));
i.setPackage("com.whatsapp");
startActivity(i);
0
Erdinc Ay

あなたはこれを試すことができます、それは私のために働きます:

String waUrl = "https://wa.me/918982061674?text=I+can+help+you+with+your+BA+Tuition+requirement.+Please+call+me+at+09080976510+or+check+my+UrbanPro+profile%3A+http%3A%2F%2Flocalhost%3A8080%2Ftesturl";

try {
  PackageManager packageManager = context.getPackageManager();
  Intent i = new Intent(Intent.ACTION_VIEW);
  String url = waUrl;
  i.setPackage("com.whatsapp");
  i.setData(Uri.parse(url));
  if (i.resolveActivity(packageManager) != null) {
    context.startActivity(i);
  }
} catch (Exception e) {
  Log.e("WHATSAPP", e.getMessage())
}
0
Aakash Daga

私はこのコードを私のために完璧に機能させています。また、whats-appがインストールされていない場合はPlayストアに移動するかどうかを確認しています。

private void openWhatsApp() {
    String smsNumber = "8801714884544";
    boolean isWhatsappInstalled = whatsappInstalledOrNot("com.whatsapp");
    if (isWhatsappInstalled) {
        try {
            Intent sendIntent = new Intent("Android.intent.action.MAIN");
            sendIntent.setAction(Intent.ACTION_SEND);
            sendIntent.setType("text/plain");
            sendIntent.putExtra(Intent.EXTRA_TEXT, FormViews.getTexBoxFieldValue(enquiryEditText));
            sendIntent.putExtra("jid", smsNumber + "@s.whatsapp.net"); //phone number without "+" prefix
            sendIntent.setPackage("com.whatsapp");
            startActivity(sendIntent);
        } catch(Exception e) {
            Toast.makeText(getActivity(), "Error/n" + e.toString(), Toast.LENGTH_SHORT).show();
        }
    } else {
        Uri uri = Uri.parse("market://details?id=com.whatsapp");
        Intent goToMarket = new Intent(Intent.ACTION_VIEW, uri);
        Toast.makeText(getActivity(), "WhatsApp not Installed",
                Toast.LENGTH_SHORT).show();
        getActivity().startActivity(goToMarket);
    }
}

private boolean whatsappInstalledOrNot(String uri) {
    PackageManager pm = getActivity().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;
}
0
Shohel Rana