1. 程式人生 > >Unity接入Android各渠道SDK的坑

Unity接入Android各渠道SDK的坑

最近在忙著接入公司各個渠道的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>