顯示具有 AIR 標籤的文章。 顯示所有文章
顯示具有 AIR 標籤的文章。 顯示所有文章

2013-07-17

AIR 3.8 for iOS 載入外部 SWF

依據官方說明文件 Loader.load() 「在 iOS 上,您無法載入包含任何 ActionScript ByteCode (ABC) 的 SWF 檔案」,但這是舊版的說明。

AIR 3.6 for iOS 較早版本可以載入 SWC,3.7... 3.8... 為了求真相,以下直接用 AIR 3.8.0.820 for iOS, iPhone 實機,MC Graphics API 做測試。

1) 把 SWF 一同打包到 ipa 裡時 (相同 Application domain),使用文件上的
var loaderContext:LoaderContext = new LoaderContext(false, ApplicationDomain.currentDomain, null);
loader.load( new URLRequest('app:/easy_draw.swf'), loaderContext );
SWF 裡的 AS 可以正常執行 (所有東西不用再包成一包 SWF 了, 泣...)

2) 載入 Application domain 以外的 SWF (放在網路上測試),動畫可以正常播放,裡面的 AS 不會 (不能) 執行。

3) 雖然 Application domain 以外的 SWF 裡不能執行 AS,有趣的是載入後 loader.content 是個 MovieClip,而且 MC 的所有屬性都可以用,可以使用 addEventListener() 去偵聽,也可以使用 mc.addFrameScript() 設定 frame actions。而且有命名的子物件,也可以控制。


AIR 到 3.8 (目前還是 beta) 已經可以載入外部的 SWF 並執行,只是因為安全性的問題,依然不讓非 Application domain 的 SWF 執行 AS。希望之後可以開放這個限制,而採用和 AIR for Android 的安全機制,讓我們拭目以待。

Adobe Gaming SDK 1.1 的 SocialUI ANE 有臭蟲

Adobe Gaming SDK 1.1 的 Social.ane 有臭蟲, 根本不能用, 官方論壇也有人問到這個問題, Adobe 終於有人跳出來給了個正常的 ANE.

論壇討論: SocialUI.isSupported always returns false

可正常執行的 Social.ane

SocialUI 提供三種社群的貼文工具: Facebook, Twitter, Weibo。為什麼是這三種? 主要應該是和 iOS 有合作的就這三種,你可以在 iOS 的設定看到她們是一組的。

SocialUI 的功能並不是直接貼文,而是透過 OS 去叫喚社群的 App 來貼文。所以用戶必須安裝那三種社群 Apps,沒裝的話會提醒安裝。Facebook 的貼文也不用建立 FB App 就可以運作,當然這種貼文訊息也就沒有標註 FB App(及其連結)。

2013-06-23

NetworkInfo 在 iOS 上並不支援

測試一個想法, 試了幾次, 發現在 NetworkInfo.networkInfo.findInterfaces() 時當掉, 才找到這篇 Getting iPad or Android device MAC address doesn't work。 NetworkInfo.isSupported 在 iOS 上得到 false, 殘念, 得不到 IP 位址。

2013-06-07

遠端除錯 FarLog 修正

FarLog 修正,主要是讓訊息可以依照時間排序。舊文章: AIR for iOS 實機測試時的遠端除錯 FarLog
PHP 簡單三個檔: index.php (顯示), log.php (接收) 和 clear.php (清除)。log.php 接收資料記錄到文字檔裡,由 index.php 顯示文字檔內容。
log.php
<?php
if(isset($_REQUEST['log'])) {
  $fp = fopen('log.txt', 'a+');
  fwrite($fp, $_REQUEST['log'] . "\n");
  fclose($fp);
}

index.php
<?php
$filename = 'log.txt';
$fp = @fopen($filename, 'r'); // Open the file

if ($fp) {
  // Add each line to an array
  $array = explode("\n", fread($fp, filesize($filename)));
  // assoc array
  foreach($array as $v) {
    $ar = explode(' : ', $v );
    $assoc_ar[$ar[0]] = $ar[1];
  }

  echo '<meta charset="UTF-8"><pre>';
  ksort($assoc_ar, SORT_NUMERIC); // sort
  foreach($assoc_ar as $k=>$v) {
    echo $k . ' -> ' . $v . "\n";
  }
  echo '</pre>';     
}

clear.php
<?php
unlink('log.txt');

AS 的部份使用 lin.shinder.utils.FarLog 類別的 log() 靜態方法,沒有變更動。

2013-05-31

Starling 官方多解析度螢幕的開發指引

" Starling 官方多解析度螢幕的開發指引 ", 這篇對於 Starling 寫的 App 同時符合多種解析度裝置, 有詳細的說明。

