KMM项目中如何处理PHPickerViewController的回调并提取字节数组?
在KMM iOS端处理PHPickerViewController回调并提取视频文件字节数组
didFinishPicking参数中的List<*>本质是PHPickerResult实例的集合,你可以按照以下逻辑提取视频的字节数组:
- 类型转换与过滤:将泛型列表强转为
List<PHPickerResult>,确保只处理有效结果 - 获取数据提供者:从每个
PHPickerResult中拿到NSItemProvider,它负责提供文件的实际数据 - 验证视频类型:通过UTI(
public.movie)检查当前选中的文件是否为视频 - 异步加载并转换字节数组:调用
loadDataRepresentationForTypeIdentifier加载数据,再将NSData转为Kotlin的ByteArray
以下是完整的回调实现代码:
private val delegate = object : NSObject(), PHPickerViewControllerDelegateProtocol, UINavigationControllerDelegateProtocol { override fun picker(picker: PHPickerViewController, didFinishPicking: List<*>) { picker.dismissViewControllerAnimated(true) {} // 强转并筛选有效视频结果 val validResults = didFinishPicking.filterIsInstance<PHPickerResult>() if (validResults.isEmpty()) return val videoUTI = "public.movie" // 以第一个选中视频为例,如需处理多个可遍历validResults val targetResult = validResults.first() val itemProvider = targetResult.itemProvider // 校验是否为视频类型 if (itemProvider.hasItemConformingToTypeIdentifier(videoUTI)) { itemProvider.loadDataRepresentationForTypeIdentifier(videoUTI) { nsData, error -> error?.let { // 处理加载错误 println("视频加载失败: ${it.localizedDescription}") return@loadDataRepresentationForTypeIdentifier } nsData?.let { // 转换为Kotlin字节数组 val videoBytes = it.toByteArray() // 这里可以将字节数组传入KMM共享模块或做其他业务处理 println("成功提取视频字节数组,长度:${videoBytes.size}") } } } else { println("选中文件并非视频格式") } } }
额外说明
- 若要处理多个选中视频,直接遍历
validResults列表重复上述加载逻辑即可 NSData.toByteArray()是Kotlin/Native提供的扩展方法,可直接完成类型转换- 数据加载是异步操作,若需要更新UI,记得通过
DispatchQueue.main.async切回主队列 - 视频文件体积通常较大,处理字节数组时需注意内存占用,必要时可分段处理
内容的提问来源于stack exchange,提问作者François Legrand
相关产品推荐
相关产品推荐

