You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

KMM项目中如何处理PHPickerViewController的回调并提取字节数组?

在KMM iOS端处理PHPickerViewController回调并提取视频文件字节数组

didFinishPicking参数中的List<*>本质是PHPickerResult实例的集合,你可以按照以下逻辑提取视频的字节数组:

  1. 类型转换与过滤:将泛型列表强转为List<PHPickerResult>,确保只处理有效结果
  2. 获取数据提供者:从每个PHPickerResult中拿到NSItemProvider,它负责提供文件的实际数据
  3. 验证视频类型:通过UTI(public.movie)检查当前选中的文件是否为视频
  4. 异步加载并转换字节数组:调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 15:00:10