在后台发送 WhatsApp 消息或在 Android 中发送消息并关闭应用程序

2023-12-05

是否可以在不打开应用程序的情况下发送whatsApp消息,在后台发送,就像使用发送短信一样:

smsManager.sendTextMessage("+12546304580", null, "Test Message", null, null);

如果是这样怎么办?我尝试的代码打开了应用程序(有意):

    Intent waIntent = new Intent(Intent.ACTION_SEND);
    waIntent.setType("text/plain");
    String text = "Test Message";
    waIntent.setPackage("com.whatsapp");
    waIntent.putExtra(Intent.EXTRA_TEXT, text);//
    startActivity(Intent.createChooser(waIntent, "Share with"));

或者是否可以打开应用程序向给定地址发送消息并关闭它?

Thanks!


不,这是不可能的,因为 Whatsapp 不提供内容提供商,将来也不会。

可以重新反汇编并实现基于jabber的协议。

您需要处理握手等问题。

无论如何,这是不可能的,如果你不想组装整个网络的东西,即使是 root 也不可能。

由于您的第二个问题(例如捕获 Whatsapp 消息并关闭应用程序):

您将需要一个辅助服务来捕获给定包上的所有传入事件。示例如下:

public static final String FACEBOOK_PACKAGE_NAME = "com.facebook.orca";

