CocosCreator | Android 安卓平臺 集成穿山甲廣告SDK 激勵視頻 開屏廣告 banner 信息流等(ts和java互調注意事項)

更多筆記和源碼請關注:【微信公衆號】 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() {                    }                });            }        });    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章