gpt4 book ai didi

ios - 使用 UIActivityViewController 共享存储在相机胶卷中的 PHAsset

转载 作者:行者123 更新时间:2023-11-29 05:57:07 24 4
gpt4 key购买 nike

我使用 PhotoKit 将图像和视频存储在相机胶卷相册中,并希望允许用户使用 UIActivityViewController 共享它们。如果我向 UIActivityViewController 传递一个 UIImage 实例,它会按预期工作,可能是因为图像数据是在内存中传递的。但是,视频需要通过 URL 传递,因为没有与 UIImage 类似的视频。当我将 URL 传递给视频时,出现错误“无法创建沙箱扩展”。如果我将 URL 传递给图像,我会收到类似的错误。

基于 this ,似乎我可以通过将 Assets 导出到 Documents 目录并将 UIActivityViewController 将 URL 传递给 Documents 中的 Assets 来解决此错误。然而,我在其他地方读到过,相机胶卷可以起到类似的作用,因此相机胶卷将是少数几个可以保存应用程序之间共享数据的地方之一。

有没有办法将 UIActivityViewController URL 传递到相机胶卷 Assets ,而不将它们复制到文档?有没有更好的方法来共享相机胶卷中已有的图像和视频?

<小时/>

实现细节:

我正在使用以下方法生成 Assets 的 URL:

    func videoFor(asset: PHAsset, resultHander: @escaping (AVAsset?, AVAudioMix?, [AnyHashable : Any]?) -> Void) {
imageManager.requestAVAsset(forVideo: asset, options: nil, resultHandler: resultHander)
}

func urlFor(asset: PHAsset, resultHandler: @escaping (URL?) -> Void) {
if ( asset.mediaType == .video ) {
videoFor(asset: asset) { (asset, audioMix, info) in
let asset = asset as! AVURLAsset
resultHandler(asset.url)
}
}

else if ( asset.mediaType == .image ) {
let options: PHContentEditingInputRequestOptions = PHContentEditingInputRequestOptions()
options.canHandleAdjustmentData = {(adjustmeta: PHAdjustmentData) -> Bool in
return true
}
asset.requestContentEditingInput(with: options, completionHandler: {(contentEditingInput: PHContentEditingInput?, info: [AnyHashable : Any]) -> Void in
resultHandler(contentEditingInput!.fullSizeImageURL as URL?)
})
}

else {
resultHandler(nil)
}
}

以下是我尝试通过 URL 共享图像时在控制台中遇到的完整错误:

Failed to determine whether URL /var/mobile/Media/DCIM/100APPLE/IMG_0201.JPG (n) is managed by a file provider
Could not create sandbox extension. Error: Error Domain=NSPOSIXErrorDomain Code=1 "Operation not permitted" UserInfo={NSLocalizedDescription=Could not create sandbox extension of type com.apple.app-sandbox.read for URL /var/mobile/Media/DCIM/100APPLE/IMG_0201.JPG. Error: No such file or directory}

...以及视频:

Failed to determine whether URL /var/mobile/Media/DCIM/100APPLE/IMG_0202.M4V (n) is managed by a file provider
Could not create sandbox extension. Error: Error Domain=NSPOSIXErrorDomain Code=1 "Operation not permitted" UserInfo={NSLocalizedDescription=Could not create sandbox extension of type com.apple.app-sandbox.read for URL /var/mobile/Media/DCIM/100APPLE/IMG_0202.M4V. Error: Operation not permitted}

最佳答案

今天我也遇到了同样的问题。这是我的解决方案。希望这可以帮助或引导您走上正确的道路。

PHImageManager.default().requestExportSession(forVideo: video, options: nil, exportPreset: AVAssetExportPresetPassthrough) { (exportSession, nil) in
if let exportSession = exportSession {
exportSession.outputURL = destinationURLForFile
exportSession.outputFileType = AVFileType.m4v
exportSession.exportAsynchronously() {
// Load the share sheet using destinationURLForFile
}
}
}

此操作的作用是将视频导出到提供的位置destinationURLForFile(我使用了文档目录。如果文件已存在,请确保删除该文件,否则导出可能无法工作,因为它可能无法覆盖文件)。您可以根据可用类型设置类型。我需要 m4v。然后,导出异步并调用共享表或您拥有的任何共享机制。

关于ios - 使用 UIActivityViewController 共享存储在相机胶卷中的 PHAsset,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55049969/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com