知乎 Matisse 全功能解析:Android 媒体选择器的集成与定制指南

# 知乎 Matisse 全功能解析:Android 媒体选择器的集成与定制指南


在 Android 应用开发中,图片与视频选择功能是社交、电商、内容编辑等各类应用的常见需求。虽然系统原生 API 能够实现基本的选择功能,但在界面统一性、设备兼容性以及功能扩展性方面往往存在局限 。知乎团队开源的 Matisse,凭借其简洁的设计与强大的可定制能力,为开发者提供了一套成熟的媒体选择解决方案 。


## 一、Matisse 的核心优势


Matisse 是一款专为 Android 设计的本地图像和视频选择库,其设计理念是提供“模块化的媒体选择解决方案” 。它能够在 Activity 或 Fragment 中轻松调用,支持包括 JPEG、PNG、GIF 在内的图片格式以及 MPEG、MP4 等视频格式 。


该库的显著优点在于其**高度的可拓展性** 。它不仅内置了两套精美的主题(亮色的知乎风格与暗色的 Dracula 风格),还允许开发者进行完全自定义 。此外,Matisse 支持通过过滤器自定义文件的筛选规则,并能灵活适配 Glide、Picasso 等不同的图片加载引擎 。


## 二、快速集成与基础使用


集成 Matisse 的过程遵循清晰的步骤。首先,在项目级 build.gradle 文件中添加仓库配置,并在模块级依赖中加入 Matisse 及其配套的图片加载库 :


```gradle

repositories {

    jcenter()

}

<"t7.j9k5.org.cn"><"wang.j9k5.org.cn"><"zi.j9k5.org.cn">

dependencies {

    implementation 'com.zhihu.android:matisse:0.5.3-beta3'

    implementation 'com.github.bumptech.glide:glide:4.11.0'

}

```


配置好依赖后,需要在 `AndroidManifest.xml` 中声明必要的存储权限。对于 Android 6.0 及以上版本,还需在代码中动态申请 `READ_EXTERNAL_STORAGE` 权限 。


启动 Matisse 选择器的代码采用了**建造者模式**,允许开发者通过链式调用的方式灵活配置参数 :


```java

Matisse.from(MainActivity.this)

        .choose(MimeType.ofImage()) // 选择图片类型,也可选视频或混合类型

        .countable(true) // 显示有序选择数字

        .maxSelectable(9) // 最大选择数量

        .gridExpectedSize(getResources().getDimensionPixelSize(R.dimen.grid_expected_size)) // 网格大小

        .restrictOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT) // 限制屏幕方向

        .thumbnailScale(0.85f) // 缩略图缩放比例

        .imageEngine(new GlideEngine()) // 指定图片加载引擎

        .forResult(REQUEST_CODE_CHOOSE); // 启动,并传入请求码

```


当用户完成选择后,开发者在 `onActivityResult` 中通过 Matisse 提供的工具方法即可轻松获取结果 :


```java

@Override

protected void onActivityResult(int requestCode, int resultCode, Intent data) {

    super.onActivityResult(requestCode, resultCode, data);

    if (requestCode == REQUEST_CODE_CHOOSE && resultCode == RESULT_OK) {

        List selectedUris = Matisse.obtainResult(data);

        List selectedPaths = Matisse.obtainPathResult(data);

        // 处理选择的媒体文件

    }

}

```


## 三、深入功能与个性化配置


### 1. 主题与 UI 定制


Matisse 提供了灵活的 UI 定制能力。除了直接使用内置的 `R.style.Matisse_Zhihu` 和 `R.style.Matisse_Dracula` 主题外,开发者还可以通过继承这些主题并修改 `attrs.xml` 中定义的属性来打造独特的视觉风格,例如调整 `colorPrimary`、`toolbar` 样式或底部按钮的文本颜色 。


### 2. 拍照功能集成


Matisse 允许在选择界面中直接集成拍照功能。使用时需要配置 `FileProvider` 以确保在 Android 7.0 及以上版本中文件的访问权限 。通过 `capture(true)` 和 `captureStrategy()` 方法指定存储策略和 Authority,即可在相册顶部显示拍照入口 。


### 3. 自定义过滤规则


对于有特殊要求的业务场景,Matisse 的**过滤器(Filter)** 提供了强大的筛选能力 。开发者可以通过继承 `Filter` 类并实现 `filter()` 方法,来限制图片的分辨率、文件大小,或禁止选择特定类型的文件(如过大的 GIF):


```java

public class GifSizeFilter extends Filter {

    // ... 构造函数与参数


    @Override

    public Set constraintTypes() {

        return MimeType.of(MimeType.GIF); // 指定此过滤器作用于 GIF

    }


    @Override

    public IncapableCause filter(Context context, Item item) {

        // 此处编写具体的过滤逻辑,若不符合条件则返回 IncapableCause

        if (item.size > mMaxSize) {

            return new IncapableCause("GIF 文件过大");

        }

        return null; // 符合条件

    }<"xixi.j9k5.org.cn"><"uou.j9k5.org.cn"><"yty.j9k5.org.cn">

}

```

在启动 Matisse 时通过 `addFilter()` 添加自定义过滤器实例即可生效 。


### 4. 原图选择模式


对于需要高质量图片的应用,Matisse 支持“原图”选项。启用 `originalEnable(true)` 后,选择器底部会显示一个复选框,用户可决定是否返回原始分辨率的图片。开发者还可以通过 `maxOriginalSize()` 限制可选原图的最大尺寸 。


## 四、源码架构与模块化设计


Matisse 的成功不仅在于其功能,更在于其**清晰的模块化架构** 。其核心类分工明确:


- **`Matisse`**:库的入口,负责接收外部传入的 Activity/Fragment 引用(以弱引用方式保存,防止内存泄漏),并返回 `SelectionCreator` 用于参数配置 。

- **`SelectionCreator` 与 `SelectionSpec`**:`SelectionCreator` 作为建造者,收集用户设置的各种参数,并最终存储于单例的 `SelectionSpec` 中,供 `MatisseActivity` 读取 。

- **Loader 机制**:`AlbumLoader` 和 `AlbumMediaLoader` 基于 Android 的 Loader 机制高效地异步加载媒体数据,确保了界面的流畅性 。

- **`MatisseActivity`**:核心界面,展示相册与媒体列表,通过 `AlbumCollection` 等类与 Loader 交互,实现数据的加载与展示 。


这种设计使得各模块间低耦合、高内聚,不仅易于维护,也为开发者按需引入功能或进行二次开发提供了便利 。


## 五、总结


Matisse 作为一款经过大规模生产环境验证的媒体选择器,凭借其易用的 API、丰富的可定制功能以及稳健的模块化架构,已成为 Android 开发者处理图片与视频选择任务的重要工具 。从基础的快速集成到高级的过滤与主题定制,Matisse 为构建统一、流畅且符合应用风格的媒体选择体验提供了坚实的保障 。


请使用浏览器的分享功能分享到微信等