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屬性,
<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>