【问题标题】:Click on the Notification programmatically以编程方式单击通知
【发布时间】:2018-04-09 13:32:13
【问题描述】:

我在收到通知后尝试点击它。

我可以使用辅助功能服务拖动通知抽屉。

点击我正在使用的通知accessibilityEvent.getSource()accessibilityNodeInfo.performAction(AccessibilityNodeInfo.ACTION_CLICK);

我的代码:

public class MyAccessibilityService extends AccessibilityService {

/**
 * On receiving the AccessibilityEvent performs the Actions
 *
 * @param event
 */
@Override
public void onAccessibilityEvent(AccessibilityEvent event) {
    Log.i(TAG, "Get the Accessibility Event");
    if (event.getEventType() == AccessibilityEvent.TYPE_TOUCH_INTERACTION_END) {
        handleTypeTouchInteractionEndEvents(event);
    }
    if (event.getEventType() == AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED) {
        handleTypeWindowStateChangedEvents(event);
    }
}

@Override
public void onServiceConnected() {
    AccessibilityServiceInfo accessibilityServiceInfo = new AccessibilityServiceInfo();
    accessibilityServiceInfo.eventTypes = AccessibilityEvent.TYPE_TOUCH_INTERACTION_END | AccessibilityEvent.TYPE_VIEW_CLICKED |
            AccessibilityEvent.TYPE_VIEW_FOCUSED | AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED | AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED;
    accessibilityServiceInfo.feedbackType = AccessibilityServiceInfo.CAPABILITY_CAN_PERFORM_GESTURES;
    accessibilityServiceInfo.flags = AccessibilityServiceInfo.DEFAULT | AccessibilityServiceInfo.FLAG_RETRIEVE_INTERACTIVE_WINDOWS;
    accessibilityServiceInfo.notificationTimeout = NOTIFICATION_TIME_OUT;
    this.setServiceInfo(accessibilityServiceInfo);
}

@Override
public void onInterrupt() {
    //Do Nothing
}

/**
 * Performs the action for TYPE_TOUCH_INTERACTION_END events
 *
 * @param accessibilityEvent
 */
private void handleTypeTouchInteractionEndEvents(AccessibilityEvent accessibilityEvent) {
    switch (accessibilityEvent.getAction()) {
        case EXPAND_NOTIFICATIONS_DRAWER:
            Log.i(TAG, "perfroming expand notification bar");         performGlobalAction(AccessibilityService.GLOBAL_ACTION_NOTIFICATIONS);
            break;
        default:
            Log.i(TAG, "Event type not defined");
    }
}

private void handleTypeWindowStateChangedEvents(AccessibilityEvent accessibilityEvent) {
    switch (accessibilityEvent.getAction()) {
        case ACTION_CLICK:
            Log.i(TAG, "Performing click Action");
            findNotificationIconAndClick("com.my.app:id/notification_icon", accessibilityEvent);
            Log.i(TAG, "Click Action is successfull");
        default:
            Log.i(TAG, "Event type not defined");
    }
}


public void findNotificationIconAndClick(String id, AccessibilityEvent accessibilityEvent) {
    AccessibilityNodeInfo accessibilityNodeInfo = accessibilityEvent.getSource();
    List<AccessibilityNodeInfo> nodeInfoList = accessibilityNodeInfo.findAccessibilityNodeInfosByViewId(id);
    if (nodeInfoList != null && !nodeInfoList.isEmpty()) {
        for (AccessibilityNodeInfo nodeInfo : nodeInfoList) {
            if (nodeInfo != null) {
                performClick(nodeInfo);
                break;
            }
        }
    }
}
}

我是使用无障碍服务的新手。有人可以告诉我我是否有任何错误,或者是否无法使用无障碍服务点击通知?不使用无障碍服务点击通知还有其他可能吗?

【问题讨论】:

    标签: android android-notifications android-notification-bar accessibilityservice


    【解决方案1】:

    并非所有可访问性事件都会返回源。事实上,大多数(或至少发生最频繁的事件)没有。确保您在配置中限制为合理的事件子集和/或对 event.getSource() 进行空检查。

    【讨论】:

    • 有没有其他方法可以点击通知
    • 不,没有“只需选择此通知”选项。模拟点击事件是你唯一的选择。
    【解决方案2】:

    如果你想点击通知,你必须扩展NotificationListenerService,实现必须实现的然后你可以调用sbn.getNotification().contentIntent.send()。这种方式就像用户点击通知托盘中的通知一样。

    【讨论】:

      猜你喜欢
      • 2012-12-03
      • 2021-09-30
      • 1970-01-01
      • 2012-06-21
      • 1970-01-01
      • 2013-10-09
      • 2011-10-22
      • 2015-03-17
      • 1970-01-01
      相关资源
      最近更新 更多