Unity与Android交互 支付SDK接入流程

Unity 调用 Andoird 注意事项
Unity的jar包名为:"com.unity3d.player.UnityPlayer"
从该包名取"currentActivity"静态变量就是Unity当前运行的Acitivity
ms_UnityPlayClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
instance_context = ms_UnityPlayClass.GetStatic("currentActivity");

取Android实例用 AndroidJavaObject
取Android静态用 AndroidJavaClass
例:
AndroidJavaObject object= new AnroidJavaObject("com.sdk.pay.className");
这样代表实例一个名为className的对象
AndroidJavaClass staticClass=new AnroidJavaClass("com.sdk.pay.className");
这样代表取名为className的类

AndroidJavaObject 用 call<>调用方法
AndroidJavaClass 用CallStatic<>调用静态方法

Android 调用Unity 注意事项
Android调用Unity 需要引用Unity的jar包 在AnroidPlayer目录下可获取
jar包引用在Anroid环境后可调用
UnityPlayer.UnitySendMessage("挂载该脚本的GameObjectName","方法名","参数")



AndroidStudio 注意事项
1.as的项目build.gradle 文件 要注意 minSdkVersion 和 targetSdkVersion 该两个值需要跟Unity的打包环境匹配 Unity最高的targetSdkVersion为23

2.如果入手的as工程的apk工程想打aar包
(1)修改build.gradle 的头文件apply plugin: ' com.android.applicaotin 修改为 apply plugin: ' com.android.library'
(2)打开Open Module Setting的Flavors 删除Application Id的包名
(3) 编译 Ctrl+F9(Make Project

3.查看as项目依赖的jar和aar 在build.gradle可以查看 或者在Open module Setting的Dependencies面板中查看

4.获取编译后的aar的资源在Project面板中的Exteranl Libraries中获取

5.aar表明包含该工程的资源和编译后的jar包

6.jar包资源和aar资源统一放在libs文件夹下

7.导入jar包的姿势为 右键jar包Add Librar 或 在Open Module Setting 中的Dependencies面板中添加

8.导入aar包的姿势为在build.gradle 中的 android 函数体内 加入
(1)
repositories{
flatDir{
dirs 'libs'
}
}
(2)在dependencies 中加入语句 compile(name:'aar文件名', ext: 'aar')
(3)编译


AnroidStudio aar包导入Unity 注意事项
1.导出的aar的minSdkVersion和targetSdkVersion 要与Unity匹配 否则打包失败 且Unity最高支持targetSdkVersion为23的6.0AndroidSDK版本

2.导出的aar的包名与Unity打包的包名是不区分大小写的 所以要么双方包名拼写不一致 要么双方的包名大小写一致
(1)例如不同包名的正确姿势 com.sdk.pay 和 com.supersdk.pay Unity打包正确
(2)例如大小写一致的正确姿势 com.sdk.pay 和 com.sdk.abc Unity打包正确
(3)例如大小写不一致的错误姿势 com.sdk.pay 和 com.SDK.pay 这会导致打包失败抛包名异常

3.aar包中的AndroidManifest在Unity中是不会被识别打包读取的 所以AndroidManifest以Unity的为准

4.异常处理Java.NoClass 是否缺失指定jar包或者缺失该jar包的额外依赖第三方jar包

5.编译不通过,如需要升级 可以把能编译过项目的classpath复制过来编译。

6.刷新UI界面的时候的操作必须在UI线程中处理,就比如打开一个新的界面
Activity activity = (Activity)context;
((Activity)(context)).runOnUiThread( new Runnable() {
@Override
public void run() {
UMGameAgent. init ( context );
UMGameAgent. startWithConfigure ( new MobclickAgent.UMAnalyticsConfig( context , appKey , channel ));
Log. i ( "UmengInit" , "UmengInit" );
}
});

7.启动一个Activity抛出 FLAG_ACTIVITY_NEW_TASK flag异常 如下
E/AndroidRuntime( 7976): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.orbbec.cantvsdk/com.orbbec.cantvsdk.CantvMainActivity}: android.util.AndroidRuntimeException: Calling startActivity() from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?
该问题的原因是 Activity继承自Context,重载了Context的属性,解决该问题的办法是用Activity启动 而不用Context启动,如果用Context启动 代表是新建了一个Task来启动该Activity,一般用多个Task是用于两个App之间的交互。

