web-dev-qa-db-ja.com

外部カメラのファイルシステムにアクセスするためのiOS 13画像キャプチャAPI?

AppleのiOS 13機能リストページ には、次の文言があります。

Image Capture API

Image Capture APIを使用すると、開発者はCamera Connection Kitを利用して写真をアプリに直接インポートできます。

探していましたが、この変更に関する実際のドキュメントと、APIのどこに存在するのかわかりません。また、WWDC 19の組合の基調講演/州で2、2話話しましたが、これまでのところ、どのセッションにも詳細はありません。

カメラまたはSDカードをiOSデバイスのUSB-C/Lightningポートに接続して、サードパーティのアプリからアクセスできるようです。システムフォトライブラリにインポートできることは知っていますが、それは何年も前からあります。 MiFiハードウェアのExternalAccessoryフレームワークについても知っていますが、大きな変更は見られません。また、説明されている機能が公開されていないようです。

UIDocumentPickerが表示され、ユーザーが接続されたUSBデバイス上の場所を選択できることがわかります。これは機能しますが、カメラ固有ではなく、ユーザーが有効なカメラの場所を選択しない場合、エラーが発生しやすくなります。

この変更に関する詳細情報の入手先、またはプログラムによってカメラのファイルシステムにアクセスする方法を知っている人はいますか?カメラは、標準のカメラフォルダー構造DCIMなどを備えているため、多くのMacアプリでカメラファイルシステムとして認識されます。

8
jamone

ImageCaptureCoreフレームワークを探しています。これは、SDカードおよびカメラからインポートするためにmacOSに存在するのと同じフレームワークです。 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;

次に、ICCameraDevice.contentsプロパティを使用して、すべてのコンテンツを取得します。

そこからICCameraDeviceを使用して、サムネイル、メタデータをリクエストし、特定のファイルをダウンロードできます。読者への演習として残しておきます。

上で述べたように、これはiOS/iPadOS 13.1 Beta 3では機能していないようです。自分でテストを開始したいので、すぐにすべてが機能することを願っています。

これは現在iOS 13.2で動作しています。

6
Cutterpillow