簡單來說就是利用 viewPort 的尺寸和 starling.stage.stageWidth, starling.stage.stageHeight 大小來調整內容的縮放比 ( starling.contentScaleFactor )。

例如:
   if (CheckingOS.osIsIOS) {
    Starling.multitouchEnabled = true;
    sy = Capabilities.screenResolutionX; // Landscape
    sx = Capabilities.screenResolutionY; // Landscape
   } else {
    sx = this.stage.stageWidth;
    sy = this.stage.stageHeight;
   }

   Starling.handleLostContext = true;

   switch(sx) {
    case 480: // iPhone 3GS: 320 * 480
     use_iPad_strategy = false;
     viewPort = new Rectangle(0, 0, 480, 320);
     _starling = new Starling(Main, stage, viewPort);
     sx = _starling.stage.stageWidth  = 960;
     sy = _starling.stage.stageHeight = 640;
     break;

    case 960: // iPhone 4S: 640 * 960
    case 1136: // iPhone 5: 640 * 1136
     use_iPad_strategy = false;
     viewPort = new Rectangle(0, 0, sx, sy);
     _starling = new Starling(Main, stage, viewPort);
     _starling.stage.stageWidth  = sx;
     _starling.stage.stageHeight = sy;
     break;

    case 1024: // iPad 2: 768 * 1024
     use_iPad_strategy = true;
     viewPort = new Rectangle(0, 0, sx, sy);
     _starling = new Starling(Main, stage, viewPort);
     _starling.stage.stageWidth  = sx;
     _starling.stage.stageHeight = sy;
     break;

    case 2048: // iPad 3: 1536 * 2048
     use_iPad_strategy = true;
     viewPort = new Rectangle(0, 0, sx, sy);
     _starling = new Starling(Main, stage, viewPort);
     sx = _starling.stage.stageWidth  = 1024;
     sy = _starling.stage.stageHeight = 768;
     break;
   }
上面的程式, iPhone 3GS 的 contentScaleFactor 為 0.5, 縮小為原來一半。iPhone 4、4S、5 和 iPad2 的 contentScaleFactor 為 1。New iPad 的 contentScaleFactor 為 2, 放大一倍。

2013-05-27

AIR for iOS 實機測試時的遠端除錯 FarLog

# 2013-06-07 修正:遠端除錯 FarLog 修正

Flash 的 debugging mode 不好用,試了好幾次都沒成功。索性用 Mamp ( Apache, PHP ) 寫了個遠端除錯功能,適合在區域網路內使用。

PHP 簡單三個檔: index.php (顯示), log.php (接收) 和 clear.php (清除)。log.php 接收資料記錄到文字檔裡,由 index.php 顯示文字檔內容。

AIR for iOS 啟始畫面

Default-568h@2x.png 不適合用來當 AIR for iOS 的啟始畫面,因為一閃即逝。

如果是用 Flash CS6 開發的話 (不是用 Flex),可以在主要的 .fla 第一影格放入一個 MovieClip 物件,待 Starling 某些類別載入啟動後再將該 MovieClip 物件除移。

以 Flash/AIR/Starling 測試開發 iOS App for iPhone5 的怪現象

※ 2013-05-31 請看 Starling 官方多解析度螢幕的開發指引, 此篇可以略過了 !!!

或許不是怪現象,可能是最近太少寫 Flash/AS3...

為了在 iPhone 5 可以 640*1136 顯示,放了張啟動用圖 Default-568h@2x.png ( 參考 Deploying AIR Apps on iPhone 5 )。AIR SDK 3.7 和 3.8 beta 情況相同。

AIR for iOS settings,設定:

Aspect Ratio: Landscape (橫向)
  勾選 Full screen
  勾選 Auto orientation
Resolution: High

stage (場景) 設定不同時就有怪怪的情況:

stage: 1136*640, FPS:60 -> 一開始執行就卡住
stage: 1136*640, FPS:30 -> 開始幾個畫面位置大跑位,後面的畫面卻正常
stage: 568*320, FPS:30 -> 正常


明明就已經 Full screen 了啊, 花熱發... Orz

2013-05-27 更新 ------------------------------------
應該在判斷是 iOS 後, 使用 Capabilities.screenResolutionX 和 screenResolutionY。

在 document class 放 stage 的 resize 偵聽器發現 ( resolution 設為 high ),一開始 stage 的大小會被調整為原來 stage 大小的兩倍,之後 ( 約 1~ 2 sec ) 會被調整成 screen 大小。這就可以解釋之前的現象了。

2012-09-02

