web-dev-qa-db-fra.com

Envoyer un message Whatsapp à un contact spécifique

J'ai suivi ce link et c'est mon code

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

Ceci est mon journal

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)

Ma question: Comment envoyer du texte à un contact WhatsApp en arrière-plan (sans choisir le numéro du contact, je connais déjà l'identifiant)? Root si nécessaire

17
Sieryuu

J'ai trouvé le bon moyen de le faire et c'est simple après avoir lu cet article: http://howdygeeks.com/send-whatsapp-message-unsaved-number-Android/

téléphone et message sont tous deux String.

Code source:

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

Prendre plaisir!

7
Crono

Si vous souhaitez envoyer un message à un utilisateur particulier en arrière-plan sans ouvrir WhatsApp et que vous avez un appareil enraciné, utilisez le code suivant pour vous aider. 

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

Il suffit de vérifier ce blog pour plus d'informations ... J'ai testé le fonctionnement avec succès

http://siddhpuraamit.blogspot.in/

4
Siddhpura Amit

après avoir googlé un peu, j'ai trouvé le code suivant

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

}

vous pouvez donc envoyer une intention d'envoyer un message, mais pour autant que je sache, vous ne pouvez pas l'envoyer à un contact spécifique

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

Où id est ce à quoi ressemble uri dans l'application

 [email protected]
2
Ahmed Ekri

Essayez d’utiliser la solution suivante pour l’image accompagnée de texte.

Il suffit de modifier setType ("text") et de supprimer ExtraStream si vous souhaitez envoyer un message texte uniquement.

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

INFORMATIONS SUPPLEMENTAIRES SUR LE PROCESSUS DE RECHERCHE DE LA SOLUTION:

Après le reverse engineering de WhatsApp, je suis tombé sur l'extrait suivant du manifeste Android,

L'intention de partage normale utilise "SEND", ce qui ne vous permet pas d'envoyer des messages à un contact spécifique et nécessite un sélecteur de contacts.

Le contact spécifique est choisi par la classe de conversation et utilise l'action " SEND_TO ", mais il utilise le corps du SMS et ne peut pas prendre d'image ni d'autres pièces jointes.

 <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>

En creusant plus loin, je suis tombé sur ça, 

 <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>

Enfin, en utilisant un décompilateur pour les classes ContactPicker et Conversation, la valeur clé supplémentaire pour le numéro de téléphone était " jid ".

2
Bhavita Lalwani

Essayez de suivre:

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

Vous pouvez essayer ça, ça marche pour moi:

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

J'utilise ce code, il fonctionne parfaitement pour moi. Et aussi je vérifie si whats-app n'installe pas aller au Play Store.

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