← Все расширения

Нативное расширение

KlugGallery

com.klug.gallery

APM НЕ НУЖЕН. Скачайте и пользуйтесь. Проще уже некуда. Просто обновите Adobe AIR SDK. Если нужна помощь, мы рядом.

Сохраняйте фото и видео из вашего приложения AIR в галерею устройства на iOS и Android с минимальным разрешением, которое предлагает система.

iOS Android В продакшене От €19 / год · Купить

Обзор

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
  • Статус разрешения и быстрый переход к настройкам приложения после отказа
  • Одно событие на каждый результат, с сообщением об ошибке при сбое

Поддерживаемые платформы

iOS iPhone · iPad · «Фото», доступ только на добавление
Android телефоны · планшеты · складные устройства · MediaStore

На других платформах isSupported возвращает false, поэтому один и тот же код можно оставить в кроссплатформенном приложении.

Начало работы

Добавьте расширение в дескриптор вашего приложения:

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

iOS: объясните в InfoAdditions, зачем ваше приложение сохраняет в «Фото»:

app.xml · iPhone InfoAdditions
<key>NSPhotoLibraryAddUsageDescription</key>
<string>Saves your snapshots and videos to Photos.</string>

Android: нужно только для Android 6–9; более новые версии это игнорируют.

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>

Примеры кода

Три полных сценария из API, который работает в наших приложениях. Каждый вызов возвращается сразу; результат приходит как GalleryEvent. Полная документация →

1 · Сохранение снимка
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 · Сохранение записанного видео
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 · Запрос разрешения только при необходимости
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;
});

Обзор API

Gallery.getInstance()Возвращает единственный экземпляр.
isSupportedTrue на 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.
canOpenDeviceSettingsTrue, если настройки приложения можно открыть.
openDeviceSettings()Открывает страницу настроек вашего приложения.

События

GalleryEvent: type указывает, что произошло, status содержит подробности.

GalleryEvent.AUTHORISATIONstatus = новый статус разрешения
GalleryEvent.ADD_COMPLETEизображение сохранено
GalleryEvent.ADD_ERRORstatus = сообщение об ошибке
GalleryEvent.ADD_FILE_COMPLETEфайл сохранён
GalleryEvent.ADD_FILE_ERRORstatus = сообщение об ошибке

Купить KlugGallery

Годовая лицензия на одно приложение AIR со всеми обновлениями в течение 12 месяцев. После оплаты вы получаете расширение, библиотеку ActionScript и документацию по e-mail, обычно в течение одного рабочего дня. Лицензия и условия

Базовый
€19 / год
  • Лицензия на одно приложение AIR
  • Все обновления в течение 12 месяцев
  • Без поддержки
Купить Базовый
Стандартный
€149 / год
  • Лицензия на одно приложение AIR
  • Все обновления в течение 12 месяцев
  • Ответ по e-mail в течение 7 дней
Купить Стандартный
Приоритетный
€299 / год
  • Лицензия на одно приложение AIR
  • Все обновления в течение 12 месяцев
  • Ответ по e-mail в течение 48 часов
Купить Приоритетный
Налоги рассчитываются при оформлении заказа через Link (Stripe). ID приложения вашего приложения AIR вы указываете при оформлении заказа.

Требования

AIR SDK51.x (HARMAN)
iOSiOS 13 или новее (доступ только на добавление начиная с iOS 14)
AndroidAndroid 6.0 (API 23) или новее
Дескриптор iOSNSPhotoLibraryAddUsageDescription в InfoAdditions
Дескриптор AndroidActivity для разрешений; разрешение на хранилище для Android 6–9