web-dev-qa-db-fra.com

API de capture d'image iOS 13 pour accéder au système de fichiers de la caméra externe?

Dans page de la liste des fonctionnalités iOS 13 d'Apple ils ont le texte de présentation suivant:

API de capture d'image

L'API Image Capture permet aux développeurs de tirer parti du Kit de connexion d'appareil photo pour importer des photos directement dans leurs applications.

J'ai cherché mais je n'arrive pas à trouver de documentation réelle sur ce changement et où il existe dans l'API. Je me souviens également d'avoir entendu une seconde ou deux en parler dans le discours/état du syndicat dans la WWDC 19, mais encore une fois aucun détail dans aucune session que j'ai trouvée jusqu'à présent.

Il semble que vous puissiez brancher un appareil photo ou sa carte SD sur le port USB-C/Lightning de l'appareil iOS et pouvoir y accéder à partir d'une application tierce. Je sais que vous pouvez importer dans la photothèque du système, mais cela existe depuis des années. Je connais également le cadre ExternalAccessory pour le matériel MiFi, mais je ne vois aucun changement significatif à cela, et il ne semble pas que les fonctionnalités décrites soient exposées.

Je vois que UIDocumentPicker peut être affiché et cela permet à l'utilisateur de sélectionner un emplacement qui peut se trouver sur un périphérique USB connecté. Bien que cela puisse fonctionner, ce n'est pas spécifique à la caméra et serait assez sujet aux erreurs, si l'utilisateur ne sélectionne pas un emplacement de caméra valide.

Quelqu'un sait où je peux trouver plus d'informations sur ce changement ou comment vous pouvez accéder par programme au système de fichiers de la caméra? L'appareil photo aura la structure de dossier d'appareil photo standard DCIM et d'autres éléments, il est donc reconnu comme système de fichiers de l'appareil photo par de nombreuses applications Mac.

8
jamone

Vous recherchez le cadre ImageCaptureCore. Il s'agit du même cadre qui existe sur macOS pour l'importation à partir de cartes SD et d'appareils photo. Il est désormais disponible dans iOS 13.2.

Mise à jour:

L'API ImageCaptureCore fonctionne désormais à partir d'iOS 13.2.

Cependant, sachez que depuis iOS/iPadOS 13.1 Beta 3 (17A5837a), je n'ai pas encore réussi à le faire fonctionner (signalé à Apple FB6799036). Il est désormais répertorié avec un astérisque sur page des fonctionnalités de l'iPadOS indiquant qu'il sera "à venir plus tard cette année".

Je peux démarrer un ICDeviceBrowser, mais je vois des erreurs d'autorisations lorsqu'un périphérique est connecté et je ne reçois aucun message de délégué. Il peut donc y avoir une autorisation ou un droit nécessaire avant qu'il ne commence à fonctionner.

Malheureusement, il n'y a pas de documentation ou d'exemple de code (même pour macOS) sur le site des développeurs d'Apple. Mais le cadre existe dans le SDK iOS 13 et vous pouvez y consulter les fichiers d'en-tête.

Nous utilisons ce cadre dans notre application macOS et utiliser uniquement les en-têtes pour comprendre les choses n'est pas trop mal. Vous commenceriez par créer un ICDeviceBrowser (ICDeviceBrowser.h), en définissant son délégué, puis en lançant le navigateur:

@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

Vous devez ensuite commencer à recevoir des messages de délégué lorsqu'un appareil photo est connecté:

- (void)deviceBrowser:(ICDeviceBrowser*)browser didAddDevice:(ICDevice*)addedDevice moreComing:(BOOL)moreComing;
- (void)deviceBrowser:(ICDeviceBrowser*)browser didRemoveDevice:(ICDevice*)removedDevice moreGoing:(BOOL)moreGoing;

Lorsque vous obtenez un didAddDevice: message, vous souhaiterez alors utiliser les API ICDevice (ICDevice.h) et ICCameraDevice (ICCameraDevice.h) pour définir un délégué et démarrer une session. Une fois la session commencée, vous commencerez à recevoir des messages de délégué:

- (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
    }
}

Vous pouvez utiliser la méthode déléguée:

- (void)cameraDevice:(nonnull ICCameraDevice *)camera
         didAddItems:(nonnull NSArray<ICCameraItem *> *)items;

Pour obtenir une liste des éléments tels qu'ils sont énumérés par l'API ou attendez:

- (void)deviceDidBecomeReadyWithCompleteContentCatalog:(ICDevice*)device;

Et puis utilisez le .contents propriété sur ICCameraDevice pour obtenir tout le contenu.

De là, vous pouvez utiliser le ICCameraDevice pour demander des miniatures, des métadonnées et pour télécharger des fichiers spécifiques. Je laisse cela comme un exercice au lecteur.

Comme je l'ai mentionné ci-dessus, cela ne semble pas fonctionner dans iOS/iPadOS 13.1 Beta 3. J'espère que tout cela commencera à fonctionner dès que j'aimerais vraiment commencer à le tester moi-même.

Cela fonctionne maintenant dans iOS 13.2.

6
Cutterpillow