我已经找到了很多类似问题的线程,但没有找到我想要的东西。
给定一个联系电话和短信,我想以编程方式向该联系人发送WhatsApp消息,而无需打开应用程序或选择联系人。
到目前为止,我已经编写了以下代码:
private static void sendTextUsingWhatsapp(Context context, Pair<S, S> contact, String Text) {
Intent sendIntent = new Intent("android.intent.action.MAIN");
sendIntent.setComponent(new ComponentName("com.whatsapp","com.whatsapp.Conversation"));
sendIntent.putExtra("jid", PhoneNumberUtils.stripSeparators(countryCode +
contact.second)+"@s.whatsapp.net");
sendIntent.putExtra(Intent.EXTRA_TEXT, text);
sendIntent.setType("text/plain");
sendIntent.setAction(Intent.ACTION_SEND);
context.startActivity(sendIntent);
}
通过这段代码,我将进入WhatsApp联系人的窗口。
此 SO 问题指出不支持此类功能。但是,Google Now("好的Google,发送消息"(如何在后台发送WhatsApp消息?
您无法在后台发送whatsApp消息。您可以使用安卓辅助功能服务来自动化它。
我的安卓清单.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"/>
我的无障碍服务.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");
}
}
辅助功能服务管理器.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();
}
}
你可以在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);
}
}
});
这对我有用。