我正在编写一个扩展程序,允许Flex应用程序访问Android的本机图像选择器。我能够毫无问题地启动图像选择器活动,但在它返回到调用者(即FREFunction对象)之后,不会调用onActivityResult。因此,我无法确定用户选择的图像。
当我在原生Android应用程序中使用完全相同的FREFunction内容时,该应用程序工作正常,我能够在onActivityResult中检索所选图像的URI。如何触发onActivityResult,或者至少检索图像选择器活动返回的信息?
答案 0 :(得分:4)
另一个更简单的解决方案:
在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;
}
}
}
答案 1 :(得分:2)
解决方案是从FREFunction启动一个活动,然后使用该活动的onActivityResult函数来执行需要返回活动数据的所需操作。
从那里,您可以使用StatusEvent将信息发送回Flex应用程序。确保有StatusEvent的监听器,以及根据事件标签处理数据的正确函数。
注意:在运行onActivityResult的活动中添加额外内容可能会导致永远不会调用该活动。而是在FREFunction中创建要调用的活动的公共静态字段。
此外,请确保活动中使用的上下文是本机扩展处理程序使用的FREContext。