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

 mobiledu2502932307 发布于 2023-01-08 18:02

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

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

如果是这样的话?我尝试的代码打开了APP(WITH INTENT):

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

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

谢谢!

1 个回答
  • 不,这是不可能的,因为Whatsapp不提供ContentProviders,并且将来也不会.

    可以重新拆解和实现基于jabber的协议.

    你需要处理握手等.

    无论如何,如果你不想组装整个网络的东西,它是不可能的,甚至不是root.

    因为您的第二个问题(捕获Whatsapp消息并关闭应用程序):

    您将需要一个Accesibility Service来捕获给定包上的所有传入事件.例如:

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

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

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

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

    2023-01-08 18:04 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有