← Toutes les extensions

Extension native

KlugGallery

com.klug.gallery

AUCUN APM NÉCESSAIRE. Téléchargez et profitez-en. Impossible de faire plus simple. Mettez simplement à jour l’Adobe AIR SDK. Si vous avez besoin d’aide, nous sommes là.

Enregistrez photos et vidéos depuis votre application AIR dans la galerie de l’appareil, sur iOS et Android, avec l’autorisation la plus restreinte que propose le système.

iOS Android En production À partir de €19 / an · Acheter

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

iOS iPhone · iPad · Photos, accès en ajout seul
Android téléphones · tablettes · appareils pliables · MediaStore

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 :

app.xml
<extensions>
    <extensionID>com.klug.gallery</extensionID>
</extensions>

iOS : expliquez dans les InfoAdditions pourquoi votre application enregistre dans Photos :

app.xml · iPhone InfoAdditions
<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.

app.xml · Android manifest
<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 →

1 · Enregistrer un instantané
Snapshot.as
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" );
}
2 · Sauvegarder une vidéo enregistrée
Video.as
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 );
3 · Demander l’autorisation uniquement lorsqu’elle est nécessaire
Permission.as
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.
isSupportedVrai 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.
canOpenDeviceSettingsVrai 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.AUTHORISATIONstatus = le nouvel état de l’autorisation
GalleryEvent.ADD_COMPLETEl’image a été enregistrée
GalleryEvent.ADD_ERRORstatus = le message d’erreur
GalleryEvent.ADD_FILE_COMPLETEle fichier a été enregistré
GalleryEvent.ADD_FILE_ERRORstatus = 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

Simple
€19 / an
  • Licence pour une application AIR
  • Toutes les mises à jour pendant 12 mois
  • Sans support
Acheter Simple
Standard
€149 / an
  • Licence pour une application AIR
  • Toutes les mises à jour pendant 12 mois
  • Réponse par e-mail sous 7 jours
Acheter Standard
Priority
€299 / an
  • Licence pour une application AIR
  • Toutes les mises à jour pendant 12 mois
  • Réponse par e-mail sous 48 heures
Acheter Priority
Les taxes sont calculées lors du paiement par Link (Stripe). Vous saisissez l’identifiant d’application de votre app AIR pendant le paiement.

Prérequis

SDK AIR51.x (HARMAN)
iOSiOS 13 ou version ultérieure (accès en ajout seul à partir d’iOS 14)
AndroidAndroid 6.0 (API 23) ou version ultérieure
Descripteur iOSNSPhotoLibraryAddUsageDescription dans les InfoAdditions
Descripteur AndroidActivité d’autorisation ; autorisation de stockage pour Android 6 à 9