这是我参与「第四届青训营 」笔记创作活动的第18天
相册权限获取
权限状态
typedef NS_ENUM(NSInteger, PHAuthorizationStatus) {
// 暂未获取权限
PHAuthorizationStatusNotDetermined = 0,
// 受限状态,没有授权访问相册,用户也无法修改状态(例如家长模式下)
PHAuthorizationStatusRestricted,
// 用户拒绝了相册授权
PHAuthorizationStatusDenied,
// 用户同意了相册授权
PHAuthorizationStatusAuthorized,
// 受限的相册访问,用户会选择部分程序可以访问的相册数据
PHAuthorizationStatusLimited API_AVAILABLE(ios(14)),
};
权限获取方式1
选择 PHAuthorizationStatusLimited 或者 PHAuthorizationStatusAuthorized 都会返回 PHAuthorizationStatusAuthorized 状态
权限获取方式2
如果希望判断用户是否选择了 PHAuthorizationStatusLimited 状态,可以使用下面的这种方法
相册的加载
UIImagePickerController
PHPickerViewController
自定义选择器
不主动请求权限
系统会返回空结果,并在另一个进程弹出权限请求弹窗。无论选择哪种权限,代码已经执行过了。需要重新进入才能获取到数据
主动请求权限
主动请求权限,可以控制一定选择过权限类型后,再加载数据
与 「不主动请求权限」 不同的是,可以在选择权限后,立刻将数据上屏
视频播放
初始化
- 通过 URL 创建
AVPlayerItem供播放器使用,可以认为AVPlayerItem就是多媒体数据的管理器 - 播放时长监听,可能是网络资源,播放时长可能后期设置
- 加载状态监听,出错时可以进行错误处理
- 播放速率监听,播放和暂停都等价于设置
rate值,由于播放可能被打断,例如有电话打过来了,系统会将播放器暂停;挂断后也不会自动恢复 - 播放进度监听,定时更新进度条
播放控制
- 点击播放暂停,调用
play/pause - 拖拽进度条
- 通过
seekToTime:toleranceBefore:toleranceAfter:来调整播放位置 - 松手时,调用
play
- 通过
音频控制
为了防止其他 App 的播放影响我们的播放,将 AVAudioSession 设置为 AVAudioSessionCategoryPlayback
| 类别 | 当按“静音”或者锁屏时是否静音 | 是否引起不支持混音的App中断 | 是否支持录音和播放 |
|---|---|---|---|
| AVAudioSessionCategoryAmbient | 是 | 否 | 只支持播放 |
| AVAudioSessionCategoryAudioProcessing | / | / | / |
| AVAudioSessionCategoryMultiRoute | 否 | 是 | 既可以录音也可以播放 |
| AVAudioSessionCategoryPlayAndRecord | 否 | 默认不引起 | 既可以录音也可以播放 |
| AVAudioSessionCategoryPlayback | 否 | 默认引起 | 只用于播放 |
| AVAudioSessionCategoryRecord | 否 | 是 | 只用于录音 |
| AVAudioSessionCategorySoloAmbient | 否 | 是 | 只用于播放 |
画中画模式
- 需要判断设备是否支持
- 监听
pictureInPicturePossible是否更新状态,更新后可尝试触发画中画效果 - 监听应用进入活跃状态(从主屏幕返回时,停止画中画模式)
远端视频播放
网络视频的播放和本地视频的播放并没有太大区别,直接使用本地视频的播放逻辑,有 URL 就能实现播放