最近在忙着接入公司各个渠道的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里加入

<activity
    android:name="这一行是你自己的类名,不要复制哦"
    android:configChanges="fontScale|keyboard|keyboardHidden|locale|mnc|mcc|navigation|orientation|screenLayout|screenSize|smallestScreenSize|uiMode|touchscreen"
    android:screenOrientation="sensorLandscape"
    android:launchMode="standard">

改为默认,并且加入旋转屏幕属性

删掉

<meta-data 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)

<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">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />

        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>
<activity
    android:name=".MainActivity"
    android:configChanges="fontScale|keyboard|keyboardHidden|locale|mnc|mcc|navigation|orientation|screenLayout|screenSize|smallestScreenSize|uiMode|touchscreen"
    android:screenOrientation="sensorLandscape"
    android:launchMode="standard">
</activity>

添加闪屏类

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目录下的)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/ll_splash"
    android:orientation="vertical">

    <ImageView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@drawable/lehaihai_shanping" />
</LinearLayout>