如何通过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
相关产品推荐
相关产品推荐

