[AIR接入Android 平台]Ane 生命周期控制

I struggled for a while with this issue and finally found a solution. I haven’t seen it posted anywhere so I thought I would share it here.

  • In ANE extension’s native java project, we include runtimeClasses.jar from AIR’s lib folder (AIR\lib\android\lib), along with FlashRuntimeExtension.jar. This gives us access to AIR’s AndroidActivityWrapper class.

  • Since some interfaces in runtimeClasses are defined as protected, we need to make them accessible to our extension. So we create two interfaces in com.adobe.air package namespace:

ActivityResultCallback.java

package com.adobe.air;
import com.adobe.air.AndroidActivityWrapper;
public abstract interface ActivityResultCallback extends AndroidActivityWrapper.ActivityResultCallback{}

[AIR接入Android 平台]Ane Activity onActivityResult 处理

1
2
3
4
5
6
7
8
9
10
11
12
protected void onCreate(Bundle savedInstanceState) {
  requestWindowFeature(Window.FEATURE\_NO\_TITLE);
  LinearLayout layout;
  layout = new LinearLayout(this);
  layout.setGravity(Gravity.BOTTOM | Gravity.LEFT);
  layout.setBackgroundDrawable(null);
  setContentView(layout);
  setRequestedOrientation(1);
  super.onCreate(savedInstanceState);
   Intent intent = new Intent(this, PaymentsActivity.class);
   startActivityForResult(...);
}

思路:用一个透明的Activity 去启动SDK的Activity。这样就可以在透明的Activity中处理onActivityResult

需要限制透明Activity的横竖屏切换。

1
2
android:configChanges="keyboardHidden|orientation|screenSize"
      android:screenOrientation="portrait"/>

[AIR接入Android 平台]ane 获取主视图+添加layout

1
2
3
4
5
6
7
8
9
10
11
public void buildLayout(Activity act)
  {
    log("ExtensionContext - buildLayout");
   
    this.mAdLayout = new RelativeLayout(act);
   
    ViewGroup fl = (ViewGroup)act.findViewById(16908290);
    fl = (ViewGroup)fl.getChildAt(0);
   
    fl.addView(this.mAdLayout, new FrameLayout.LayoutParams(-1, -1));
  }

可以使用:android.view.Window.ID_ANDROID_CONTENT 替换

[AIR接入Android 平台]处理res资源之找不到资源ID

一点声明:我的水平有限 这里仅仅只能写出我认为可行的方案 和 代码

打包ANE会经常遇到找不到资源R.XXX ID的问题,或者是找到的资源ID不对 然后报NULL POINT错 直接程序崩溃。

AIR与android原生取资源方式的区别: ADOBE给出的取资源的方式是:

_context.getResourceId(`“id.AlipayTitleItemName”);`

但是原生JAVA取资源的方式是:

findViewById(R.id.AlipayTitleItemName);

[AIR接入Android 平台]ane 中oncreate

创建ANE,ANE的创建就不罗嗦了,这里需要注意一点,这里我们需要创建一个继承自Application的类,在该类的onCreate中完成小米SDK的初始化工作

在有的sdk接入中可能强制需要在android onCreate 事件中中调用sdk自身的onCreate

比如小米,或安智。

安智需要在onCreate 中mAnzhiCenter.createFloatView(this); 其他地方调用就会出现floatView 不显示的情况。

遇到这种需要在Air Ane 中控制Android Activity生命周期的情况。onCreate 的可以如下处理:

  1. 看能否继承Application,在Application中onCreate()中处理。

这种方式不能处理需要传入Activity 的情况(如安智),不过大多数Sdk都只需要传入context.

  1. 反编译Sdk 看能否拿到底层的api,在重写ui。

安智可以用这种方式自己写一个floatView 然后调用它的底层API。

  1. 自定义启动air的Activity。

这种方式能 完美解决各种生命周期的问题,如果使用FlashBuilder 打包,需要对打包后的apk 用apkTool 解压,修改manifest中的启动Activity。

如有疑问请留言。

[GooglePlay付费接入]异常处理

1.Google billing Google Play In-app Billing提醒 需要验证身份 您需要登录自己的google账户

a.可能是google 控制台发布应用有延迟。等待了8小时(把自己电脑时间调到了两天前)

b.可能是本地有缓存,重复多点几次看看

2.此版本的应用未配置为通过google play结算

签名与上传发布的配置不一致

包括签名

3.遇到错误提示Error checking for billing v3 support. (response: 3:Billing Unavailable)

手机不支持googleplay。判断手机是否支持的标准是:打开google appstore能看懂付费的app