2

我正在编写一个扩展,它允许 Flex 应用程序访问 Android 的本机图像选择器。我能够毫无问题地启动图像选择器活动,但是在它返回到调用者(一个 FREFunction 对象)之后,不会调用 onActivityResult。因此,我无法弄清楚用户选择了什么图像。

当我在原生 Android 应用程序中使用完全相同的 FREFunction 内容时,该应用程序运行良好,并且我能够在 onActivityResult 中检索所选图像的 URI。如何让 onActivityResult 触发,或者至少检索图像选择器活动返回的信息?

4

2 回答 2

5

另一个更简单的解决方案:

  • 在 ANE 扩展的原生 java 项目中,包括 来自 AIR 的 lib 文件夹 ( AIR\lib\android\lib ) 的runtimeClasses.jar以及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;
        }
    } 
}
于 2014-03-10T10:57:20.943 回答
2

解决方案是从 FREFunction 启动一个活动,然后使用该活动的 onActivityResult 函数来执行需要返回活动数据的所需操作。

从那里,您可以使用 StatusEvent 将信息发送回您的 Flex 应用程序。确保有 StatusEvent 的侦听器,以及根据事件标签处理数据的适当函数。

注意:向要运行 onActivityResult 的活动添加额外内容可能会导致该活动永远不会被调用。相反,在您的 FREFunction 中创建公共静态字段以供活动调用。

此外,确保活动中使用的上下文是本机扩展处理程序使用的 FREContext。

于 2012-01-23T08:44:19.633 回答