2012-01-07 81 views
2

我正在編寫一個擴展,它將允許Flex應用程序訪問Android的本機圖像選擇器。我能夠毫無問題地啓動圖像選取器活動,但在它返回給調用者(這是FREFunction對象)之後,不會調用onActivityResult。因此,我無法弄清楚用戶選擇了什麼圖像。如何讓onActivityResult在Adobe Air本機擴展中運行?

當我使用FREFunction完全相同的內容在原生Android應用程序,該應用程序工作正常,並且我能夠檢索onActivityResult所選擇的圖像的URI。我怎樣才能讓onActivityResult觸發,或至少檢索圖像選擇器活動返回的信息?

回答

2

的解決方案是,開始從FREFunction一個活動,然後使用該活動的onActivityResult函數來執行,將所需要的返回活動的數據所需的操作。

從那裏,你可以使用的StatusEvent將信息發送回您的Flex應用程序。確保擁有StatusEvent的偵聽器,並有適當的函數根據事件的標籤處理數據。

注:添加額外到要運行onActivityResult可能導致從不被稱爲活動的活動。相反,在您的FREFunction中創建公共靜態字段以供調用的活動使用。

此外,保證在活動而被使用的上下文是由本機擴展處理程序中使用的FREContext。

+0

無論如何,你可以詳細說明一些代碼示例?我有類似的問題。 – 2013-07-31 17:23:21

4

另外,簡單的解決方案:

  • 在ANE擴展的本地Java項目,包括 runtimeClasses.jar從AIR的lib文件夾(AIR \ LIB \機器人\ lib中),與FlashRuntimeExtension沿.jar。這使您可以訪問AIR的AndroidActivityWrapper類 。

  • 由於runtimeClasses.jar一些接口被定義爲 保護,你需要讓他們到您的擴展訪問。所以, 創建com.adobe.air包命名空間中兩個接口:


ActivityResultCallback.java

package com.adobe.air; 

import com.adobe.air.AndroidActivityWrapper; 

public abstract interface ActivityResultCallback extends AndroidActivityWrapper.ActivityResultCallback 
{ 
} 

StateChangeCallback.java

package com.adobe.air; 

import com.adobe.air.AndroidActivityWrapper; 

public abstract interface StateChangeCallback extends AndroidActivityWrapper.StateChangeCallback 
{ 
} 
  • 現在,您可以在我們的擴展註冊一些回調:

ExtensionContext。java

package com.company.extension; 

import java.util.HashMap; 
import java.util.Map; 
import android.content.Intent; 
import android.content.res.Configuration; 
import com.adobe.air.ActivityResultCallback; 
import com.adobe.air.AndroidActivityWrapper; 
import com.adobe.air.AndroidActivityWrapper.ActivityState; 
import com.adobe.air.StateChangeCallback; 
import com.adobe.fre.FREContext; 
import com.adobe.fre.FREFunction; 

public class ExtensionContext extends FREContext implements ActivityResultCallback, StateChangeCallback 
{ 
    private AndroidActivityWrapper aaw; 

    public ExtensionContext() { 
     aaw = AndroidActivityWrapper.GetAndroidActivityWrapper(); 
     aaw.addActivityResultListener(this); 
     aaw.addActivityStateChangeListner(this); 
    } 
    @Override 
    public void onActivityResult(int requestCode, int resultCode, Intent intent) { 
    } 

    @Override 
    public void onActivityStateChanged(ActivityState state) { 
     switch (state) { 
      case STARTED: 
      case RESTARTED: 
      case RESUMED: 
      case PAUSED: 
      case STOPPED: 
      case DESTROYED: 
     } 
    } 

    @Override 
    public void onConfigurationChanged(Configuration paramConfiguration) 
    { 
    } 

    @Override 
    public Map<String, FREFunction> getFunctions() { 
     Map<String, FREFunction> functionMap = new HashMap<String, FREFunction>(); 
     return functionMap; 
    } 

    @Override 
    public void dispose() { 
     if (aaw!=null) { 
      aaw.removeActivityResultListener(this); 
      aaw.removeActivityStateChangeListner(this); 
      aaw = null; 
     } 
    } 
} 
+0

這是一個比@ Omatic更好更完整的解決方案,完全比Adobe自己的文檔更好,它確實應該被標記爲正確的答案。 – seaders 2014-05-14 13:33:41

+0

沒有爲我工作。當我在項目中引用runtimeClasses.jar然後得到: 'java.lang.NoClassDefFoundError:失敗的解決方案:Lcom/adobe/air/AndroidActivityWrapper' 當我將runtimeClasses.jar打包到最後一個jar後出現另一個問題: 'java.lang.UnsatisfiedLinkError中:未找到無效com.adobe.air.AIRWindowSurfaceView.nativeSurfaceCreated實現()(試過Java_com_adobe_air_AIRWindowSurfaceView_nativeSurfaceCreated和Java_com_adobe_air_AIRWindowSurfaceView_nativeSurfaceCreated __)' – 2015-02-04 12:25:54

+0

@MagaAbdurakhmanov你解決這個錯誤?我現在有完全相同的錯誤,試圖找出如何解決它 – 2015-03-04 00:16:06

相關問題