是否可以在不打开应用程序的情况下发送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"));
或者是否可以打开应用程序发送消息到给定地址并关闭它?
谢谢!
不,这是不可能的,因为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);