Oversigt
KlugGallery gemmer billeder og videoer fra din AIR-app i enhedens fotogalleri: en BitmapData som f.eks. et snapshot, eller en foto- eller videofil, som din app har optaget eller downloadet.
Den beder kun om det, som lagringen kræver. På iPhone og iPad anmoder den om adgang kun til at tilføje, så din app aldrig ser brugerens bibliotek. På Android 10 og nyere kræver lagringen slet ingen tilladelse; på Android 6 til 9 anmoder KlugGallery om lageradgang under kørsel.
Filerne havner, hvor brugerne leder efter dem: i Fotos på iOS og i Pictures/<app name> eller Movies/<app name> på Android.
KlugGallery er i daglig brug i vores apps på iOS og Android, vores proof of concept.
Funktioner
- Selvstændig: én ANE, intet kernebibliotek eller afhængige ANE'er at tilføje
- Gem en BitmapData som PNG eller JPEG, med kvalitet og filnavn
- Kopiér en foto- eller videofil til galleriet (mp4, mov og m4v gemmes som videoer)
- iOS: fotoadgang kun til at tilføje, brugerens bibliotek forbliver privat
- Android 10 og nyere: ingen tilladelse nødvendig; Android 6 til 9: lagertilladelse under kørsel
- Egen albummappe pr. app på Android
- Tilladelsesstatus og en genvej til appindstillingerne efter et afslag
- Én hændelse pr. resultat, med fejlmeddelelsen, når noget mislykkes
Understøttede platforme
På andre platforme returnerer isSupported false, så den samme kode kan blive i en cross-platform-app.
Kom i gang
Tilføj udvidelsen til din applikationsdescriptor:
<extensions>
<extensionID>com.klug.gallery</extensionID>
</extensions>
iOS: forklar i InfoAdditions, hvorfor din app gemmer i Fotos:
<key>NSPhotoLibraryAddUsageDescription</key> <string>Saves your snapshots and videos to Photos.</string>
Android: kun nødvendig for Android 6 til 9; nyere versioner ignorerer den.
<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>
Kodeeksempler
Tre komplette flows, taget fra den API, der kører i vores apps. Hvert kald vender straks tilbage; resultatet ankommer som en GalleryEvent. Fuld dokumentation →
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; });
API-oversigt
| Gallery.getInstance() | Returnerer den enkelte instans. |
| isSupported | Sand på iOS og Android, falsk andre steder. |
| authorisationStatus() | AUTHORISED, DENIED, NOT_DETERMINED, SHOULD_EXPLAIN, RESTRICTED, LIMITED eller UNKNOWN. |
| requestAuthorisation() | Viser systemets prompt, så længe brugeren endnu ikke har besluttet sig. Svaret ankommer som GalleryEvent.AUTHORISATION. |
| addBitmapData(bitmapData, format, quality, filename) | Gemmer billedet som "png" eller "jpg". Resultat: ADD_COMPLETE eller ADD_ERROR. |
| addFile(file) | Kopierer en foto- eller videofil (File eller native sti) til galleriet. Resultat: ADD_FILE_COMPLETE eller ADD_FILE_ERROR. |
| canOpenDeviceSettings | Sand, hvor appindstillingerne kan åbnes. |
| openDeviceSettings() | Åbner indstillingssiden for din app. |
Events
GalleryEvent: type angiver, hvad der skete, status bærer detaljerne.
| GalleryEvent.AUTHORISATION | status = den nye tilladelsesstatus |
| GalleryEvent.ADD_COMPLETE | billedet blev gemt |
| GalleryEvent.ADD_ERROR | status = fejlmeddelelsen |
| GalleryEvent.ADD_FILE_COMPLETE | filen blev gemt |
| GalleryEvent.ADD_FILE_ERROR | status = fejlmeddelelsen |
Køb KlugGallery
En årlig licens til én AIR-applikation, med alle opdateringer i 12 måneder. Efter betaling modtager du udvidelsen, ActionScript-biblioteket og dokumentationen pr. e-mail, normalt inden for én hverdag. Licens og vilkår
- Licens til én AIR-applikation
- Alle opdateringer i 12 måneder
- Svar pr. e-mail inden for 7 dage
- Licens til én AIR-applikation
- Alle opdateringer i 12 måneder
- Svar pr. e-mail inden for 48 timer
Krav
| AIR SDK | 51.x (HARMAN) |
| iOS | iOS 13 eller nyere (adgang kun til at tilføje fra iOS 14) |
| Android | Android 6.0 (API 23) eller nyere |
| iOS-descriptor | NSPhotoLibraryAddUsageDescription i InfoAdditions |
| Android-descriptor | Tilladelses-activity; lagertilladelse til Android 6 til 9 |