在使用as接入安卓原生sdk時候,遇到了很多坑,這裏做一下記錄,希望幫到有緣人!
一,配置
由於要提供給unity使用,而sdk大多是採用原生接入,所以我這裏要接成類庫導入給unity調用。對於unity-安卓交互不瞭解的去補一下再來。方式我採用arr包而不是jar包因爲相對更方便,快捷,安全。
1:在as中創建module,選擇 android lib,並設置模塊名,對應的包名也是這個,所以對於有一些sdk需要在特定的包裏的可以直接設置,也可以自定義包名後在創建對應的子包就可以了。
2,將要接入的sdk包放到libs文件夾下邊 同時將unity的類庫放入 classes.jar
放入的包需要添加依賴項,jar包可以直接右鍵,點擊add as library ,或者去module下的build.gradle 裏邊配置
api 可以使用這幾個:
打碼的是你導入的包的名字,第三個是arr包的方式 第二個要是全路徑,‘libs/’+包名
二,接入代碼
大部分初始化等都需要在application或者mainactivity中,而我們剛創建的類庫都是空的,需要自己定義
在你的包名右鍵,點擊new-activity -baseactivity 創建空活動頁,並自定義名字,勾上launcher,
將上圖layout文件夾刪除
然後去配置文件(AndroidManifest 。xml)這一部分都清掉,此時你的腳本還在報錯,同樣將報錯的全部刪除,不需要,再將appcompatActivity 改爲 UnityPlayerActivity
然後你就可以接入對應的代碼........
三,提供接口
按照接入指南,你只能是在安卓端的,你需要爲unity提供接口調用,比如初始化init等,
定義public方法,可以帶參數,如string ,int 等。來接受unity傳入的數據
一般的接入我們不只需要unity去傳入,還要接受安卓返回的數據,回調。
UnityPlayer.UnitySendMessage("Receiver", "CallUnity", "您取消了授權! ");
第一個是unity需要接受的腳本掛載的物體名字,第二個爲腳本上的public方法,第三個爲參數,你可以在unity這個方法中處理數據
然後有些會涉及到信息提示,比如結果狀態等,可以用下邊方法提示,原生的提示,一定時間後就會消失的
Toast.makeText(MainActivity.this, errorCode , Toast.LENGTH_SHORT).show();
errorcode 爲你要展示的信息內容
四,打包aar
sdk中提到的配置文件,manifest,混淆代碼,路徑xml等都先不管,直接打包,這些我們要放到unity中,包體在output下
然後將這個包拖到UN體驗的plugins\Android 文件夾下,同樣將manifest拖入,並雙擊打開,按照要求修改
導入後自定義交互腳本,調用相應的方法,進行交互.....
交互方式: 做一個工具類,方便!
/// <summary>
/// unity 和安卓交互類
/// </summary>
public static class AndroidTools
{
private static AndroidJavaClass jc;
private static AndroidJavaObject jo;
/// <summary>
/// 發送給android的
/// </summary>
/// <param name="methordName"></param>
/// <param name="args"></param>
public static void CallAndroid(string methordName, object[] args=null)
{
#if UNITY_ANDROID && !UNITY_EDITOR
if (jo == null)
{
Init();
}
if (args != null)
jo.Call(methordName, args);
else
jo.Call(methordName);
#endif
}
#if UNITY_ANDROID
/// <summary>
/// 和安卓通信s
/// </summary>
/// <param name="methordName"></param>
/// <returns></returns>
public static T CallAndroid<T>(string methordName)
{
return jo.Call<T>(methordName);
}
#endif
/// <summary>
/// 初始化
/// </summary>
private static void Init()
{
jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");//com.unity3d.player.UnityPlayer
jo = jc.GetStatic<AndroidJavaObject>("currentActivity");//currentActivity
}
}
五,unity打包
正常情況下是可以打出來的,但是更多時候是會失敗的。
1,設置keystore ,自己創建或者使用現有的,不會的 可以百度,很簡單
2,untiy playersetting 裏的包名是不能跟aar包一致的, 第一,二個框都是com.xx.xx,你的module的包名,第三個是名字,最後一個xx
3,你可能會遇到theam報錯,就是安卓主題的,根據提示,打開aar包找到文件,跟主題相關的都刪掉,刪掉lib是下的calssses包,進res文件夾,values 的stringxml只留一個包名的代碼,其他的都刪掉。
4,然後你又可能還會失敗,Program type already present: com.crush.gogo.BuildConfig 這是你包重複了,arr中libs下的包不要在放unity裏 Trying to add file to the list of ouptut files in the build report, but....
如果出現一些奇怪的報錯,直接再丟進去這幾個包就行了,支持包
去這裏下載:https://download.csdn.net/download/nt_xs_j/12074031
5,還有,可能會有一些asset文件,路徑啥的,按照人家說的,在plaugins/android 下創建對應的
6,如果還有問題,可以來信,一塊研討!