Oversikt
KlugGallery lagrer bilder og videoer fra AIR-appen din i enhetens bildegalleri: en BitmapData, for eksempel et øyeblikksbilde, eller en bilde- eller videofil som appen din har tatt opp eller lastet ned.
Den ber bare om det lagringen krever. På iPhone og iPad ber den om tilgang kun for å legge til, slik at appen din aldri ser brukerens bibliotek. På Android 10 og nyere krever lagringen ingen tillatelse i det hele tatt; på Android 6 til 9 ber KlugGallery om lagringstilgang under kjøring.
Filene havner der brukerne ser etter dem: i Bilder på iOS, og i Pictures/<app name> eller Movies/<app name> på Android.
KlugGallery brukes daglig i appene våre på iOS og Android, vårt proof of concept.
Funksjoner
- Selvstendig: én ANE, ingen kjernebibliotek eller avhengige ANE-er å legge til
- Lagre en BitmapData som PNG eller JPEG, med kvalitet og filnavn
- Kopier en bilde- eller videofil til galleriet (mp4, mov og m4v lagres som videoer)
- iOS: bildetilgang kun for å legge til, brukerens bibliotek forblir privat
- Android 10 og nyere: ingen tillatelse nødvendig; Android 6 til 9: lagringstillatelse under kjøring
- Egen albummappe per app på Android
- Tillatelsesstatus og en snarvei til appinnstillingene etter et avslag
- Én hendelse per resultat, med feilmeldingen når noe mislykkes
Støttede plattformer
På andre plattformer returnerer isSupported false, slik at den samme koden kan bli værende i en plattformuavhengig app.
Kom i gang
Legg utvidelsen til i applikasjonsbeskrivelsen din:
<extensions>
<extensionID>com.klug.gallery</extensionID>
</extensions>
iOS: forklar i InfoAdditions hvorfor appen din lagrer i Bilder:
<key>NSPhotoLibraryAddUsageDescription</key> <string>Saves your snapshots and videos to Photos.</string>
Android: bare nødvendig for Android 6 til 9; nyere versjoner 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 flyter, hentet fra API-et som kjører i appene våre. Hvert kall returnerer med en gang; resultatet kommer som en GalleryEvent. Full dokumentasjon →
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-oversikt
| Gallery.getInstance() | Returnerer den ene instansen. |
| isSupported | True på iOS og Android, false andre steder. |
| authorisationStatus() | AUTHORISED, DENIED, NOT_DETERMINED, SHOULD_EXPLAIN, RESTRICTED, LIMITED eller UNKNOWN. |
| requestAuthorisation() | Viser systemforespørselen så lenge brukeren ikke har bestemt seg ennå. Svaret kommer som GalleryEvent.AUTHORISATION. |
| addBitmapData(bitmapData, format, quality, filename) | Lagrer bildet som "png" eller "jpg". Resultat: ADD_COMPLETE eller ADD_ERROR. |
| addFile(file) | Kopierer en bilde- eller videofil (File eller native sti) til galleriet. Resultat: ADD_FILE_COMPLETE eller ADD_FILE_ERROR. |
| canOpenDeviceSettings | True der appinnstillingene kan åpnes. |
| openDeviceSettings() | Åpner innstillingssiden for appen din. |
Hendelser
GalleryEvent: type angir hva som skjedde, status bærer detaljene.
| GalleryEvent.AUTHORISATION | status = den nye tillatelsesstatusen |
| GalleryEvent.ADD_COMPLETE | bildet ble lagret |
| GalleryEvent.ADD_ERROR | status = feilmeldingen |
| GalleryEvent.ADD_FILE_COMPLETE | filen ble lagret |
| GalleryEvent.ADD_FILE_ERROR | status = feilmeldingen |
Kjøp KlugGallery
En årslisens for én AIR-applikasjon, med alle oppdateringer i 12 måneder. Etter betaling mottar du utvidelsen, ActionScript-biblioteket og dokumentasjonen på e-post, vanligvis innen én virkedag. Lisens og vilkår
- Lisens for én AIR-applikasjon
- Alle oppdateringer i 12 måneder
- Ingen støtte
- Lisens for én AIR-applikasjon
- Alle oppdateringer i 12 måneder
- Svar på e-post innen 7 dager
- Lisens for én AIR-applikasjon
- Alle oppdateringer i 12 måneder
- Svar på e-post innen 48 timer
Krav
| AIR SDK | 51.x (HARMAN) |
| iOS | iOS 13 eller nyere (tilgang kun for å legge til fra iOS 14) |
| Android | Android 6.0 (API 23) eller nyere |
| iOS-descriptor | NSPhotoLibraryAddUsageDescription i InfoAdditions |
| Android-descriptor | Tillatelsesaktivitet; lagringstillatelse for Android 6 til 9 |