測試 AIR 的 LoaderInfo.parentSandboxBridge 用法

最近遇到一個狀況, AIR App 要載入放在 applicationDirectory 以外的 swf 檔。某些 swf 運作正常, 但少部份無法正常執行。後來在官網找到了解決方式: AIR security / Scripting between content in different domains。

2012-08-26

Adobe AIR 快速儲存 JPEG 或 PNG 圖檔


Flash 以往將點陣圖資料轉換為 JPEG 或 PNG 格式都是透過 as3corlib 裡的 API, 當點陣圖資料較大時, 轉換的速度明顯變慢。好消息是現在可以使用原生的轉換功能, 速度快許多。

請先參考 Flash CS6 新增 AIR SDK , 將 AIR SDK 新增 3.3 以上。

Flash Player 11.3, AIR 3.3 之後的版本, 在 BitmapData 類別新增了 encode() 方法。分別搭配 JPEGEncoderOptions, JPEGXREncoderOptions, PNGEncoderOptions 設定就可以快速將陣圖資料轉存為 JPEG 或 PNG 檔。

2012-08-23

Adobe AIR 的 SQLite 之 DATETIME 類型

一般 SQLite 的工具 (例如: Firefox plugin - SQLite Manager) 對其 DATETIME 資料類型, 裡面還是使用 TEXT 的方式處理, 以字串表示。

AIR 的 SQLite 引擎則是使用浮點數的表示方式, 貼心的地方是在讀取時會是 Date 物件。但是, 若以 AIR 去讀 DATETIME 類型 "2012-08-23 18:18:18" 這樣的文字格式, 將會無法顯示正確的日期; 若 SQLite Manager 去讀取 AIR 寫入的 DATETIME 類型 將會顯示浮點數。相互之間無法讀取。

解決的方式:

  1. 不使用 SQLite Manager, 使用 Lita 之類 AIR 寫成的工具。
  2. 若和其它程式語言合作開發時, 第一種方式就不方便了。可以將日期欄位設定為 TEXT 而不要使用 DATETIME, 如此一來以字串來處理就可以了。

2012-07-19

Publishing APK for Android with ANE included by using Flash CS6

Select Menu: "File > Publish Settings > ActionScript Settings"
Select Tab: "Library path"
Click icon button: "Add New Path"
Click icon button: "Browse to a Native Extension (ANE) file"

After browsing and selecting an ANE file, the file will be added in included files ( Checking "General" tab in "AIR for Android Settings"  ).

Publishing APK by using "AIR for Android Settings" panel, the ANE will be added in the APK file.

2012-07-18

AIR native extension for android (Java)

官方的教學文件裡有一篇 Developing native extensions for Adobe AIR, 裡面的教學算很詳盡, 但有些細節不太正確, 以下是個人初次試做的心得。

官方建議在 Flash Builder 4.6 上安裝 Android Developer Tools 並直接在上面開 3 個 projects: Android Application Project, Flex Library Project 和 Flex Mobile Project。
在 Flash Builder 開 Android Application Project 遇到的狀況:
1. 以系統管理員身分執行 Flash Builder 才能安裝 plug-in。
2. 只能安裝 Android Developer Tools, 無法安裝 Android NDK plugins (問題不明)。
3. 撰寫時要切換到 Java perspective (個人在 Flash Builder 上開 Android Application Project 有莫名的排斥 XD )。

個人是在 Eclipse 上做 Android Application Project 開發:
1. 建立專案時選 Android Application Project。
2. 取消勾選 "Create custom launcher icon", 勾選 "Make this project as a library"。
3. 選 BlankActivity ( Create Activity 應該可以取消)。
4. 將 FlashRuntimeExtensions.jar 加到 libraries 裡 ( 此 jar 位於 AIR SDK 的目錄裡, 如 C:\air_sdk_33\lib\android ) 。
5. 依劇規則撰寫類別檔之後, 我們要的 jar 檔會在 /bin 目錄裡自動生成。

Flex Library Project:
1. 在 Flash Builder 上建立 Flex Library Project。
2. 依規則撰寫類別檔之後, 我們要的 swc 檔會在 /bin 裡。
3. 如官方教學, 在專案的 /src 裡新增一個 extension.xml。例如:
<extension xmlns="http://ns.adobe.com/air/extension/3.1">
  <id>com.riarock.string</id>
  <versionNumber>1</versionNumber>
    <platforms>
      <platform name="Android-ARM">
        <applicationDeployment> 
          <nativeLibrary>shinderstringnative.jar</nativeLibrary>
          <initializer>com.riarock.shinderstringnative.extensions.ShinderStringExtension</initializer> 
      </applicationDeployment> 
    </platform>
  </platforms>
