You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过onActivityResult获取WhatsApp消息发送状态及处理相关问题

问题与解决方案

现有代码

发送WhatsApp消息的点击事件代码

numberlist.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
        try {
            Toast.makeText(getBaseContext(), (String) numberlist.getItemAtPosition(i), Toast.LENGTH_SHORT).show();
            txtnumber.setText(numberlist.getItemAtPosition(i).toString());
            String suffix = "Thanks";

            PackageManager packageManager = MainActivity.this.getPackageManager();
            Intent saif = new Intent(Intent.ACTION_VIEW);
            String message = txtmessage.getText().toString() + suffix.toString();
            String phone = txtnumber.getText().toString();
            String url = "https://api.whatsapp.com/send?phone=" + phone + "&text=" + message;
            saif.setPackage("com.whatsapp");
            saif.setData(Uri.parse(url));
            if (saif.resolveActivity(packageManager) != null) {
                MainActivity.this.startActivityForResult(saif, 1);
            }
        } catch (Exception e) {
            Log.e("ERROR WHATSAPP",e.toString());
            Toast.makeText(getApplicationContext(),
                    "Contact not found",
                    Toast.LENGTH_LONG).show();
        }
    }
});

onActivityResult代码

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    Toast.makeText(MainActivity.this.getApplicationContext(),"Message Send",Toast.LENGTH_SHORT).show();
    if (requestCode == 1) {
        if(resultCode==RESULT_OK) {
            Toast.makeText(MainActivity.this.getApplicationContext(), "Back to ..:", Toast.LENGTH_SHORT).show();
        }
    }
}

遇到的问题

  • 问题1:接收方未注册WhatsApp时,消息未发送,但仍会弹出"Message Send"的成功提示Toast。
  • 问题2:接收方未注册WhatsApp时,WhatsApp会弹出"该号码未注册WhatsApp"的通知,需要通过辅助功能自动处理该通知。

解决方案

解决问题1:修正消息发送状态的判断逻辑

当前代码在onActivityResult开头直接固定弹出成功提示,导致无论实际发送结果如何都会显示。且通过Intent.ACTION_VIEW跳转WhatsApp的方式,startActivityForResult无法准确获取消息是否发送成功的状态(WhatsApp不会返回明确的发送结果码)。

修改后的onActivityResult代码:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == 1) {
        // 移除错误的固定成功提示,改为中性返回提示
        Toast.makeText(MainActivity.this.getApplicationContext(), "返回应用", Toast.LENGTH_SHORT).show();
    }
}

解决问题2:通过AccessibilityService自动处理WhatsApp的通知

需要创建一个继承自AccessibilityService的类,监听WhatsApp的通知,检测到指定内容的通知时自动执行处理操作。

步骤1:创建AccessibilityService类

public class WhatsAppAccessibilityService extends AccessibilityService {

    @Override
    public void onAccessibilityEvent(AccessibilityEvent event) {
        if (event.getEventType() == AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED) {
            List<CharSequence> texts = event.getText();
            if (!texts.isEmpty()) {
                for (CharSequence text : texts) {
                    String notificationText = text.toString();
                    // 匹配WhatsApp的未注册提示通知
                    if (notificationText.contains("该号码未注册WhatsApp")) {
                        // 自动关闭通知栏
                        performGlobalAction(GLOBAL_ACTION_BACK);
                        // 若通知内有"确定"按钮,可查找并点击
                        AccessibilityNodeInfo rootNode = getRootInActiveWindow();
                        if (rootNode != null) {
                            List<AccessibilityNodeInfo> buttonNodes = rootNode.findAccessibilityNodeInfosByText("确定");
                            if (!buttonNodes.isEmpty()) {
                                buttonNodes.get(0).performAction(AccessibilityNodeInfo.ACTION_CLICK);
                            }
                        }
                    }
                }
            }
        }
    }

    @Override
    public void onInterrupt() {}

    @Override
    protected void onServiceConnected() {
        super.onServiceConnected();
        AccessibilityServiceInfo info = new AccessibilityServiceInfo();
        info.packageNames = new String[]{"com.whatsapp"}; // 仅监听WhatsApp
        info.eventTypes = AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED;
        info.feedbackType = AccessibilityServiceInfo.FEEDBACK_GENERIC;
        setServiceInfo(info);
    }
}

步骤2:在AndroidManifest.xml中注册服务

<service
    android:name=".WhatsAppAccessibilityService"
    android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE">
    <intent-filter>
        <action android:name="android.accessibilityservice.AccessibilityService" />
    </intent-filter>
    <meta-data
        android:name="android.accessibilityservice"
        android:resource="@xml/accessibility_service_config" />
</service>

步骤3:创建accessibility_service_config.xml(res/xml目录下)

<?xml version="1.0" encoding="utf-8"?>
<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"
    android:accessibilityEventTypes="typeNotificationStateChanged"
    android:accessibilityFeedbackType="feedbackGeneric"
    android:accessibilityFlags="flagDefault"
    android:canRetrieveWindowContent="true"
    android:description="@string/accessibility_desc"
    android:packageNames="com.whatsapp" />

步骤4:添加权限说明字符串(res/values/strings.xml)

<string name="accessibility_desc">自动处理WhatsApp未注册号码的通知提示</string>

最后需在系统设置中开启该辅助功能服务,才能生效。


内容的提问来源于stack exchange,提问作者Maria

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 18:42:01