2012-01-07 50 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

相关问题