ios - 用于访问外部相机文件系统的 iOS 13 Image Capture API?
问题描述
在Apple 的 iOS 13 功能列表页面中,它们具有以下简介:
图像捕捉 API
Image Capture API 允许开发人员利用 Camera Connection Kit 将照片直接导入他们的应用程序。
我一直在寻找,但似乎找不到有关此更改的任何实际文档,以及它在 API 中的位置。我还记得在 WWDC 19 的主题演讲/工会状态中听到过一两次关于它的讨论,但到目前为止我在任何会议上都没有任何细节。
似乎您可以将相机或其 SD 卡插入 iOS 设备上的 USB-C/Lightning 端口,并能够从第三方应用程序中访问它。我知道您可以导入系统照片库,但这已经存在多年了。我也知道ExternalAccessory
MiFi 硬件的框架,但我没有看到任何重大变化,而且它似乎没有暴露所描述的功能。
我确实看到UIDocumentPicker
可以显示它,它允许用户选择可能在连接的 USB 设备上的位置。虽然这可以工作,但它不是特定于相机的,如果用户没有选择有效的相机位置,它很容易出错。
有人知道我在哪里可以找到有关此更改的更多信息或如何以编程方式访问相机的文件系统吗?相机将具有标准的相机文件夹结构DCIM
和东西,因此它被许多 Mac 应用程序识别为相机文件系统。
解决方案
您正在寻找 ImageCaptureCore 框架。这与 macOS 上用于从 SD 卡和相机导入的框架相同。它现在在 iOS 13.2 中可用。
更新:
ImageCaptureCore API 现在从 iOS 13.2 开始工作。
但是,请注意,从 iOS/iPadOS 13.1 Beta 3 (17A5837a) 开始,我还不能让它工作(报告给 Apple FB6799036)。它现在在iPadOS 功能页面上标有星号,表示它将“今年晚些时候推出”。
我可以启动ICDeviceBrowser
,但是在连接设备并且没有收到任何委托消息时看到权限错误。因此,在它开始工作之前可能需要一些许可或权利。
不幸的是,Apple 的开发者网站上没有文档或示例代码(即使是 macOS)。但该框架确实存在于 iOS 13 SDK 中,您可以查看那里的头文件。
我们在我们的 macOS 应用程序中使用这个框架,并且只使用标题来解决问题并不算太糟糕。首先创建一个ICDeviceBrowser
(ICDeviceBrowser.h),设置其委托,然后启动浏览器:
@interface CameraManager() : NSObject <ICDeviceBrowserDelegate>
{
ICDeviceBrowser* _deviceBrowser;
}
@end
@implementation CameraManager
- (id) init
{
self = [super init];
_deviceBrowser = [[ICDeviceBrowser alloc] init];
_deviceBrowser.delegate = self;
[_deviceBrowser start];
return self;
}
...
@end
然后,您应该在连接相机设备时开始接收委托消息:
- (void)deviceBrowser:(ICDeviceBrowser*)browser didAddDevice:(ICDevice*)addedDevice moreComing:(BOOL)moreComing;
- (void)deviceBrowser:(ICDeviceBrowser*)browser didRemoveDevice:(ICDevice*)removedDevice moreGoing:(BOOL)moreGoing;
当您收到didAddDevice:
消息时,您将需要使用ICDevice
(ICDevice.h) 和ICCameraDevice
(ICCameraDevice.h) API 来设置委托并启动会话。会话开始后,您将开始接收委托消息:
- (void)deviceBrowser:(ICDeviceBrowser*)browser didAddDevice:(ICDevice*)addedDevice moreComing:(BOOL)moreComing
{
if ((addedDevice.type & ICDeviceTypeMaskCamera) == ICDeviceTypeCamera)
{
ICCameraDevice* camera = (ICCameraDevice *) addedDevice;
camera.delegate = self;
[camera requestOpenSession];
// probably want to save 'camera' to a member variable
}
}
您可以使用委托方法:
- (void)cameraDevice:(nonnull ICCameraDevice *)camera
didAddItems:(nonnull NSArray<ICCameraItem *> *)items;
要获取 API 枚举的项目列表或等待:
- (void)deviceDidBecomeReadyWithCompleteContentCatalog:(ICDevice*)device;
然后使用 上的.contents
属性ICCameraDevice
来获取所有的内容。
从那里您可以使用ICCameraDevice
请求缩略图、元数据和下载特定文件。我将把它作为练习留给读者。
正如我上面提到的,这似乎不适用于 iOS/iPadOS 13.1 Beta 3。希望这一切都能很快开始工作,因为我真的很想自己开始测试它。
这现在可以在 iOS 13.2 中使用。
推荐阅读
- git - 如何在 git 中获取子模块的当前提交 ID?
- typescript - 将自己的 vpc 添加到 ec2 实例的 Pulumi 代码
- python - 将列表合并为一个列表
- vb.net - VS2019 Toolbox 中不显示图表命令
- rust - 生命周期和异步 fn 的问题
- c# - 如何将日期和时间打包成 32 位?
- machine-learning - 连接不连续的线脊椎根
- selenium - 使用 Selenium 执行自动化脚本时网页卡在加载栏上?
- xcode - 架构(arm64)不包括“管理员”的 iPhone 可以执行的架构(armv7s、armv7、armv6、armv5e、armv5、arm)
- json - 如何使用 AWS cli 将现有策略替换为 json 文件?