</extension>

打包成 .ane :
1. 將 Android Application Project 裡生成的 jar 檔, 放到專案的 /bin/native 目錄內。
2. 將 Flex Library Project 裡生成的 swc 檔解壓縮 (swc 其實也是 zip 格式), 將 library.swf 放到上一步的 /bin/native 目錄內 (避免打包時, 找不到 library.swf 的錯誤, 理論上打包時應該要自動解壓縮並放到 ane 檔裡才是)。
3. 如官方教學, 在 Flex Library Project 專案的 /src 內新增一個批次檔 package.bat (windows):
set adt_directory=C:\air_sdk_33\bin
set library_directory=C:\Users\shinder\Adobe Flash Builder 4.6\StringANEConnector
set native_directory=C:\Users\shinder\workspace\ShinderStringNative\bin\native

set signing_options=-storetype pkcs12 -keystore "C:\Users\shinder\Desktop\mycert_shinderlin_123456.p12"
set dest_ANE=ShinderString.ane
set extension_XML=%library_directory%\src\extension.xml
set library_SWC=%library_directory%\bin\StringANEConnector.swc

"%adt_directory%"\adt -package -tsa none %signing_options% -target ane "%dest_ANE%" "%extension_XML%" -swc "%library_SWC%" -platform Android-ARM -C "%native_directory%" .
4. 在 命令列中執行  package.bat, 就可以在相同的目錄看到 ane 檔了。
5. -tsa none 的參數可以避免打包時 "Could not generate timestamp" 的錯誤。

測試功能的專案:
1. 在 Flash Builder 上建立 Flex Mobile Project。
2. 在 Properties > Flex Build Path > Native Extensions 加入 ane 檔。
3. 在 Properties > Flex Build Packaging > Google Android > Native Extensions, 勾選 ANE 項目裡的 Package (就是發佈時要包含 ane 檔的內容)。
4. 按 Export Release Build 就可以生成 apk 檔了。

註1: jar, swc, apk 都是 zip 格式, 就可以用 7-zip 之類的工具就查看打包的內容。
註2: Permissions 應該是在 Flex Mobile Project 上設定, 而不是在 Android Application Project 上設定。

2012-06-02

測試 AIR-Kinect

跟朋友借了 Kinect 偵測器用以 survey Adobe AIR 的應用。

朋友當初買的是 Xbox + Kinect 整組, 所以沒有附電源線 ( 電源+AUX-USB轉接 )。若是單買 Kinect     會附電源線。網路上電源線大概 360 NT, 原廠的大概 800 NT, 我直接跑去光華買, 問了好幾家才問到一家有賣, 還開價 450 NT, 想說懶得等就直接買了 QQ。

目前在 Windows 上測試還滿容易的, 先到 Kinect for windows 下載並安裝 SDK, Toolkit 應該可以不用安裝 (另一種方式是使用 OpenNI, 但我一直在 windows 7 32-bit 上裝不起來, 就不想試了)。

裝好 Kinect for Windows SDK 之後, 到 as3NUI 下載 airkinect-2-core, 並解壓縮。其中 bin/airkinect-2-core.swc 和 bin/airkinect-2-core-mssdk.ane 是我們會用到的兩個檔案。

as3NUI 建議使用 Flash Builder 4.6 (或其它 IDE ) 去開發, 在這兒有 Video 教學。以下是使用 Flash CS6 來測試的個人步驟:

  1. 建立一個專案目錄 kinect_01/ 。
  2. 以 Flash CS6 新建 AIR 檔案 kt_main01.fla 並存放在 kinect_01/ 裡。
  3. 將 airkinect-2-core.swc 和 airkinect-2-core-mssdk.ane 兩個檔案放到 kinect_01/ 裡。
  4. 在 kt_main01.fla 的「ActionScript設定」裡, 分別於「元件庫設定」加入 .swc 和 .ane 檔。
  5. 發佈時使用「Windows 安裝程式」不能使用「AIR套件」發佈。

以下程式參考 as3NUI 的範例,但寫在 fla 的第一影格:
import com.as3nui.nativeExtensions.air.kinect.Kinect;
import com.as3nui.nativeExtensions.air.kinect.KinectSettings;
import com.as3nui.nativeExtensions.air.kinect.events.CameraImageEvent;
import com.as3nui.nativeExtensions.air.kinect.data.User;
import com.as3nui.nativeExtensions.air.kinect.data.SkeletonJoint;
import com.as3nui.nativeExtensions.air.kinect.constants.CameraResolution;
import flash.display.StageAlign;
import flash.display.StageScaleMode;
import flash.display.Bitmap;
import flash.display.Sprite;
import flash.events.Event;
import flash.display.Graphics;

