将图像发送给Whatsapp用户

时间:2019-08-31 14:29:27

标签: java android whatsapp

我试图通过Stackoverflow Send message via whatsapp programmatically中“ user1079425”指示的辅助功能按“发送”按钮,将图像发送到一定数量的Whatsapp。

这是我正在使用的代码:

private void sendImageWhatsapp (String telephone){

    String toNumber, tel, message;
    String mystring = "\u0007";

    // adjust tel.number
    tel = telephone.replaceAll("[^0-9+]","");
    if (tel.substring(0,1).equalsIgnoreCase("+")){
        tel = tel.substring(1);
    }
    else{
        if (tel.substring(0,2).equalsIgnoreCase("00")){
            tel = tel.substring(2);
        }
        else{
            tel = context.getApplicationContext().getResources().getString(R.string.prefix_code) + tel;
        }
    }

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

    toNumber = tel;     // E164 format without '+' sign
    message = imageDidascalia.getText().toString() + mystring;

    Intent sendIntent = new Intent("android.intent.action.MAIN");
    //sendIntent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(imageFile));
    sendIntent.putExtra(Intent.EXTRA_STREAM, imageUri);
    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);
}

public class WhatsappAccessibilityService extends AccessibilityService {

private int index = 0;

@Override
public void onAccessibilityEvent (AccessibilityEvent event) {
    if (getRootInActiveWindow () == null) {
        return;
    }

    AccessibilityNodeInfoCompat rootInActiveWindow = AccessibilityNodeInfoCompat.wrap (getRootInActiveWindow ());

    // Whatsapp Message EditText id
    List<AccessibilityNodeInfoCompat> messageNodeList = rootInActiveWindow.findAccessibilityNodeInfosByViewId ("com.whatsapp:id/entry");
    if (messageNodeList == null || messageNodeList.isEmpty ()) {
        // Whatsapp Image EditText id
        index=1;
        messageNodeList = rootInActiveWindow.findAccessibilityNodeInfosByViewId ("com.whatsapp:id/pickfiletype_gallery");
        if (messageNodeList == null || messageNodeList.isEmpty ()) {
            return;
        }`enter code here`

        //return;
    }

    // check if the whatsapp message EditText field is filled with text and ending with your suffix (explanation above)
    AccessibilityNodeInfoCompat messageField = messageNodeList.get (index);
    if (messageField.getText () == null || messageField.getText ().length () == 0
            || !messageField.getText ().toString ().endsWith ("\u0007")) { // So your service doesn't process any message, but the ones ending your apps suffix
        //               || !messageField.getText ().toString ().endsWith (getApplicationContext ().getString (R.string.whatsapp_suffix))) { // So your service doesn't process any message, but the ones ending your apps suffix
        return;
    }

    // Whatsapp send button id
    List<AccessibilityNodeInfoCompat> sendMessageNodeInfoList = rootInActiveWindow.findAccessibilityNodeInfosByViewId ("com.whatsapp:id/send");
    if (sendMessageNodeInfoList == null || sendMessageNodeInfoList.isEmpty ()) {
        return;
    }

    AccessibilityNodeInfoCompat sendMessageButton = sendMessageNodeInfoList.get (0);
    if (!sendMessageButton.isVisibleToUser ()) {
        return;
    }

    // Now fire a click on the send button
    sendMessageButton.performAction (AccessibilityNodeInfo.ACTION_CLICK);

    // Now go back to your app by clicking on the Android back button twice:
    // First one to leave the conversation screen
    // Second one to leave whatsapp
    try {
        Thread.sleep (500); // hack for certain devices in which the immediate back click is too fast to handle
        performGlobalAction (GLOBAL_ACTION_BACK);
        Thread.sleep (500);  // same hack as above
    } catch (InterruptedException ignored) {}
    performGlobalAction (GLOBAL_ACTION_BACK);
}

@Override
public void onInterrupt() {
}
}

此代码适用于消息,但不适用于图像。

1 个答案:

答案 0 :(得分:1)

我也陷入了同样的问题。花了一段时间后,我解决了这个问题。如果要发送图像而无需用户交互,则只需删除要应用于WhatsApp的编辑文本的代码和条件。我将直接跳至按钮代码,您的图像将自动发送到您已通过的号码。 ` 重写fun onAccessibilityEvent(event:AccessibilityEvent){ 如果(rootInActiveWindow == null){ 返回 } val rootInActiveWindow = AccessibilityNodeInfoCompat.wrap(rootInActiveWindow)

    // Whatsapp Message EditText id
    /*val messageNodeList = rootInActiveWindow.findAccessibilityNodeInfosByViewId("com.whatsapp:id/entry")
    if (messageNodeList == null || messageNodeList.isEmpty()) {
        return
    }

    // check if the whatsapp message EditText field is filled with text and ending with your suffix (explanation above)
    val messageField = messageNodeList[0]
    if (messageField.text == null || messageField.text.length == 0 || !messageField.text.toString().endsWith("abcd")) { // So your service doesn't process any message, but the ones ending your apps suffix
        return
    }*/

    // Whatsapp send button id
    val sendMessageNodeInfoList = rootInActiveWindow.findAccessibilityNodeInfosByViewId("com.whatsapp:id/send")
    if (sendMessageNodeInfoList == null || sendMessageNodeInfoList.isEmpty()) {
        return
    }
    val sendMessageButton = sendMessageNodeInfoList[0]
    if (!sendMessageButton.isVisibleToUser) {
        return
    }

    // Now fire a click on the send button
    sendMessageButton.performAction(AccessibilityNodeInfo.ACTION_CLICK)

    // Now go back to your app by clicking on the Android back button twice:
    // First one to leave the conversation screen
    // Second one to leave whatsapp
    try {
        Thread.sleep(2800) // hack for certain devices in which the immediate back click is too fast to handle
        performGlobalAction(GLOBAL_ACTION_BACK)
        Thread.sleep(2800) // same hack as above
    } catch (ignored: InterruptedException) {
    }
    performGlobalAction(GLOBAL_ACTION_BACK)
}

` 如果将图像与文本一起传递,则编辑文本将返回null,因此我们将注释编辑文本的代码。请仔细阅读我如何注释Whatsapp编辑文本的代码,以便它直接执行按钮单击。