AndroidStudio小白,本文纯用来记录
我使用的AndroidStudio的版本是:AndroidStudio 3.1.3,具体的环境配置,我也没怎么去弄。
遇到代码报错就按:Alt + Enter 看看能不解决 。
然后点击Run下面的小锤子,看看Build是否报错,有报错就百度
Unity接入SDK就我知道的有两种:我用第二种
1.将unity在安卓平台选择Gradle打包出来,然后在放在AndroidStudio中一顿眼花缭乱的操作。
2.将unity的class.jar包以及将穿山甲SDK压缩包内的open_ad_sdk.aar及android-query-full.0.26.7.jar,导入AndroidStudio中的新建的Library中,然后在导出来放到unity中去调用。
1.Project模式:下在左上角File->New->New Module->Android Library,新建一个Library..........名字叫MyLibrary
2.将unity的class.jar、open_ad_sdk.aar、android-query-full.0.26.7.jar包复制到MyLibrary的libs中。
3.然后选中两个jar后缀的右键他们,找到AddLibrary,编译一下。至于arr包,需要找到你这个Library下的build.gradle,然后在dependencies加入字段implementation(name: 'open_ad_sdk', ext: 'aar')。下面是我的全部引用,主要是有注释那个
apply plugin: 'com.android.library'
android {
compileSdkVersion 28
defaultConfig {
minSdkVersion 16
targetSdkVersion 28
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
//按穿山甲开发文档加入他
repositories {
flatDir {
dirs 'libs'
}
}
dependencies {
implementation fileTree(include: ['*.jar'], dir: 'libs')
implementation 'com.android.support:appcompat-v7:28.0.0'
implementation 'com.android.support.constraint:constraint-layout:1.1.3'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
implementation files('libs/classes.jar')
implementation files('libs/android-query-full.0.26.7.jar')
//arr包的导入方式
implementation(name: 'open_ad_sdk', ext: 'aar')
implementation 'pl.droidsonroids.gif:android-gif-drawable:1.2.6'
}
根据穿山甲的文档,在需要在dependencies的上面加入:
repositories {
flatDir {
dirs 'libs'
}
}
4.将模式切换为Android,然后和你的Library名字一样的文件,然后在下面的java文件下的第一个文件中,新建两个Activity。然后根据你的需要去写Java代码.....................
我这里只要激励广告所以只接入激励广告的:
初始化类:
package com.huowu.toutiaosdk2;
import android.content.Context;
import com.bytedance.sdk.openadsdk.TTAdConfig;
import com.bytedance.sdk.openadsdk.TTAdConstant;
import com.bytedance.sdk.openadsdk.TTAdManager;
import com.bytedance.sdk.openadsdk.TTAdSdk;
/**
* 可以用一个单例来保存TTAdManager实例,在需要初始化sdk的时候调用
*/
public class TTAdManagerHolder {
private static boolean sInit;
public static TTAdManager get() {
if (!sInit) {
throw new RuntimeException("TTAdSdk is not init, please check.");
}
return TTAdSdk.getAdManager();
}
//初始化时需要传入UserId,在Unity中调用
public static void init(Context context, String userId)
{
doInit(context, userId);
}
//step1:接入网盟广告sdk的初始化操作,详情见接入文档和穿山甲平台说明
private static void doInit(Context context, String userId) {
if (!sInit) {
TTAdSdk.init(context, buildConfig(context, userId));
sInit = true;
}
}
private static TTAdConfig buildConfig(Context context, String userId) {
return new TTAdConfig.Builder()
.appId(userId)
.useTextureView(true) //使用TextureView控件播放视频,默认为SurfaceView,当有SurfaceView冲突的场景,可以使用TextureView
.appName("APP测试媒体")
.titleBarTheme(TTAdConstant.TITLE_BAR_THEME_DARK)
.allowShowNotify(true) //是否允许sdk展示通知栏提示
.allowShowPageWhenScreenLock(true) //是否在锁屏场景支持展示广告落地页
.debug(true) //测试阶段打开,可以通过日志排查问题,上线时去除该调用
.directDownloadNetworkType(TTAdConstant.NETWORK_STATE_WIFI, TTAdConstant.NETWORK_STATE_3G) //允许直接下载的网络状态集合
.supportMultiProcess(false)
.build();
}
}
继承Unity的方法类
package com.huowu.toutiaosdk2;
import android.content.Context;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import com.bytedance.sdk.openadsdk.AdSlot;
import com.bytedance.sdk.openadsdk.TTAdManager;
import com.bytedance.sdk.openadsdk.TTAdNative;
import com.bytedance.sdk.openadsdk.TTAppDownloadListener;
import com.bytedance.sdk.openadsdk.TTRewardVideoAd;
import com.unity3d.player.UnityPlayerActivity;
public class MainActivity extends UnityPlayerActivity {
private TTAdNative mTTAdNative;
private TTRewardVideoAd mttRewardVideoAd;
private int ErrorCode = -1;
private String ErrorMessage = "Ranner";
private Context mContext;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
//初始化广告SDK接口
public void Init(Context context)
{
mContext = context;
//step1:初始化sdk
TTAdManager ttAdManager = TTAdManagerHolder.get();
//step2:(可选,强烈建议在合适的时机调用):申请部分权限,如read_phone_state,防止获取不了imei时候,下载类广告没有填充的问题。
TTAdManagerHolder.get().requestPermissionIfNecessary(mContext);
//step3:创建TTAdNative对象,用于调用广告请求接口
mTTAdNative = ttAdManager.createAdNative(mContext.getApplicationContext());
}
//得到当前的返回码
public int GetErrorCode()
{
return ErrorCode;
}
//得到当前的返错误信息
public String GetErrorMessage()
{
return ErrorMessage;
}
//加载广告
public void LoadAD(String adscodeId, String rewarName, String userID, int rewardNumber, int type)
{
loadAd(adscodeId, rewarName, userID, rewardNumber, type);
}
//播放广告
public void PlayVedio()
{
runOnUiThread(new Runnable() {
@Override
public void run() {
if (mttRewardVideoAd != null)
{
//step6:在获取到广告后展示
ErrorCode = 1;
ErrorMessage = "视频缓存成功";
mttRewardVideoAd.showRewardVideoAd(MainActivity.this);
//TToast(MainActivity.this,"显示调用完成");
mttRewardVideoAd = null;
}
else
{
//TToast(MainActivity.this,"请先加载广告");
ErrorCode = 0;
ErrorMessage = "加载广告失败";
}
}
});
}
private boolean mHasShowDownloadActive = false;
//加载广告
private void loadAd(String adscodeId, String rewarName, String userID, int rewardNumber, int type) {
//step4:创建广告请求参数AdSlot,具体参数含义参考文档
AdSlot adSlot = new AdSlot.Builder()
.setCodeId(adscodeId) //广告ID
.setSupportDeepLink(true)
.setImageAcceptedSize(1080, 1920)
.setRewardName(rewarName) //奖励的名称
.setRewardAmount(rewardNumber) //奖励的数量
.setUserID(userID)//用户id,必传参数
.setMediaExtra("media_extra") //附加参数,可选
.setOrientation(type) //必填参数,期望视频的播放方向:TTAdConstant.HORIZONTAL 或 TTAdConstant.VERTICAL
.build();
//step5:请求广告
mTTAdNative.loadRewardVideoAd(adSlot, new TTAdNative.RewardVideoAdListener() {
@Override
public void onError(int code, String message)
{
//广告加载错误
ErrorCode = 0;
ErrorMessage = message;
}
//视频广告加载后,视频资源缓存到本地的回调,在此回调后,播放本地视频,流畅不阻塞。
@Override
public void onRewardVideoCached()
{
//广告加载成功
ErrorCode = 1;
ErrorMessage = "视频缓存成功";
}
//视频广告的素材加载完毕,比如视频url等,在此回调后,可以播放在线视频,网络不好可能出现加载缓冲,影响体验。
@Override
public void onRewardVideoAdLoad(TTRewardVideoAd ad)
{
mttRewardVideoAd = ad;
// mttRewardVideoAd.setShowDownLoadBar(false);
mttRewardVideoAd.setRewardAdInteractionListener(new TTRewardVideoAd.RewardAdInteractionListener()
{
@Override
public void onAdShow()
{
ErrorCode = 2;
ErrorMessage = "视频在播放";
}
@Override
public void onAdVideoBarClick() {
ErrorCode = 3;
ErrorMessage = "视频被点击";
}
@Override
public void onAdClose()
{
ErrorCode = 4;
ErrorMessage = "视频被关闭";
}
//视频播放完成回调
@Override
public void onVideoComplete()
{
ErrorCode = 5;
ErrorMessage = "视频播放完毕";
}
@Override
public void onVideoError()
{
ErrorCode = 6;
ErrorMessage = "视频播放出现错误";
}
//视频播放完成后,奖励验证回调,rewardVerify:是否有效,rewardAmount:奖励梳理,rewardName:奖励名称
@Override
public void onRewardVerify(boolean rewardVerify, int rewardAmount, String rewardName)
{
ErrorCode = 7;
ErrorMessage = "视频看完,可发放奖励";
}
});
mttRewardVideoAd.setDownloadListener(new TTAppDownloadListener() {
@Override
public void onIdle() {
mHasShowDownloadActive = false;
}
@Override
public void onDownloadActive(long totalBytes, long currBytes, String fileName, String appName) {
if (!mHasShowDownloadActive) {
mHasShowDownloadActive = true;
//TToast(MainActivity.this, "下载中,点击下载区域暂停");
}
}
@Override
public void onDownloadPaused(long totalBytes, long currBytes, String fileName, String appName) {
//TToast(MainActivity.this, "下载暂停,点击下载区域继续");
}
@Override
public void onDownloadFailed(long totalBytes, long currBytes, String fileName, String appName) {
//TToast(MainActivity.this, "下载失败,点击下载区域重新下载");
}
@Override
public void onDownloadFinished(long totalBytes, String fileName, String appName) {
//TToast(MainActivity.this, "下载完成,点击下载区域重新下载");
}
@Override
public void onInstalled(String fileName, String appName) {
//TToast(MainActivity.this, "安装完成,点击下载区域打开");
}
});
}
});
}
}
5.写完之后,切换到Project模式,选中你的Library,然后在工具栏,找到Build,点击它,选中第二个“Make Module.... ”。如果不报错,一切顺利,完了之后。找到在你的Library文件下/build/outputs/arr/xxxx-debug.aar。这个xxxx-debug.aar就是需要的包。右键-Show in Eplorer。
6.保险起见,你可以复制一份出来,然后打开压缩包,删掉里面的 layout文件夹、libs/class.jar、res/layout......修改AndroidManifest.xml。
修改完成后,将包导入unity中的Unity/Plugins/Android/
对了:open_ad_sdk.aar 这个包也要放到Unity/Plugins/Android/中去
这是我修改的:AndroidManifest.xml
在场景中新建一个GameObject,挂上下面的脚本:
这是相当于初始化组件,用来初始化穿山甲SDK,以及安卓中的一些方法
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Hotfix;
public class TouTiaoAdsManager : MonoBehaviour {
public static TouTiaoAdsManager Inst;
private string appId = "你的appId ,可以用他Demo里面的";
private string adsId = "你的adsID,可以用他Demo里面的";
private AndroidJavaClass UnityJc;
private AndroidJavaObject UnityJo;
public string EorrMessage { get; set; }
///
/// 头条初始化组件
///
private AndroidJavaClass ToutiaoJc;
private void Awake()
{
Inst = this;
this.UnityJc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
this.UnityJo = this.UnityJc.GetStatic("currentActivity");
this.ToutiaoJc = new AndroidJavaClass("com.huowu.toutiaosdk2.TTAdManagerHolder");
this.InitToutiaoSdk();
this.InitToutiaoAds();
}
///
/// 初始化头条SDK
///
public void InitToutiaoSdk()
{
this.ToutiaoJc.CallStatic(TouTiaoMethd.TTAdManagerInit, this.UnityJo, this.appId);
}
///
/// 初始化头条广告
///
public void InitToutiaoAds()
{
this.UnityJo.Call(TouTiaoMethd.RewardVideoInit, this.UnityJo);
}
///
/// 加载头条广告
///
public void LoadToutiaoAds()
{
this.UnityJo.Call(TouTiaoMethd.LoadRewardVideo, this.adsId, "广告时间减少", this.appId, 20, 2);
}
///
/// 播放头条广告
///
public void PlayToutiaoAds()
{
this.UnityJo.Call(TouTiaoMethd.ShowRewardVidwo);
}
///
/// 返回错误码
///
///
public int GetToutiaoErrorCode()
{
return this.UnityJo.Call(TouTiaoMethd.GetErrorCode);
}
///
/// 返回错误信息
///
///
public string GetToutiaoErrorMessage()
{
EorrMessage = this.UnityJo.Call(TouTiaoMethd.GetErrorMessage);
return EorrMessage;
}
}
这是测试脚本
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using Hotfix;
using System;
public class MainTest : MonoBehaviour {
private Button loadBtn;
private Button playBtn;
public Text textMessage;
private bool isLoop = false;
private int State = -1;
private Action CanGetReward;
void Start () {
this.loadBtn = transform.Find("LoadBtn").GetComponent
我把安卓中的方法名,用一个类给保存了起来:
using System;
namespace Hotfix
{
///
/// Ranner: 头条方法名封装,用于调用Java中的方法
///
public class TouTiaoMethd
{
///
/// 头条初始化方法, 需要传入Context, userID
///
public const string TTAdManagerInit = "init";
///
/// 头条广告初始化方法, 需要传入Context
///
public const string RewardVideoInit = "Init";
///
/// 头条广告加载方法, 需要传入入广告ID
///
public const string LoadRewardVideo = "LoadAD";
///
/// 头条广告播放方法, 需要传入 Activity
///
public const string ShowRewardVidwo = "PlayVedio";
///
/// 得到当前的返回码
///
public const string GetErrorCode = "GetErrorCode";
///
/// 得到当前的返错误信息
///
public const string GetErrorMessage = "GetErrorMessage";
}
///
/// 头条返回的错误码信息
///
public class ToutiaoErrorCode
{
///
/// 广告加载错误
///
public const int Faile = 0;
///
/// 广告加载成功
///
public const int Succes = 1;
///
/// 视频在播放
///
public const int Playing = 2;
///
/// 视频被点击
///
public const int BeTouck = 3;
///
/// 视频被关闭
///
public const int BeClose = 4;
///
/// 视频播放完毕
///
public const int PlayOver = 5;
///
/// 视频播放出现错误
///
public const int PlayFaile = 6;
///
/// 视频看完,可发放奖励
///
public const int CanGiveReward = 6;
}
}
1.Unity/Plugins/Android/AndroidManifest.xml
不知道你们是怎样的,我的是这样的:
2.迎接你的可能是各种稀奇古怪的报错,如果一切顺利,那就去测测看吧。