用于访问外部相机文件系统的 iOS 13 Image Capture API?

Posted

技术标签:

【中文标题】用于访问外部相机文件系统的 iOS 13 Image Capture API?【英文标题】:iOS 13 Image Capture API for accessing external camera's filesystem? 【发布时间】:2019-07-09 19:10:37 【问题描述】:

在Apple's ios 13 feature list page 他们有以下简介:

图像捕捉 API

Image Capture API 允许开发者利用相机 Connection Kit 将照片直接导入他们的应用程序。

我一直在寻找,但似乎找不到任何有关此更改的实际文档,以及它在 API 中的位置。我还记得在 WWDC 19 的主题演讲/工会状态中听到过一两次关于它的讨论,但到目前为止我还没有找到任何会议的详细信息。

您似乎可以将相机或 SD 卡插入 iOS 设备上的 USB-C/Lightning 端口,并能够从第 3 方应用程序中访问它。我知道您可以导入系统照片库,但这已经存在多年了。我也知道 MiFi 硬件的 ExternalAccessory 框架,但我没有看到任何重大变化,而且似乎没有暴露所描述的功能。

我确实看到UIDocumentPicker 可以显示,它允许用户选择可能在连接的 USB 设备上的位置。虽然这可行,但它不是特定于相机的,如果用户没有选择有效的相机位置,它很容易出错。

有人知道我在哪里可以找到有关此更改的更多信息,或者您可以如何以编程方式访问相机的文件系统吗?相机将具有标准相机文件夹结构DCIM 和其他东西,因此它被许多 Mac 应用程序识别为相机文件系统。

【问题讨论】:

是的,我也很想知道如何做到这一点。从他们的快速演示中看起来,Lightroom 只是自动从相机导入照片,而用户的交互最少,所以它必须是除了 UIDocumentPicker 之外的其他东西,但我也找不到关于它的任何其他内容。 【参考方案1】:

您正在寻找 ImageCaptureCore 框架。这与 macOS 上用于从 SD 卡和相机导入的框架相同。它现在在 iOS 13.2 中可用。

更新:

ImageCaptureCore API 现在从 iOS 13.2 开始工作。

但是,请注意,从 iOS/iPadOS 13.1 Beta 3 (17A5837a) 开始,我还不能让它工作(报告给 Apple FB6799036)。它现在在iPadOS Features page 上标有星号,表示它将“今年晚些时候推出”。

我可以启动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;

然后使用ICCameraDevice 上的.contents 属性获取所有内容。

您可以从那里使用ICCameraDevice 请求缩略图、元数据以及下载特定文件。我将把它作为练习留给读者。

正如我上面提到的,这似乎不适用于 iOS/iPadOS 13.1 Beta 3。希望这一切都能尽快开始工作,因为我真的很想自己开始测试它。

现在在 iOS 13.2 中可以使用。

【讨论】:

难怪没找到。这个框架甚至没有在developer.apple.com/documentation?changes=latest_minor 中列为现有框架,更不用说关于其内容的文档了。 是的,您甚至无法在 Apple 网站上找到标题,更不用说任何文档了。即使对于 macOS,它也从未被很好地记录。 现在 iOS 13 即将上线,这还有效吗? @vtcajones 不,我刚刚使用今天发布的最新测试版(13.1 beta 3)进行了测试,但它仍然无法正常工作。此外,在iPadOS Features page 中,Image Capture API 下现在有一个星号,表示它将是“今年晚些时候推出”。我认为这意味着它将在 13.1 之后的某个时间到来。 @vtcajones,请注意,这现在可以在 iOS 13.2 中使用。干杯。

以上是关于用于访问外部相机文件系统的 iOS 13 Image Capture API?的主要内容,如果未能解决你的问题,请参考以下文章

iOS 13.6 存在锁屏 BUG,可隐藏电筒和相机

Android\iOS 相机权限 - 移动用户无响应

如何使用 react native 将 pdf 文件保存到文件系统(ios/android),可以在应用程序外部访问

iPhone手机保存的图片在哪里?iOS超清壁纸软件保存的,不是相机照的,求解详细资料!

iOS 14 相机顶部增加按钮,原来是这样「进化」来的

iOS 上的 Plupload 仅适用于新照片,不适用于相机胶卷