var kinect:Kinect;
var kinectSettings:KinectSettings;
var bmp:Bitmap;
var skeletonContainer:Sprite;

stage.align = StageAlign.TOP_LEFT;
stage.scaleMode = StageScaleMode.NO_SCALE;
stage.nativeWindow.visible = true;

if(Kinect.isSupported()){
 bmp = new Bitmap;
 this.addChild( bmp );
 skeletonContainer = new Sprite;
 this.addChild( skeletonContainer );
 kinect = Kinect.getDevice();
 kinect.addEventListener(CameraImageEvent.DEPTH_IMAGE_UPDATE, depthImageUpdate);
 kinectSettings = new KinectSettings();
 kinectSettings.depthEnabled = true;
 kinectSettings.skeletonEnabled = true;
 kinectSettings.depthResolution = CameraResolution.RESOLUTION_640_480;
 kinect.start( kinectSettings );
 this.addEventListener(Event.ENTER_FRAME, myEnterFrame);
} else {
 trace('Kinect is not Supported!');
}

function myEnterFrame(event:Event):void {
 var user:User;
 var joint:SkeletonJoint;
 var gr:Graphics = skeletonContainer.graphics;
 gr.clear();
 for each( user in kinect.usersWithSkeleton) {
  joint = user.rightHand;
  gr.beginFill(0xFF0000);
  gr.drawCircle(joint.depthPosition.x, joint.depthPosition.y, 10);
  gr.endFill();
  joint = user.leftHand;
  gr.beginFill(0x0000FF);
  gr.drawCircle(joint.depthPosition.x, joint.depthPosition.y, 10);
  gr.endFill();
 }
}

function depthImageUpdate(event:CameraImageEvent):void {
 bmp.bitmapData = event.imageData;
}


2010-08-26

Adobe AIR Launchpad

Adobe AIR Launchpad 是個 AIR app,用來快速建立 AIR 專案,以方便在 Flash Builder 編寫。
官網:
   http://labs.adobe.com/technologies/airlaunchpad/
Blog 介紹:
   Adobe AIR Launchpad – a tool for Flex developers building AIR applications
Videos:
   Introduction to the Adobe AIR Launchpad
   Adobe AIR Launchpad beta for RIAgora.com

2010-06-22

用 AIR2 透過 DatagramSocket (UDP) 及截圖做簡陋的監視服務

安裝 PicServer.air 的電腦必須要有 Webcam,當然也要有網路功能,使用 port 24688,啟動後會等待 client 登入。安裝 PicClient.air 的電腦是監看端,使用 port 24689,記得防火牆要讓訊息通過才行。由於使用 UDP,所以無法得知連線狀態,因為 client 必須傳 session 給 server,server 才會傳畫面資料給 client。client 端還可以發展成調整時間間隔、畫面品質、及存檔等。
原始碼如下(請使用 Flash CS5)。

2010-06-17

使用 Adobe AIR 建立 RTMP Proxy

在此使用 Adobe AIR 建立 RTMP Proxy 的目的是去查看 RTMP 傳送的內容。雖然 Adobe 已經釋出 RTMP Specification,但是在 Flash Player 10.0.32.18 後還是有變動(註)。
注意事項:
A) Fla 檔記得使用 Flash CS5 開 AIR 2。
B) 在桌面建立個空的 rtmp_proxy 目錄,用來存放執行時的資料存檔。
C) 在 Flash Media Server,開個名為「test」的 Application,並啟動 Server。
D) 先執行 RTMPProxy 再執行 VideoTest,
E) 跑一下子就關掉 VideoTest,否則檔案會越來越多,硬碟可能會爆。

以下是 兩個 Document Classes 的內容,Fla 就不附了:

2010-05-09

AIR 不支援提供系統資料表 sqlite_master

Adobe AIR 不支援提供系統資料表 sqlite_master 和 sqlite_ 開頭的資料表,
可以透過 SQLConnection.loadSchema() 取得相關資料。

Adobe AIR 這樣的做法有點討厭。

2007-12-14

AIR beta3, Flex 3 beta 3, BlazeDS beta

Adobe labs 昨天發佈的 beta

Flex 3 beta 3 應該是正式版前最後的公開測試版

BlazeDS 是新釋出的開源專案, 功能只包含部份的 LCDS(LiveCycleR Data Services) ES 功能。 AMF3 spec 也一併釋出了。
LCDS ES 應該還是商業版, 又是開源版輔助商業版的策略。

FB 留言