Обзор
KlugGallery сохраняет изображения и видео из вашего приложения AIR в фотогалерею устройства: BitmapData, например снимок, или файл фото либо видео, который ваше приложение записало или загрузило.
Расширение запрашивает только то, что нужно для сохранения. На iPhone и iPad оно запрашивает доступ только на добавление, поэтому ваше приложение никогда не видит медиатеку пользователя. На Android 10 и новее для сохранения вообще не нужны разрешения; на Android 6–9 KlugGallery запрашивает доступ к хранилищу во время выполнения.
Файлы попадают туда, где пользователи их ищут: в «Фото» на iOS и в Pictures/<app name> или Movies/<app name> на Android.
KlugGallery ежедневно используется в наших приложениях на iOS и Android, нашем доказательстве работоспособности.
Возможности
- Автономность: один ANE, без базовой библиотеки и зависимых ANE
- Сохранение BitmapData в PNG или JPEG с указанием качества и имени файла
- Копирование файла фото или видео в галерею (mp4, mov и m4v сохраняются как видео)
- iOS: доступ к фото только на добавление, медиатека пользователя остаётся закрытой
- Android 10 и новее: разрешение не требуется; Android 6–9: разрешение на хранилище во время выполнения
- Собственная папка альбома для каждого приложения на Android
- Статус разрешения и быстрый переход к настройкам приложения после отказа
- Одно событие на каждый результат, с сообщением об ошибке при сбое
Поддерживаемые платформы
На других платформах isSupported возвращает false, поэтому один и тот же код можно оставить в кроссплатформенном приложении.
Начало работы
Добавьте расширение в дескриптор вашего приложения:
<extensions>
<extensionID>com.klug.gallery</extensionID>
</extensions>
iOS: объясните в InfoAdditions, зачем ваше приложение сохраняет в «Фото»:
<key>NSPhotoLibraryAddUsageDescription</key> <string>Saves your snapshots and videos to Photos.</string>
Android: нужно только для Android 6–9; более новые версии это игнорируют.
<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>
Примеры кода
Три полных сценария из API, который работает в наших приложениях. Каждый вызов возвращается сразу; результат приходит как GalleryEvent. Полная документация →
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
| Gallery.getInstance() | Возвращает единственный экземпляр. |
| isSupported | True на iOS и Android, false на остальных. |
| authorisationStatus() | AUTHORISED, DENIED, NOT_DETERMINED, SHOULD_EXPLAIN, RESTRICTED, LIMITED или UNKNOWN. |
| requestAuthorisation() | Показывает системный запрос, если пользователь ещё не принял решение. Ответ приходит как GalleryEvent.AUTHORISATION. |
| addBitmapData(bitmapData, format, quality, filename) | Сохраняет изображение в формате "png" или "jpg". Результат: ADD_COMPLETE или ADD_ERROR. |
| addFile(file) | Копирует файл фото или видео (File или нативный путь) в галерею. Результат: ADD_FILE_COMPLETE или ADD_FILE_ERROR. |
| canOpenDeviceSettings | True, если настройки приложения можно открыть. |
| openDeviceSettings() | Открывает страницу настроек вашего приложения. |
События
GalleryEvent: type указывает, что произошло, status содержит подробности.
| GalleryEvent.AUTHORISATION | status = новый статус разрешения |
| GalleryEvent.ADD_COMPLETE | изображение сохранено |
| GalleryEvent.ADD_ERROR | status = сообщение об ошибке |
| GalleryEvent.ADD_FILE_COMPLETE | файл сохранён |
| GalleryEvent.ADD_FILE_ERROR | status = сообщение об ошибке |
Купить KlugGallery
Годовая лицензия на одно приложение AIR со всеми обновлениями в течение 12 месяцев. После оплаты вы получаете расширение, библиотеку ActionScript и документацию по e-mail, обычно в течение одного рабочего дня. Лицензия и условия
- Лицензия на одно приложение AIR
- Все обновления в течение 12 месяцев
- Без поддержки
- Лицензия на одно приложение AIR
- Все обновления в течение 12 месяцев
- Ответ по e-mail в течение 7 дней
- Лицензия на одно приложение AIR
- Все обновления в течение 12 месяцев
- Ответ по e-mail в течение 48 часов
Требования
| AIR SDK | 51.x (HARMAN) |
| iOS | iOS 13 или новее (доступ только на добавление начиная с iOS 14) |
| Android | Android 6.0 (API 23) или новее |
| Дескриптор iOS | NSPhotoLibraryAddUsageDescription в InfoAdditions |
| Дескриптор Android | Activity для разрешений; разрешение на хранилище для Android 6–9 |