最近在忙着接入公司各个渠道的SDK,遇到很多的坑,在这里记录下来,给后来的同学一点借鉴。
首先说明一下,我是采取android studio打包aar放入Unity的方式接入SDK的,如果没有过安卓开发经验的同学可以看这里,点击打开链接,http://www.manew.com/thread-103445-1-1.html,蛮牛上写的挺详细,就不赘述了,另外提醒同学们最好去了解一下android 的生命周期函数,AndroidManifest.xml的配置信息的一些基本知识,这样可以有助于更快的接入SDK(少踩坑)。
unity无法读取Plugins下aar包内assets文件夹下的资源,可以用压缩软件解压aar包,把assets下的资源复制,在unity plugins/Android下新建assets放入即可,
另外有些SDK给的jar包里也会有assets文件夹下的资源,解决方法同上(最好打开jar包看一下)
如果sdk需要 .so 文件的话,请在app的build.gradle文件buildTypes大括号后加入
sourceSets.main { jniLibs.srcDirs = ['libs'] }
.so文件放入libs文件夹下打包出来,用解压软件找到,放入unity plugins/Android/libs/armeabi-v7a 文件夹下即可看到
如果调出sdk支付界面按home再切换回来SDK支付界面消失,是因为Unity打包默认设置launchModel的singleTask属性,可以在xml配置里主activity里加入
android:name="这一行是你自己的类名,不要复制哦"
android:configChanges="fontScale|keyboard|keyboardHidden|locale|mnc|mcc|navigation|orientation|screenLayout|screenSize|smallestScreenSize|uiMode|touchscreen"
android:screenOrientation="sensorLandscape"
android:launchMode="standard">
改为默认,并且加入旋转屏幕属性
删掉
android:name="unityplayer.UnityActivity" android:value="true" />
即可,如果还不行,可以反编译apk看看改动生效没有
在接入移动MM的sdk时候,他们有一个mmiap.xml的文件要放入apk的根目录,这个可以unity打包好之后用解压软件打开apk,删除META-INF文件夹,把文件复制进去(Ctrl+v),用签名软件重新签名即可
另外,有些SDK的初始化的支付时需要在UI线程中执行的,可以在代码中这样
currentActivity.runOnUiThread(new Runnable() { public void run() { "这里写你要执行的逻辑代码" } });
在接入Oppo渠道SDK时发现悬浮窗出不来,最后发现是网游还是单机标签的问题
在接入魅族SDK时发现用户不能禁用了imei 权限,否则SDK框一闪而过
另外,有些渠道需要加入闪屏的功能,也可以在android中实现,可以在android studio中创建一个闪屏acticity,加载完成后再加载我们的unity activity,具体如下:
在AndroidManifest.xml中设置闪屏activity(别忘了添加我们自己的unity activity)
android:name=".SplashActivity"
android:configChanges="fontScale|keyboard|keyboardHidden|locale|mnc|mcc|navigation|orientation|screenLayout|screenSize|smallestScreenSize|uiMode|touchscreen"
android:screenOrientation="sensorLandscape"
android:launchMode="standard">
android:name="android.intent.action.MAIN" />
android:name="android.intent.category.LAUNCHER" />
android:name=".MainActivity"
android:configChanges="fontScale|keyboard|keyboardHidden|locale|mnc|mcc|navigation|orientation|screenLayout|screenSize|smallestScreenSize|uiMode|touchscreen"
android:screenOrientation="sensorLandscape"
android:launchMode="standard">
添加闪屏类
package com.magicbirds.yjldemo;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.Window;
import android.view.WindowManager;
import android.view.animation.AlphaAnimation;
import android.view.animation.Animation;
import android.view.animation.AnimationSet;
import android.view.animation.RotateAnimation;
import android.view.animation.ScaleAnimation;
import android.widget.LinearLayout;
import com.unity3d.player.UnityPlayerActivity;
public class SplashActivity extends Activity {
private LinearLayout ll_splash;
private Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case 1:
startMainActivity();
break;
case 2:
startMainActivity();
break;
}
}
};
@SuppressLint("WrongViewCast")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//隐藏标题栏以及状态栏
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
/**标题是属于View的,所以窗口所有的修饰部分被隐藏后标题依然有效,需要去掉标题**/
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_splash);
ll_splash = (LinearLayout) findViewById(R.id.ll_splash);
/**
* 第一种方法,利用handler自带的sendEmptyMessageDelayed()方法。
*/
//mHandler.sendEmptyMessageDelayed(1, 2000);
/**
* 第二种方法,其实实现原理和第一种是一样的,
*/
//
// Message message = new Message();
// message.what = 2;
// mHandler.sendMessageDelayed(message, 2000);
/**
* 第三种方法,利用动画实现
*/
//startAdimThree();
/**
* 第四种方法,利用动画实现
*/
StartAniFour();
}
private void StartAniFour() {
AlphaAnimation start = new AlphaAnimation(0.0f, 1.0f);
start.setDuration(1000);
// findViewById(R.id.splash).startAnimation(start);
start.setAnimationListener(new Animation.AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
}
@Override
public void onAnimationEnd(Animation animation) {
startMainActivity();
}
@Override
public void onAnimationRepeat(Animation animation) {
}
});
ll_splash.startAnimation(start);
}
/**
* 开启动画
*/
private void startAdimThree() {
// 动画集合
AnimationSet set = new AnimationSet(false);
// 旋转动画
RotateAnimation rotateAnimation = new RotateAnimation(180, 180,
Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF,
0.5f);
rotateAnimation.setDuration(2000);// 设置动画时间
rotateAnimation.setFillAfter(true);// 保持动画状态
// 缩放动画
ScaleAnimation scaleAnimation = new ScaleAnimation(0, 1, 0, 1,
Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF,
0.5f);
scaleAnimation.setDuration(2000);// 设置动画时间
scaleAnimation.setFillAfter(true);// 保持动画状态
// 渐变动画
AlphaAnimation alphaAnimation = new AlphaAnimation(0, 1);
alphaAnimation.setDuration(2000);
alphaAnimation.setFillAfter(true);// 保持动画状态
// 添加动画
set.addAnimation(rotateAnimation);
set.addAnimation(scaleAnimation);
set.addAnimation(alphaAnimation);
/*
* 设置动画的监听事件,当动画运行完成后,启动新的activity
*/
set.setAnimationListener(new Animation.AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
// TODO Auto-generated method stub
}
@Override
public void onAnimationRepeat(Animation animation) {
// TODO Auto-generated method stub
}
@Override
public void onAnimationEnd(Animation animation) {
// TODO Auto-generated method stub
startMainActivity();
}
});
ll_splash.startAnimation(set);
}
/**
* 跳转到主界面
*/
private void startMainActivity() {
startActivity(new Intent(SplashActivity.this, MainActivity.class));
finish();
}
@Override
protected void onDestroy() {
super.onDestroy();
// mHandler.removeMessages(1);
// mHandler.removeMessages(2);
}
}
还有布局文件(layout目录下的)