Översikt
KlugGallery sparar bilder och videor från din AIR-app i enhetens fotogalleri: en BitmapData, till exempel en ögonblicksbild, eller en foto- eller videofil som din app har spelat in eller laddat ned.
Det ber bara om det som sparandet kräver. På iPhone och iPad begär det åtkomst endast för att lägga till, så att din app aldrig ser användarens bibliotek. På Android 10 och senare kräver sparandet ingen behörighet alls; på Android 6 till 9 ber KlugGallery om lagringsåtkomst vid körning.
Filerna hamnar där användarna letar efter dem: i Bilder på iOS, och i Pictures/<app name> eller Movies/<app name> på Android.
KlugGallery används dagligen i våra appar på iOS och Android, vårt proof of concept.
Funktioner
- Fristående: ett ANE, inget kärnbibliotek eller beroende-ANE:er att lägga till
- Spara en BitmapData som PNG eller JPEG, med kvalitet och filnamn
- Kopiera en foto- eller videofil till galleriet (mp4, mov och m4v sparas som videor)
- iOS: fotoåtkomst endast för att lägga till, användarens bibliotek förblir privat
- Android 10 och senare: ingen behörighet behövs; Android 6 till 9: lagringsbehörighet vid körning
- Egen albummapp per app på Android
- Behörighetsstatus och en genväg till appinställningarna efter ett nekande
- En händelse per resultat, med felmeddelandet när något misslyckas
Plattformar som stöds
På andra plattformar returnerar isSupported false, så att samma kod kan ligga kvar i en plattformsoberoende app.
Kom igång
Lägg till tillägget i din applikationsbeskrivning (application descriptor):
<extensions>
<extensionID>com.klug.gallery</extensionID>
</extensions>
iOS: förklara i InfoAdditions varför din app sparar i Bilder:
<key>NSPhotoLibraryAddUsageDescription</key> <string>Saves your snapshots and videos to Photos.</string>
Android: behövs bara för Android 6 till 9; nyare versioner ignorerar 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>
Kodexempel
Tre kompletta flöden, hämtade från det API som körs i våra appar. Varje anrop returnerar direkt; resultatet kommer som en GalleryEvent. Fullständig 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-översikt
| Gallery.getInstance() | Returnerar den enda instansen. |
| isSupported | True på iOS och Android, false på övriga. |
| authorisationStatus() | AUTHORISED, DENIED, NOT_DETERMINED, SHOULD_EXPLAIN, RESTRICTED, LIMITED eller UNKNOWN. |
| requestAuthorisation() | Visar systemets fråga så länge användaren inte har bestämt sig. Svaret kommer som GalleryEvent.AUTHORISATION. |
| addBitmapData(bitmapData, format, quality, filename) | Sparar bilden som "png" eller "jpg". Resultat: ADD_COMPLETE eller ADD_ERROR. |
| addFile(file) | Kopierar en foto- eller videofil (File eller inbyggd sökväg) till galleriet. Resultat: ADD_FILE_COMPLETE eller ADD_FILE_ERROR. |
| canOpenDeviceSettings | True där appinställningarna kan öppnas. |
| openDeviceSettings() | Öppnar inställningssidan för din app. |
Händelser
GalleryEvent: type anger vad som hände, status bär detaljerna.
| GalleryEvent.AUTHORISATION | status = den nya behörighetsstatusen |
| GalleryEvent.ADD_COMPLETE | bilden sparades |
| GalleryEvent.ADD_ERROR | status = felmeddelandet |
| GalleryEvent.ADD_FILE_COMPLETE | filen sparades |
| GalleryEvent.ADD_FILE_ERROR | status = felmeddelandet |
Köp KlugGallery
En årslicens för en AIR-applikation, med alla uppdateringar i 12 månader. Efter betalning får du tillägget, ActionScript-biblioteket och dokumentationen via e-post, vanligtvis inom en arbetsdag. Licens och villkor
- Licens för en AIR-applikation
- Alla uppdateringar i 12 månader
- Ingen support
- Licens för en AIR-applikation
- Alla uppdateringar i 12 månader
- Svar via e-post inom 7 dagar
- Licens för en AIR-applikation
- Alla uppdateringar i 12 månader
- Svar via e-post inom 48 timmar
Krav
| AIR SDK | 51.x (HARMAN) |
| iOS | iOS 13 eller senare (åtkomst endast för att lägga till från iOS 14) |
| Android | Android 6.0 (API 23) eller senare |
| iOS-descriptor | NSPhotoLibraryAddUsageDescription i InfoAdditions |
| Android-descriptor | Behörighetsaktivitet; lagringsbehörighet för Android 6 till 9 |