Vue d’ensemble
KlugGallery enregistre images et vidéos depuis votre application AIR dans la galerie photo de l’appareil : un BitmapData tel qu’un instantané, ou un fichier photo ou vidéo que votre application a enregistré ou téléchargé.
L’extension ne demande que ce dont l’enregistrement a besoin. Sur iPhone et iPad, elle demande un accès en ajout seul : votre application ne voit donc jamais la photothèque de l’utilisateur. Sur Android 10 et versions ultérieures, l’enregistrement ne nécessite aucune autorisation ; sur Android 6 à 9, KlugGallery demande l’accès au stockage à l’exécution.
Les fichiers arrivent là où les utilisateurs les cherchent : dans Photos sur iOS, et dans Pictures/<app name> ou Movies/<app name> sur Android.
KlugGallery est utilisé chaque jour dans nos applications sur iOS et Android, notre preuve de concept.
Fonctionnalités
- Autonome : une seule ANE, sans bibliothèque centrale ni ANE de dépendance à ajouter
- Enregistrement d’un BitmapData en PNG ou JPEG, avec qualité et nom de fichier
- Copie d’un fichier photo ou vidéo dans la galerie (mp4, mov et m4v sont enregistrés comme vidéos)
- iOS : accès aux photos en ajout seul, la photothèque de l’utilisateur reste privée
- Android 10 et versions ultérieures : aucune autorisation nécessaire ; Android 6 à 9 : autorisation de stockage à l’exécution
- Dossier d’album propre à chaque application sur Android
- État de l’autorisation et raccourci vers les réglages de l’application après un refus
- Un événement par résultat, avec le message d’erreur en cas d’échec
Plateformes prises en charge
Sur les autres plateformes, isSupported renvoie false : le même code peut donc rester dans une application multiplateforme.
Prise en main
Ajoutez l’extension au descripteur de votre application :
<extensions>
<extensionID>com.klug.gallery</extensionID>
</extensions>
iOS : expliquez dans les InfoAdditions pourquoi votre application enregistre dans Photos :
<key>NSPhotoLibraryAddUsageDescription</key> <string>Saves your snapshots and videos to Photos.</string>
Android : nécessaire uniquement pour Android 6 à 9 ; les versions plus récentes l’ignorent.
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
android:maxSdkVersion="28"/>
<application>
<activity android:name="com.klug.gallery.KlugGalleryPermissionActivity" android:exported="false"
android:theme="@android:style/Theme.Translucent.NoTitleBar"/>
</application>
Exemples de code
Trois flux complets, tirés de l’API qui tourne dans nos applications. Chaque appel retourne immédiatement ; le résultat arrive sous forme de GalleryEvent. Documentation complète →
import com.klug.gallery.Gallery; import com.klug.gallery.GalleryEvent; import flash.display.BitmapData; var gallery:Gallery = Gallery.getInstance(); gallery.addEventListener( GalleryEvent.ADD_COMPLETE, function( e:GalleryEvent ):void { showToast( "Saved to your gallery" ); // your app function }); gallery.addEventListener( GalleryEvent.ADD_ERROR, function( e:GalleryEvent ):void { trace( "could not save: " + e.status ); // the error message }); function saveSnapshot( picture:BitmapData ):void { if ( !gallery.isSupported ) return; // "png" or "jpg"; quality 0..1 counts for jpg gallery.addBitmapData( picture, "jpg", 0.9, "snapshot.jpg" ); }
import flash.filesystem.File; gallery.addEventListener( GalleryEvent.ADD_FILE_COMPLETE, function( e:GalleryEvent ):void { showToast( "Video saved" ); }); gallery.addEventListener( GalleryEvent.ADD_FILE_ERROR, function( e:GalleryEvent ):void { trace( "could not save the video: " + e.status ); }); // a File or a native path; mp4, mov and m4v are saved as videos, everything else as a photo var clip:File = File.applicationStorageDirectory.resolvePath( "clips/last.mp4" ); gallery.addFile( clip );
var pending:BitmapData; function save( picture:BitmapData ):void { var status:String = gallery.authorisationStatus(); if ( status == Gallery.AUTHORISED || status == Gallery.LIMITED ) gallery.addBitmapData( picture, "png" ); else if ( status == Gallery.DENIED || status == Gallery.RESTRICTED ) askToOpenSettings(); // your dialog, then gallery.openDeviceSettings() else { pending = picture; // not asked yet: show the system prompt gallery.requestAuthorisation(); } } gallery.addEventListener( GalleryEvent.AUTHORISATION, function( e:GalleryEvent ):void { if ( e.status == Gallery.AUTHORISED && pending != null ) gallery.addBitmapData( pending, "png" ); pending = null; });
Aperçu de l’API
| Gallery.getInstance() | Renvoie l’instance unique. |
| isSupported | Vrai sur iOS et Android, faux ailleurs. |
| authorisationStatus() | AUTHORISED, DENIED, NOT_DETERMINED, SHOULD_EXPLAIN, RESTRICTED, LIMITED ou UNKNOWN. |
| requestAuthorisation() | Affiche l’invite système si l’utilisateur n’a pas encore fait son choix. La réponse arrive sous forme de GalleryEvent.AUTHORISATION. |
| addBitmapData(bitmapData, format, quality, filename) | Enregistre l’image au format "png" ou "jpg". Résultat : ADD_COMPLETE ou ADD_ERROR. |
| addFile(file) | Copie un fichier photo ou vidéo (File ou chemin natif) dans la galerie. Résultat : ADD_FILE_COMPLETE ou ADD_FILE_ERROR. |
| canOpenDeviceSettings | Vrai lorsque les réglages de l’application peuvent être ouverts. |
| openDeviceSettings() | Ouvre la page des réglages de votre application. |
Événements
GalleryEvent : type indique ce qui s’est passé, status contient les détails.
| GalleryEvent.AUTHORISATION | status = le nouvel état de l’autorisation |
| GalleryEvent.ADD_COMPLETE | l’image a été enregistrée |
| GalleryEvent.ADD_ERROR | status = le message d’erreur |
| GalleryEvent.ADD_FILE_COMPLETE | le fichier a été enregistré |
| GalleryEvent.ADD_FILE_ERROR | status = le message d’erreur |
Acheter KlugGallery
Une licence annuelle pour une application AIR, avec toutes les mises à jour pendant 12 mois. Après le paiement, vous recevez l’extension, la bibliothèque ActionScript et la documentation par e-mail, généralement sous un jour ouvré. Licence et conditions
- Licence pour une application AIR
- Toutes les mises à jour pendant 12 mois
- Sans support
- Licence pour une application AIR
- Toutes les mises à jour pendant 12 mois
- Réponse par e-mail sous 7 jours
- Licence pour une application AIR
- Toutes les mises à jour pendant 12 mois
- Réponse par e-mail sous 48 heures
Prérequis
| SDK AIR | 51.x (HARMAN) |
| iOS | iOS 13 ou version ultérieure (accès en ajout seul à partir d’iOS 14) |
| Android | Android 6.0 (API 23) ou version ultérieure |
| Descripteur iOS | NSPhotoLibraryAddUsageDescription dans les InfoAdditions |
| Descripteur Android | Activité d’autorisation ; autorisation de stockage pour Android 6 à 9 |