You can't send whatsApp message in background. You can use android accessibility service to automate it.
My AndroidManifest.xml
<service android:name=".helper.MyAccessibilityService"
android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE"
android:label="@string/app_name"
android:exported="true">
<meta-data
android:name="android.accessibilityservice"
android:resource="@xml/config_accessibility_service" />
<intent-filter>
<action android:name="android.accessibilityservice.AccessibilityService" />
</intent-filter>
</service>
config_accessibility_service.xml
<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"
android:description="@string/app_name"
android:accessibilityEventTypes="typeAllMask"
android:accessibilityFlags="flagDefault"
android:accessibilityFeedbackType="feedbackSpoken"
android:notificationTimeout="100"
android:canRetrieveWindowContent="true"
android:settingsActivity="com.example.android.accessibility.ServiceSettingsActivity"/>
MyAccessibilityService.java
import android.accessibilityservice.AccessibilityService;
import android.accessibilityservice.AccessibilityServiceInfo;
import android.content.Intent;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.os.Build;
import android.os.PowerManager;
import android.util.Log;
import android.view.accessibility.AccessibilityEvent;
import android.view.accessibility.AccessibilityNodeInfo;
import androidx.core.view.accessibility.AccessibilityNodeInfoCompat;
import java.util.List;
public class MyAccessibilityService extends AccessibilityService {
private static final String TAG = "MyAccessibilityService";
@Override
public void onAccessibilityEvent(AccessibilityEvent event) {
String packageName = event.getPackageName().toString();
if (packageName.equals("com.whatsapp")){
PackageManager packageManager = this.getPackageManager();
try {
ApplicationInfo info = packageManager.getApplicationInfo(packageName,0);
String name = packageManager.getApplicationLabel(info).toString();
try {
AccessibilityNodeInfoCompat rootNodeInfo = AccessibilityNodeInfoCompat.wrap(getRootInActiveWindow());
List<AccessibilityNodeInfoCompat> sendMessageNodeList = rootNodeInfo.findAccessibilityNodeInfosByViewId("com.whatsapp:id/send");
if (sendMessageNodeList == null || sendMessageNodeList.isEmpty()){
return;
}
AccessibilityNodeInfoCompat sendMessage = sendMessageNodeList.get(0);
if (!sendMessage.isVisibleToUser()){
return;
}
sendMessage.performAction(AccessibilityNodeInfo.ACTION_CLICK);
try {
Thread.sleep(2000);
performGlobalAction(GLOBAL_ACTION_BACK);
//add below line, if u want to close whatsApp;
//performGlobalAction(GLOBAL_ACTION_BACK);
Thread.sleep(2000);
}catch (Exception e){
Log.e("onAccessibilityEvent", "onAccessibilityEvent: ",e );
}
}catch (Exception e){
e.printStackTrace();
}
Log.e(TAG, "onAccessibilityEvent: "+name );
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
}
}
@Override
public void onInterrupt() {
}
@Override
protected void onServiceConnected() {
super.onServiceConnected();
AccessibilityServiceInfo info = new AccessibilityServiceInfo();
info.eventTypes = AccessibilityEvent.TYPE_VIEW_CLICKED |
AccessibilityEvent.TYPE_VIEW_FOCUSED;
info.packageNames = new String[]
{"com.whatsapp"};
info.feedbackType = AccessibilityServiceInfo.FEEDBACK_SPOKEN;
this.setServiceInfo(info);
Log.d(TAG, "Accessibility service connected");
}
}
AccessibilityServiceManager.java
public class AccessibilityServiceManager {
Context context;
public AccessibilityServiceManager(Context context) {
this.context = context;
}
public boolean hasAccessibilityServicePermission(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;
}
public void requestUserForAccessibilityService(Activity activity){
new AlertDialog.Builder(context)
.setTitle("Permission needed")
.setMessage("You have to enable Accessibility service to use this feature")
.setNegativeButton("No", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
dialogInterface.dismiss();
}
})
.setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
Intent intent = new Intent(Settings.ACTION_ACCESSIBILITY_SETTINGS);
activity.startActivity(intent);
}
})
.show();
}
}
And you can call it in MainActivity.java
AccessibilityServiceManager serviceManager = new AccessibilityServiceManager(this);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (serviceManager.hasAccessibilityServicePermission(MyAccessibilityService.class)){
String message = "Your message",to = "91XXXXXXXXXX";
startActivity(
new Intent(Intent.ACTION_VIEW,
Uri.parse(
String.format("https://api.whatsapp.com/send?phone=%s&text=%s", to, message)
)
).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
);
}else{
serviceManager.requestUserForAccessibilityService(MainActivity.this);
}
}
});
This worked for me.