8.抛出如下异常
java.lang.ClassCastException: android.app.Application cannot be cast to android.app.Activity
该问题的原因是把 Context 强转成Activity使用

9.Server 用于进程之间的联系,例如 开启一个Server 两个APP之间的Activity之间的通信。



android基础知识点
1.Super.方法 代表调用父类的方法
2.Log.i()打印日志
3.Ctrl+Shift+A 快速导航编辑器命令
4.AndriodStduio 自带安卓模拟器AVD Android Virtual Drives
5.Android Device Monitor 用于logcat调试信息
6.Activity主要负责的就是创建显示窗口,你可以在这些窗口里使用setContentView(View)来显示你自己的UI
7.程序里通常会有多个Activity 默认设置启动一个activity 需要在AndroidManifest设置该activity为主activity 例如Unity 默认注册了Unity的主activity 一旦打开app 显示的就是Unity的UI内容
1.


2.

第一个是注册了该MainActivity为程序默认启动的一个主Activity 会在程序启动时直接调用该activity
第二个是注册了TestAccountActivity 需要在程序中手动调用该activity

8.acitivty的名称就是包名中的一个java类 注册activity就是用该包名类注册
9.一个app只能拥有一个MainActivity 如果同时注册了多个MainActivity 则第一个注册的为MainActivity 其他则是注册的为Activity
10.编译android应用,会自动生成R类,在该类中根据不同的资源类型又生成了相应的内部类,该类包含了系统中使用到的所有资源文件的表示 例如layout创建了一个activitytest的XML的 button ID为1 则 可以R.ID.1 取该button
11.界面跳转和服务的启动都会用到Intent类 Activity之间通过Intent进行通信
12.findViewById(int) 用于查找UI控件
13.程序中用到的activity都必须在androidmanifest中注册
14.Android生命周期
首次启动游戏
onCreate>onStart>onResume
跳转到其他Activity
onPause>onStop
跳转到原先Activity
onReStart>onStart>onResume
结束游戏
onPause>onStop>onDestroy
15.UI的控件基本都来自于 import android.widget.*;该库 View是widget所有类的基类
16.ImageView 是用于安卓插入图片的 类似Unity的RawImage
17.TextView 是用于填写文字信息 类似Unity的Text
18.所有的Androidmanifest在打包都会合并 如果有冲突 则打包失败。
19.startActivity(Intent)方法可以用来启动一个新的activity 该方法来自父类Activity 启动的Activity 须在AndoirManifest中注册
20.在APP项目中生成 aar
1.把 build.grade 的头行apply plugin: 'com.android.application' 改成apply plugin: 'com.android.library'
2.打开Open ModuleSetting 在Flavors去除application id重新编译 就能生成aar包了
21.AndroidJavaObject 用于unity生成java中的实例类 用于调用实例类中的方法
22.AndroidJavaClass 用于Unity调用java中的对象类 例如调用静态方法
23.java中调用Unity的接口 需导入Unity接口jar包 UnityPlayer.UnitySendMessage("Root","AndroidCallUnity","str"); 第一参数场景对象名 要唯一,第二是方法名 要唯一,第三是参数
24.添加删除jar包 project 右键Open Module Setting -Dependencies 加减号 添加删除。
25.aar包中的AndroidManifest无法给Unity 读取 所以AndroidManifest 必须 取出来放在unity Project中
26.匿名函数中 不能直接this表示外部类 必须以外部类名.this 。匿名函数的this是该匿名函数类的方法。
27.Toast.makeText 用于快速显示一个Text 提示 该函数要在UI线程中调用。
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(OrbbecMainActivity.this,"SaySuccceed",Toast.LENGTH_LONG).show();
}
});
28.Intent.SetClass 跳转目标Acitivty 第一参数为 跳转目标的包名 第二参数为 跳转目标包名中的类
例如 Intent intent=new Intent();
intent.setClassName(com.jianda.sdk,com.jianda.sdk.testclass); 类需要把包名也指定出来

29.Application 才是安卓真正的主入口 类似Unity的Awake 而主Activity 类似Start Application 全局唯一

30.右键 External Libraries 的包class 中的Directory Path 获取当前编译后的jar 编译前jar 是java 用不了 编译后的jar是class 才能用







你可能感兴趣的:(Unity)