我正在开发基于通知的应用,我需要收听来电通知。我已经能够收听来电,短信,邮件等。我不知道如何通过代码在Whatsapp上听朋友的ping或消息。这可以实际完成吗?如果是这样,怎么样?可以Accessibility Service使用包名称作为“com.whatsapp”吗?
答案 0 :(得分:19)
我可以使用Accessibility Service执行此操作。使用此功能,您可以收听通知栏上的所有通知。我通过将包名称添加到辅助功能服务service info
来监听应用程序规范,在本例中为com.whatsapp
。我无法阅读这些消息,但每当有消息到达时我都会收到通知。
答案 1 :(得分:9)
是强>
您可以实际解析传入的通知和自Android 4.2以来的消息。我做到了这一点:https://github.com/Snirpo/whatsapprelay。这是通过accessibilityservice完成的。目前它解析来自某个WhatsApp组的消息。但它可以适用于解析所有消息。不幸的是,通过WhatsApp发送消息更加困难。
答案 2 :(得分:5)
除非该应用的开发者故意共享服务,内容提供商,或故意发送事件的公开广播,或公开自定义广播注册系统,否则在Android中没有合法的方式来听取第三方的内部工作应用。应用程序隔离是在Android中设计的一个非常重要的原因:安全性。
答案 3 :(得分:3)
辅助功能事件仅捕获传入通知事件,而不是更新它们。目前,WhatsApp通知不会显示消息,只显示发件人。然后,WhatsApp应用程序会添加一条消息,其中包含无法通过辅助功能服务捕获的更新。
您只会收到“来自XXX的1条新消息”,但这可能足以满足您的需求。
答案 4 :(得分:2)
请参阅以下示例以捕获whatsapp通知:
public class Notifier extends AccessibilityService {
@Override
public void onCreate(){
//Toast.makeText(this,"Oncreate", Toast.LENGTH_LONG).show();
}
@Override
protected void onServiceConnected() {
// Set the type of events that this service wants to listen to. Others
// won't be passed to this service.
Toast.makeText(this,"Service connected", Toast.LENGTH_LONG).show();
AccessibilityServiceInfo info = new AccessibilityServiceInfo();
info.feedbackType = AccessibilityServiceInfo.FEEDBACK_ALL_MASK;;
info.eventTypes = AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED ;
// If you only want this service to work with specific applications, set their
// package names here. Otherwise, when the service is activated, it will listen
// to events from all applications.
info.packageNames = new String[] {"com.whatsapp"};
info.notificationTimeout = 100;
setServiceInfo(info);
}
@Override
public void onAccessibilityEvent(AccessibilityEvent event) {
if(event.getEventType() == AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED) {
Toast.makeText(this,"Notification Catched", Toast.LENGTH_LONG).show();
}
}
}
并且不要忘记从设置>辅助功能设置权限以访问系统事件。允许设置权限。
检查此链接
答案 5 :(得分:0)
在这篇分为两部分的文章的帮助下,我听了传入的WhatsApp消息通知,您可以从here中阅读它。
<!-- AndroidManifest.xml -->
<service
android:name=".MyAccessibilityService"
android:enabled="true"
android:exported="true"
android:label="My application"
android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE">
<intent-filter>
<action android:name="android.accessibilityservice.AccessibilityService" />
</intent-filter>
<meta-data
android:name="android.accessibilityservice"
android:resource="@xml/serviceconfig" />
</service>
serviceconfig.xml
的新文件。<!-- serviceconfig.xml -->
<accessibility-service
xmlns:android="http://schemas.android.com/apk/res/android"
android:accessibilityEventTypes="typeAllMask"
android:accessibilityFeedbackType="feedbackAllMask"
android:accessibilityFlags="flagDefault"
android:canRequestEnhancedWebAccessibility="true"
android:notificationTimeout="100"
android:packageNames="@null"
android:canRetrieveWindowContent="true"
android:canRequestTouchExplorationMode="true" />
MyAccessibilityService
的新AccessibilityService
类。@Override
protected void onServiceConnected() {
System.out.println("onServiceConnected");
AccessibilityServiceInfo info = new AccessibilityServiceInfo();
info.eventTypes = AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED;
info.feedbackType = AccessibilityServiceInfo.FEEDBACK_ALL_MASK;
info.notificationTimeout = 100;
info.packageNames = null;
setServiceInfo(info);
}
@Override
public void onAccessibilityEvent(AccessibilityEvent event) {
if (event.getEventType() == AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED) {
if (event.getPackageName().toString().equals("com.whatsapp")){
StringBuilder message = new StringBuilder();
if (!event.getText().isEmpty()) {
for (CharSequence subText : event.getText()) {
message.append(subText);
}
// Message from +12345678
}
}
}
}
注意:由于可访问性服务能够浏览屏幕内容并与之交互,因此用户必须在“设置”>“可访问性”中显式启用服务。 More details
发送对收到的通知check out this答案的答复。