概要
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 ではアプリごとに専用のアルバムフォルダー
- 権限状態と、拒否された後のアプリ設定へのショートカット
- 結果ごとにひとつのイベント。失敗時にはエラーメッセージ付き
対応プラットフォーム
他のプラットフォームでは 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 から取り出した、3つの完全なフローです。すべての呼び出しは即座に返り、結果は 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 | iOS と 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.AUTHORISATION | status = 新しい権限状態 |
| GalleryEvent.ADD_COMPLETE | 画像が保存されました |
| GalleryEvent.ADD_ERROR | status = エラーメッセージ |
| GalleryEvent.ADD_FILE_COMPLETE | ファイルが保存されました |
| GalleryEvent.ADD_FILE_ERROR | status = エラーメッセージ |
KlugGallery を購入
AIR アプリケーション1つ分の年間ライセンスで、12か月間のすべてのアップデートが含まれます。お支払い後、拡張機能、ActionScript ライブラリ、ドキュメントをメールでお送りします(通常は1営業日以内)。ライセンスと条件
動作要件
| AIR SDK | 51.x(HARMAN) |
| iOS | iOS 13 以降(追加のみのアクセスは iOS 14 以降) |
| Android | Android 6.0(API 23)以降 |
| iOS 記述子 | InfoAdditions 内の NSPhotoLibraryAddUsageDescription |
| Android 記述子 | 権限用のアクティビティ。Android 6〜9 向けのストレージ権限 |