更多筆記和源碼請關注:【微信公衆號】 CocosCreator筆記
tips:ts與java交互
請參考官方文檔:
https://docs.cocos.com/creator/2.2/manual/zh/advanced-topics/java-reflection.html
初始化相關變量:
static public AppActivity activity;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
activity = this;
}
ts調用java:
必須是static函數,如果有任何UI操作,一定要在UI線程中執行
static public void showAd(String codeId) {
activity.runOnUiThread(new Runnable() {
@Override
public void run() {
}
});
}
java調用ts:
一定要在GL線程中執行
public void sendReward() {
activity.runOnGLThread(new Runnable() {
@Override
public void run() {
String js = "cc.NativeBridge.rewardedAdCallback(";
String params = "'"+param0+"','"+param1+"'";
js = js + params + ");";
Cocos2dxJavascriptJavaBridge.evalString(js);
}
});
}
首先構建編譯安卓工程
在proj.android-studio/app目錄下新建libs目錄
將已下兩個aar文件拷貝到該目錄
配置gradle:
在項目的build.gradle中添加依賴:
implementation('com.android.support:support-v4:24.2.0')
官方文檔中讓添加open_ad_sdk.aar和android-gif-drawable-1.2.6.aar
但cc項目本身就添加了aar格式文件,不需要再手動依賴,否則會報錯:
More than one file was found with OS independent path XXX
最終正確的配置如下:
然後在defaultConfig中添加abiFilters,後邊根據需要配置平臺
ndk {
// 設置支持的 SO 庫構架,注意這裏要根據你的實際情況來設置 abiFilters ‘armeabi-v7a’, ‘arm64-v8a’, ‘x86’, ‘x86_64’, ‘arm64-v8a’
abiFilters 'armeabi-v7a'
}
位置如下圖:
如果將demo中的LayoutManagerGroup.aar也拷貝進項目會編譯報錯:
Manifest merger failed with multiple errors, see logs
點擊查看錯誤詳情:
提示引用的包LayoutManagerGroup.aar中minSdkVersion最小爲19,而此項目裏minSdkVersion爲16,造成衝突。
將項目的minSdkVersion改爲19即可
配置AndroidManifest:
添加權限:
<!--必要權限-->
<uses-permission android:name="android.permission.INTERNET" />
<!--可選權限-->
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES"/>
<uses-permission android:name="android.permission.GET_TASKS"/>
<!--可選,向開發者聲明獲取定位後,纔可慎重添加此權限,穿山甲將依據此權限投放精準廣告-->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<!-- 如果有視頻相關的廣告且使用textureView播放,請務必添加,否則黑屏 -->
<uses-permission android:name="android.permission.WAKE_LOCK" />
添加provider:
<provider
android:name="com.bytedance.sdk.openadsdk.TTFileProvider"
android:authorities="${applicationId}.TTFileProvider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
</provider>
<provider
android:name="com.bytedance.sdk.openadsdk.multipro.TTMultiProvider"
android:authorities="${applicationId}.TTMultiProvider"
android:exported="false" />
在res目錄下新建xml目錄,新建file_paths.xml文件,添加代碼:
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-files-path name="external_files_path" path="Download" />
<!--爲了適配所有路徑可以設置 path = "." -->
</paths>
配置代碼混淆:
在proguard-rules.pro文件中添加代碼:
-keep class com.bytedance.sdk.openadsdk.** { *; }
-keep public interface com.bytedance.sdk.openadsdk.downloadnew.** {*;}
配置完成後,開始擼代碼了~
將demo中的TTAdManagerHolder.java文件拷貝到項目中
文件頂部的包名改成
package org.cocos2dx.javascript;
buildConfig函數中填寫正確的參數
新建MyApplication.java文件,代碼如下:
public class MyApplication extends Application {
@Override
public void onCreate(){
super.onCreate();
//穿山甲SDK初始化
//強烈建議在應用對應的Application#onCreate()方法中調用,避免出現content爲null的異常
TTAdManagerHolder.init(this);
}
}
在AndroidManifest中添加application
<application
android:name="org.cocos2dx.javascript.MyApplication"
</application>
就可以成功初始化SDK了~
在AppActivity中添加廣告代碼:
static public AppActivity activity;
private String TAG = "cocos";
private TTAdNative mTTAdNative;
private TTRewardVideoAd mttRewardVideoAd;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Workaround in https://stackoverflow.com/questions/16283079/re-launch-of-activity-on-home-button-but-only-the-first-time/16447508
if (!isTaskRoot()) {
// Android launched another instance of the root activity into an existing task
// so just quietly finish and go away, dropping the user back into the activity
// at the top of the stack (ie: the last state of this task)
// Don't need to finish it again since it's finished in super.onCreate .
return;
}
// DO OTHER INITIALIZATION BELOW
SDKWrapper.getInstance().init(this);
activity = this;
//step1:初始化sdk
TTAdManager ttAdManager = TTAdManagerHolder.get();
//step2:(可選,強烈建議在合適的時機調用):申請部分權限,如read_phone_state,防止獲取不了imei時候,下載類廣告沒有填充的問題。
TTAdManagerHolder.get().requestPermissionIfNecessary(this);
//step3:創建TTAdNative對象,用於調用廣告請求接口
mTTAdNative = ttAdManager.createAdNative(getApplicationContext());
loadAd("938493801", TTAdConstant.VERTICAL);
}
static public void showAd(String codeId) {
activity.runOnUiThread(new Runnable() {
@Override
public void run() {
if (activity.mttRewardVideoAd != null) {
//step6:在獲取到廣告後展示
//該方法直接展示廣告
activity.mttRewardVideoAd.showRewardVideoAd(activity);
//展示廣告,並傳入廣告展示的場景
activity.mttRewardVideoAd = null;
} else {
Log.e(activity.TAG, "請先加載廣告");
}
}
});
}
public void sendReward() {
activity.runOnGLThread(new Runnable() {
@Override
public void run() {
String js = "cc.NativeBridge.rewardedAdCallback();";
Cocos2dxJavascriptJavaBridge.evalString(js);
Log.e(TAG,"rewardVideoAd evalString");
}
});
}
private void loadAd(final String codeId, int orientation) {
//step4:創建廣告請求參數AdSlot,具體參數含義參考文檔
AdSlot adSlot = new AdSlot.Builder()
.setCodeId(codeId)
.setSupportDeepLink(true)
.setImageAcceptedSize(1080, 1920)
.setRewardAmount(1) //獎勵的數量
.setUserID("")//用戶id,必傳參數
.setOrientation(orientation) //必填參數,期望視頻的播放方向:TTAdConstant.HORIZONTAL 或 TTAdConstant.VERTICAL
.build();
//step5:請求廣告
mTTAdNative.loadRewardVideoAd(adSlot, new TTAdNative.RewardVideoAdListener() {
@Override
public void onError(int code, String message) {
Log.e(TAG, message);
}
//視頻廣告加載後,視頻資源緩存到本地的回調,在此回調後,播放本地視頻,流暢不阻塞。
@Override
public void onRewardVideoCached() {
Log.e(TAG, "rewardVideoAd video cached");
}
//視頻廣告的素材加載完畢,比如視頻url等,在此回調後,可以播放在線視頻,網絡不好可能出現加載緩衝,影響體驗。
@Override
public void onRewardVideoAdLoad(TTRewardVideoAd ad) {
Log.e(TAG, "rewardVideoAd loaded");
mttRewardVideoAd = ad;
mttRewardVideoAd.setRewardAdInteractionListener(new TTRewardVideoAd.RewardAdInteractionListener() {
@Override
public void onAdShow() {
Log.e(TAG, "rewardVideoAd show");
}
@Override
public void onAdVideoBarClick() {
Log.e(TAG, "rewardVideoAd bar click");
}
@Override
public void onAdClose() {
Log.e(TAG, "rewardVideoAd close");
//關閉後再次加載廣告
loadAd(codeId, TTAdConstant.VERTICAL);
}
//視頻播放完成回調
@Override
public void onVideoComplete() {
Log.e(TAG,"rewardVideoAd complete");
}
@Override
public void onVideoError() {
Log.e(TAG,"rewardVideoAd error");
}
//視頻播放完成後,獎勵驗證回調,rewardVerify:是否有效,rewardAmount:獎勵梳理,rewardName:獎勵名稱
@Override
public void onRewardVerify(boolean rewardVerify, int rewardAmount, String rewardName) {
Log.e(TAG,"rewardVideoAd rewardVerify");
sendReward();
}
@Override
public void onSkippedVideo() {
}
});
}
});
}