## 通知滤盒 Filter Box 高级过滤规则指南

通知滤盒从 1.0.0 版开始新增高级过滤，可以根据通知的任意属性来进行自定义判断过滤。可以实现如「消除音乐 app 除播放控制外的所有通知」这样的较复杂功能。

高级过滤功能使用 JSON 语法。使用前请确保您知道如何书写 JSON，了解正则表达式。

### 示例

以下是实现音乐 app 保留播放控制条去广告的配置示例：

```JSON
{
  "match": "NONE",
  "node": [
    {
      "field": "android.template",
      "regex": "MediaStyle"
    },
    {
      "field": "filterbox.field.HAS_BIG_CONTENT_VIEW",
      "regex": "true"
    }
    ]
}
```

在通知滤盒中新建一条规则，勾选你常用的音乐 App，选择「高级匹配模式」，复制并粘贴上述 JSON 即可使用。

### 语法

逐行解释：
```JSON
  "match": "NONE",
```
匹配模式，目前支持 ALL、ANY、NONE 三种选项，均为大写。

分别表示一条通知如果 **匹配所有节点** / **匹配任意一个节点** / **不匹配任何节点** 就会被过滤。

```JSON
  "node": [],
```
匹配节点数组，数量不限。

```JSON
    {
      "field": "android.template",
      "regex": "MediaStyle"
    },
```
节点：每一个节点都需要 `field` 和 `regex` 两个字段。

`regex` 为正则表达式，满足该正则即被匹配。

有哪些 `field` 字段可用呢？请直接在通知滤盒时间线内点开最近的 20 条通知（为节约内存，旧通知可能会清除），选择「调试信息」即可看到所有可用的字段。

![调试信息界面](/img/screenshot_debug_zh.png)

上述字段中，`filterbox.field.XXX` 是由通知滤盒实现填充的；其余所有字段都为读取 `Notification#extras` 得到的。

为了便于处理，所有内容都被转换为字符串。

### TIPS

 - 为什么上述规则用了两个节点呢？
 
 大部分 App 开发者遵守 Android 开发规范，会使用 Android 原生的音乐通知实现，也就是 `MediaStyle`。

少部分 App 开发者绕开 Android 系统自行绘制界面，因此对它们使用 `filterbox.field.HAS_BIG_CONTENT_VIEW` （是否有自定义扩展视图）进行鉴别。

所以需要两个节点都不满足的通知，才被过滤。

- 手写 JSON 很容易出错？

是的，推荐使用各种编辑器来避免漏逗号之类的语法错误。或许你可以试试这个在线的： <http://jsoneditoronline.org/>
