Accessibility services should only be used to assist users with disabilities in using Android devices and apps. They run in the background and receive callbacks by the system when AccessibilityEvents are fired. Such events denote some state transition in the user interface, for example, the focus has changed, a button has been clicked, etc.
We will use these feature to send WhatsApp messages automatically to provided numbers.
Lets, get to coding stuff,
Refer the below link for complete sample code:-
Download Sample Code
Have a look on few code snippets,
//WhatsappAccessibilityService.java
//MainActivity.java
We will use these feature to send WhatsApp messages automatically to provided numbers.
Lets, get to coding stuff,
Refer the below link for complete sample code:-
Download Sample Code
Have a look on few code snippets,
//WhatsappAccessibilityService.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 | package com.elitetechnologies.watsapppromoter; import android.accessibilityservice.AccessibilityService; import android.support.v4.view.accessibility.AccessibilityNodeInfoCompat; import android.view.accessibility.AccessibilityEvent; import android.view.accessibility.AccessibilityNodeInfo; import java.util.List; public class WhatsappAccessibilityService extends AccessibilityService { @Override public void onAccessibilityEvent (AccessibilityEvent event) { try { if (getRootInActiveWindow () == null) { return; } AccessibilityNodeInfoCompat rootInActiveWindow = AccessibilityNodeInfoCompat.wrap (getRootInActiveWindow ()); // Whatsapp send button id List<AccessibilityNodeInfoCompat> sendMessageNodeInfoList = rootInActiveWindow.findAccessibilityNodeInfosByViewId("com.whatsapp:id/send"); if (sendMessageNodeInfoList == null || sendMessageNodeInfoList.isEmpty()) { return; } AccessibilityNodeInfoCompat sendMessageButton = sendMessageNodeInfoList.get(0); if (!sendMessageButton.isVisibleToUser()) { return; } // Now fire a click on the send button sendMessageButton.performAction(AccessibilityNodeInfo.ACTION_CLICK); // Now go back to your app by clicking on the Android back button twice: // First one to leave the conversation screen // Second one to leave whatsapp Thread.sleep(1000); // hack for certain devices in which the immediate back click is too fast to handle performGlobalAction(GLOBAL_ACTION_BACK); Thread.sleep(1000); // same hack as above performGlobalAction(GLOBAL_ACTION_BACK); } catch (Exception e) { e.printStackTrace(); } } @Override public void onInterrupt() { System.out.println("Whatsapp Accessibility Service onInterrupt"); } } |
//MainActivity.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 | package com.elitetechnologies.watsapppromoter; import android.Manifest; import android.accessibilityservice.AccessibilityService; import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; import android.os.Bundle; import android.os.StrictMode; import android.provider.Settings; import android.support.v4.app.ActivityCompat; import android.support.v7.app.AppCompatActivity; import android.text.TextUtils; import android.view.View; import android.widget.ImageButton; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder(); StrictMode.setVmPolicy(builder.build()); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ImageButton ib_promote = (ImageButton) findViewById(R.id.ib_promote); ib_promote.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { new ProcessHelper(MainActivity.this).readExcelFileFromAssets(); } }); askPermissions(); } private void askPermissions() { String[] permissions = new String[]{ Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}; ActivityCompat.requestPermissions(this, permissions, 10); } @Override public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) { switch (requestCode) { case 10: { for (int i = 0; i < grantResults.length; i++) if (grantResults[i] == PackageManager.PERMISSION_DENIED) { break; }else{ if (!isAccessibilityOn(MainActivity.this, WhatsappAccessibilityService.class)) { Intent intent = new Intent(Settings.ACTION_ACCESSIBILITY_SETTINGS); startActivity(intent); return; } } return; } } } private boolean isAccessibilityOn(Context context, Class<? extends AccessibilityService> clazz) { int accessibilityEnabled = 0; final String service = context.getPackageName() + "/" + clazz.getCanonicalName(); try { accessibilityEnabled = Settings.Secure.getInt(context.getApplicationContext().getContentResolver(), Settings.Secure.ACCESSIBILITY_ENABLED); } catch (Settings.SettingNotFoundException ignored) { } TextUtils.SimpleStringSplitter colonSplitter = new TextUtils.SimpleStringSplitter(':'); if (accessibilityEnabled == 1) { String settingValue = Settings.Secure.getString(context.getApplicationContext().getContentResolver(), Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES); if (settingValue != null) { colonSplitter.setString(settingValue); while (colonSplitter.hasNext()) { String accessibilityService = colonSplitter.next(); if (accessibilityService.equalsIgnoreCase(service)) { return true; } } } } return false; } } |
Hi Harshal.
ReplyDeleteThis code was working fine until Android 9, but on Android 10 it stopped working. Could you help me solve this problem ?
if contact number is not on whatsapp then how it back itself ?
ReplyDeleteGreat Help Sir, But I got one Issue about. When I am Opening WhatsApp In Normally it also sends SMS after adding one char how to prevent this situation
ReplyDelete