public class DefaultAccessibility extends AccessibilityService {
  @Override
public void onAccessibilityEvent(AccessibilityEvent event) {
    final int eventType = event.getEventType();
    try {
        if (Build.VERSION.SDK_INT >= 16) {
            switch (eventType) {
                case AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED:
                Notification notification = (Notification) event.getParcelableData();
                if (event.getPackageName().equals(WHATSAPP_PACKAGE_NAME)) {
                        RemoteViews views = notification.bigContentView;
                        Class<?> secretClass = views.getClass();
                        ArrayList<String> raw = new ArrayList<String>();
                        Field outerFields[] = secretClass.getDeclaredFields();
                        for (Field outerField : outerFields) {
                            if (outerField.getName().equals("mActions")) {
                                outerField.setAccessible(true);
                                ArrayList<Object> actions = null;
                                try {
                                actions = (ArrayList<Object>) outerField.get(views);
                                for (Object action : actions) {
                                Field innerFields[] = action.getClass()getDeclaredFields();

                                        Object value = null;
                                        Integer type = null;
                                        for (Field field : innerFields) {
                                            try {
                                                field.setAccessible(true);
                                                if (field.getName().equals("type")) {
                                                    type = field.getInt(action);
                                                } else if (field.getName().equals("value")) {
                                                    value = field.get(action);
                                                }
                                            } catch (IllegalArgumentException e) {
                                            } catch (IllegalAccessException e) {
                                            }
                                        }

                                        if (type != null && type == 10 && value != null) {
                                            raw.add(value.toString());
                                        }
                                    }
                                } catch (IllegalArgumentException e1) {
                                } catch (IllegalAccessException e1) {
                                }
                            }
                            parseWhatsappRawMessages(raw);

                        }
                }
}

以及解析方法。

private void parseWhatsappRawMessages(ArrayList<String> raw) {

        int count = raw.size();
        if (count > 2) {
                Log.d(TAG, "RAW TITLE: " + raw.get(0));
                Log.d(TAG, "RAW MESSAGE: " + raw.get(1));
        }
}

您现在可以解析消息的原始消息并执行您想要的任何操作。

不要忘记在清单中注册 accessibilityService 并让用户启用它。

    <service
        android:name="com.app.DefaultAccessibility"
        android:enabled="true"
        android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE">
        <intent-filter>
            <action android:name="android.accessibilityservice.AccessibilityService"></action>
        </intent-filter>
        <meta-data
            android:name="android.accessibilityservice"
            android:resource="@xml/accessibilityservice"/>
    </service>

并且您的 xml/accesibilityservice.xml 文件应包含您想要为 accesibilityservice 启用的任何内容。

<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"
android:accessibilityEventTypes="typeAllMask"
android:accessibilityFeedbackType="feedbackAllMask"
android:notificationTimeout="100"
android:description="@string/accessibility_service_description" />

并且不要忘记让用户激活它。您可以通过调用让用户直接进入设置

Intent intent = new Intent(android.provider.Settings.ACTION_ACCESSIBILITY_SETTINGS);
startActivityForResult(intent, 1337);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在后台发送 WhatsApp 消息或在 Android 中发送消息并关闭应用程序 的相关文章

随机推荐

  • 如何在github上发布.php页面而不是.html来演示一些php内容?

    我正在看以下演示 http blueimp github com jQuery File Upload 据我在演示中的理解 php 文件是从 github 提供的 这意味着 php 内容可以从 github 提供 运行 我了解通过此链接从
  • iPhone - 为什么编译器在构建 ARM 架构时找不到某些包含内容?

    我正在尝试在 iPhone 项目中使用 C 库 我对 iPhone 开发非常陌生 我的图书馆 我已经奋斗了好几天 试图将此库构建成一个静态库 我可以将其用于模拟器 i386 和 ARM7 使用库的包含配置和 makefile 我可以毫无问题
  • 如何使用 Visual Studio 2015 为网站项目配置不同的虚拟目录

    我有一个在 VS 2012 中开发的 c 网站类型项目 我想使用 VS 2015 但无法指定与默认根目录 不同的虚拟目录 在 vs 2012 中 sln 文件中有以下几行 VWDPort 59903 VWDDynamicPort true
  • 使用正则表达式搜索元胞数组

    我经常发现自己尝试搜索元胞数组 就像我想使用 sql 查询搜索数据库一样 在这种情况下 我有许多军事基地 bases shp bases shaperead us military bases shp 然后我想过滤形状文件以获得空军基地 例
  • 使输入拇指比其他拇指更大

    这里的 React 开发人员试图通过编码来学习 这里我有一个滑块 我试图使拇指变大 但它不会比它所在的输入更大 正如你所看到的 如果我使拇指变大 它不会完全显示它 关于如何使它看起来像我想要的有什么建议吗 英语不是我的母语 所以可能会有错误
  • C#中如何获取变量的数据类型?

    如何找出某个变量保存的数据类型 例如 int string char 等 我现在有这样的事情 private static void Main var someone new Person Console WriteLine someone
  • 反应选择的默认值,当我想发布具有空白页面输出的数据时,复选框不起作用

    我无法将获取的数据作为默认值放入下拉列表 反应选择 和复选框中 我有显示的下拉菜单 好 但默认值dishId 1 is Medium 所以我应该看到在我的下拉列表中已经选择了Medium 但事实并非如此 评论的问题相同 export def
  • DllImport 与 LoadLibrary,最好的方法是什么?

    我通常在 c NET 中使用 Win32 API 但不要在一份申请中声明所有内容 有时通常使用 user32 有时使用 gdi32 我认为当我声明所有 api 函数时 它们会使用大量内存 在 NET 中使用 API 的最佳方式是什么 当您编
  • Cordova - 内部超链接始终在 Safari 中打开

    我对 Cordova 很陌生 所以我可能不完全理解它的用途 让我从我总体上想要实现的目标开始 我们有一个支持移动设备的 asp net 网站 我基本上只是想用 iPhone 应用程序来包装它 当然 该站点在 IIS 服务器上运行 因此我只需
  • Java中捕获异常的顺序

    如果我没记错的话 应该首先捕获异常的子类 但是必须捕获任何 RuntimeException 和一个具体的检查异常 这应该首先捕获 try catch RuntimeException e catch IOException e 这个顺序正
  • Java 8 混乱 -> String::compareToIgnoreCase

    有人可以帮助我理解以下内容吗 This works fine List list Arrays asList a b A B str sort String compareToIgnoreCase 我可以将上述方法引用分配给任何变量吗 ho
  • 如何从存根函数参数获取属性?

    我有一项服务 它应该创建一个电子邮件类对象并将其传递给第三类 电子邮件发送者 我想检查由该函数生成的电子邮件正文 服务 php class Service var EmailService protected emailService pu
  • 用于对象导出和类型的 def 文件

    好的 我们有了一个 Node 模块string similaritywho 导出两个这样的函数 参见 https github com aceakash string similarity blob master compare strin
  • 如何在 VS Code linter 中更改 pylint 消息模板?

    我的目标是更改 VS Code 中 linter 消息的 pylint 消息模板 我使用的是 Don Jayamanne 提供的 VS Code 标准 Python 扩展 该扩展现在由 Microsoft 直接维护 默认情况下 消息格式如下
  • 根据布尔掩码将值从一个 numpy 矩阵复制到另一个

    作为一个简单的例子 我有以下内容 import numpy as np a np matrix 0 34 0 44 0 21 0 51 a max np matrix 0 35 0 40 0 20 0 50 我想应用一个转换 其中 a 中大
  • CSS中有什么尖锐的样式吗?

    我想使用 Photoshop 中的 style sharp 在我的 css 中设置一些字体的样式 有谁知道路吗 Photoshop 使用自定义字体渲染引擎 您无法使用 CSS 来模拟该引擎 此外 每个平台都有自己的渲染引擎 CSS无法控制
  • 使用来自 C# 的参数运行控制台应用程序 - GUI 连接建议

    警告 这是一个 C n00b 问题 尝试学习一些 C 同时让我经常运行的控制台应用程序变得更容易 我正在尝试运行控制台应用程序 consoleapp exe 而无需每次手动输入参数 命令通常采用以下形式 C consoleapp exe u
  • 字符串操作 - 还有其他有效的方法吗?

    我有一个要求 我需要在给定的字符串变量中插入转义序列 无论是在哪里单引号出现 我尝试使用split方法以及字符串分词器 没有一个适合我 所以我开发了下面提到的逻辑 在某些情况下它也会失败 谁能给我提供一种最简单的方法来实现这样的要求 pub
  • 查找缺少任意字段的 CouchDB 文档

    我需要一个 CouchDB 视图 可以在其中获取所有没有任意字段的文档 如果您事先知道文档的哪些字段 这很容易做到might没有 例如 这可以让你发送view my view key foo 轻松检索没有 foo 字段的文档 functio
  • 在后台发送 WhatsApp 消息或在 Android 中发送消息并关闭应用程序

    是否可以在不打开应用程序的情况下发送whatsApp消息 在后台发送 就像使用发送短信一样 smsManager sendTextMessage 12546304580 null Test Message null null 如果是这样怎么