← すべての拡張機能

ネイティブ拡張機能

KlugGallery

com.klug.gallery

APMは不要。ダウンロードしてすぐに使えます。これ以上シンプルにはできません。 Adobe AIR SDK を更新するだけです。サポートが必要な場合は、私たちにお任せください。

iOS と Android で、システムが提供する最小限の権限を使って、AIR アプリから写真や動画をデバイスのギャラリーに保存します。

iOS Android 本番稼働中 年額€19から · 購入

概要

KlugGallery は、AIR アプリの画像や動画をデバイスのフォトギャラリーに保存します。スナップショットなどの BitmapData や、アプリが録画またはダウンロードした写真・動画ファイルを保存できます。

保存に必要なものだけを要求します。iPhone と iPad では追加のみのアクセスを要求するため、アプリがユーザーのライブラリを見ることはありません。Android 10 以降では保存に権限はまったく不要です。Android 6〜9 では、KlugGallery が実行時にストレージへのアクセスを要求します。

ファイルはユーザーが探す場所に保存されます。iOS では写真アプリに、Android では Pictures/<app name> または Movies/<app name> に保存されます。

KlugGallery は、実証の場である当社のアプリの iOS 版と Android 版で毎日使われています。

機能

  • 自己完結型:ANE 1つで完結し、コアライブラリや依存 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 から取り出した、3つの完全なフローです。すべての呼び出しは即座に返り、結果は 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()唯一のインスタンスを返します。
isSupportediOS と Android では true、それ以外では 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.AUTHORISATIONstatus = 新しい権限状態
GalleryEvent.ADD_COMPLETE画像が保存されました
GalleryEvent.ADD_ERRORstatus = エラーメッセージ
GalleryEvent.ADD_FILE_COMPLETEファイルが保存されました
GalleryEvent.ADD_FILE_ERRORstatus = エラーメッセージ

KlugGallery を購入

AIR アプリケーション1つ分の年間ライセンスで、12か月間のすべてのアップデートが含まれます。お支払い後、拡張機能、ActionScript ライブラリ、ドキュメントをメールでお送りします(通常は1営業日以内)。ライセンスと条件

シンプル
€19 / 年
  • AIR アプリケーション1つ分のライセンス
  • 12か月間のすべてのアップデート
  • サポートなし
シンプルを購入
スタンダード
€149 / 年
  • AIR アプリケーション1つ分のライセンス
  • 12か月間のすべてのアップデート
  • 7日以内にメールで回答
スタンダードを購入
プライオリティ
€299 / 年
  • AIR アプリケーション1つ分のライセンス
  • 12か月間のすべてのアップデート
  • 48時間以内にメールで回答
プライオリティを購入
税金は Link(Stripe)によりチェックアウト時に計算されます。チェックアウト時に、AIR アプリのアプリケーションIDを入力してください。

動作要件

AIR SDK51.x(HARMAN)
iOSiOS 13 以降(追加のみのアクセスは iOS 14 以降)
AndroidAndroid 6.0(API 23)以降
iOS 記述子InfoAdditions 内の NSPhotoLibraryAddUsageDescription
Android 記述子権限用のアクティビティ。Android 6〜9 向けのストレージ権限