Android 接入穿山甲广告
下载SDK
首先去穿山甲官网注册账号以及创建应用点此进入官网
点击进入平台 (我的是创建完账号并且登录之后是这个样子)
进来之后是如下界面
然后依次点击流量--->应用会进入到以下界面
然后点击创建应用根据提示走即可
创建完毕之后去依次点击流量-->代码位创建广告位 根据自己的需求去创建即可
最后点击接入选择SDK下载与文档选择Android平台SDK
下载完成之后开始配置项目 按照文档把环境配好 然后开始写代码
配置完成之后创建一个SDK初始化脚本内容如下 初始化调用是在开屏界面调用 调用初始化成功之后会自动调用开屏代码
package com.unity3d.player.chuanshanjia;import android.content.Context;
import android.util.Log;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 final String TAG = "TTAdManagerHolder";private static boolean sInit;private static String appid;private static String appName;private static TTAdManagerHolder _Instance;public static TTAdManager get() {return TTAdSdk.getAdManager();}public static TTAdManagerHolder Inst(){if (_Instance == null){_Instance = new TTAdManagerHolder();}return _Instance;}public void init(final Context context,String aid,String aname) {appid = aid;appName = aname;Log.d(TAG, "TTAdManagerHolderinit aid:"+aid+" aname:"+aname);doInit(context);}//step1:接入网盟广告sdk的初始化操作,详情见接入文档和穿山甲平台说明private void doInit(Context context) {if (!sInit) {TTAdSdk.init(context, buildConfig(context), new TTAdSdk.InitCallback() {@Overridepublic void success() {Log.i(TAG, "success: " );CsjSplashActivity.Inst().loadSplashAd();}@Overridepublic void fail(int code, String msg) {Log.i(TAG, "fail: code = " + code + " msg = " + msg);}});sInit = true;}}private TTAdConfig buildConfig(Context context) {//强烈建议在应用对应的Application#onCreate()方法中调用,避免出现content为null的异常return new TTAdConfig.Builder().appId(appid).useTextureView(true) //默认使用SurfaceView播放视频广告,当有SurfaceView冲突的场景,可以使用TextureView.appName(appName).titleBarTheme(TTAdConstant.TITLE_BAR_THEME_DARK)//落地页主题.allowShowNotify(true) //是否允许sdk展示通知栏提示,若设置为false则会导致通知栏不显示下载进度.debug(true) //测试阶段打开,可以通过日志排查问题,上线时去除该调用.directDownloadNetworkType(TTAdConstant.NETWORK_STATE_WIFI) //允许直接下载的网络状态集合,没有设置的网络下点击下载apk会有二次确认弹窗,弹窗中会披露应用信息.supportMultiProcess(false) //是否支持多进程,true支持.asyncInit(true) //是否异步初始化sdk,设置为true可以减少SDK初始化耗时。3450版本开始废弃~~//.httpStack(new MyOkStack3())//自定义网络库,demo中给出了okhttp3版本的样例,其余请自行开发或者咨询工作人员。.build();}
}
SDK集成完成之后开始接入SDK
工具类
ChuanShanJiaUtil
package com.unity3d.player.tools;import android.app.Activity;
import android.content.Context;
import android.os.Build;
import android.text.TextUtils;
import android.util.DisplayMetrics;
import android.view.Display;
import android.view.DisplayCutout;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewParent;
import android.view.WindowInsets;
import android.view.WindowManager;
import android.widget.FrameLayout;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;public class ChuanShanJiaUtil {public static float getScreenWidthDp(Context context){final float scale = context.getResources().getDisplayMetrics().density;float width = context.getResources().getDisplayMetrics().widthPixels;return width / (scale <= 0 ? 1 : scale) + 0.5f;}//全面屏、刘海屏适配public static float getHeight(Activity activity) {hideBottomUIMenu(activity);float height;int realHeight = getRealHeight(activity);if (ChuanShanJiaUtil.hasNotchScreen(activity)) {height = px2dip(activity, realHeight - getStatusBarHeight(activity));}else {height = px2dip(activity, realHeight);}return height;}public static void hideBottomUIMenu(Activity activity) {if (activity == null) {return;}try {//隐藏虚拟按键,并且全屏if (Build.VERSION.SDK_INT > 11 && Build.VERSION.SDK_INT < 19) { // lower apiView v = activity.getWindow().getDecorView();v.setSystemUiVisibility(View.GONE);} else if (Build.VERSION.SDK_INT >= 19) {//for new api versions.View decorView = activity.getWindow().getDecorView();int uiOptions = View.SYSTEM_UI_FLAG_LAYOUT_STABLE| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION // hide nav bar// | View.SYSTEM_UI_FLAG_FULLSCREEN // hide status bar| View.SYSTEM_UI_FLAG_IMMERSIVE;decorView.setSystemUiVisibility(uiOptions);activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);}} catch (Exception e) {e.printStackTrace();}}//获取屏幕真实高度,不包含下方虚拟导航栏public static int getRealHeight(Context context) {WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);Display display = windowManager.getDefaultDisplay();DisplayMetrics dm = new DisplayMetrics();if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {display.getRealMetrics(dm);} else {display.getMetrics(dm);}int realHeight = dm.heightPixels;return realHeight;}//获取状态栏高度public static float getStatusBarHeight(Context context) {float height = 0;int resourceId = context.getApplicationContext().getResources().getIdentifier("status_bar_height", "dimen", "android");if (resourceId > 0) {height = context.getApplicationContext().getResources().getDimensionPixelSize(resourceId);}return height;}public static int px2dip(Context context, float pxValue) {final float scale = context.getResources().getDisplayMetrics().density;return (int) (pxValue / (scale <= 0 ? 1 : scale) + 0.5f);}public static int dp2px(Context context, float dp) {final float scale = context.getResources().getDisplayMetrics().density;return (int) (dp * scale + 0.5f);}/*** 判断是否是刘海屏* @return*/public static boolean hasNotchScreen(Activity activity){return isAndroidPHasNotch(activity)|| getInt("ro.miui.notch", activity) == 1|| hasNotchAtHuawei(activity)|| hasNotchAtOPPO(activity)|| hasNotchAtVivo(activity);}/*** Android P 刘海屏判断* @param activity* @return*/public static boolean isAndroidPHasNotch(Activity activity){boolean result = false;if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {DisplayCutout displayCutout = null;try {WindowInsets windowInsets = activity.getWindow().getDecorView().getRootWindowInsets();if (windowInsets != null) {displayCutout = windowInsets.getDisplayCutout();}if (displayCutout != null) {result = true;}} catch (Exception e) {e.printStackTrace();}}return result;}/*** 小米刘海屏判断.* @return 0 if it is not notch ; return 1 means notch* @throws IllegalArgumentException if the key exceeds 32 characters*/public static int getInt(String key,Activity activity) {int result = 0;if (isMiui()){try {ClassLoader classLoader = activity.getClassLoader();@SuppressWarnings("rawtypes")Class SystemProperties = classLoader.loadClass("android.os.SystemProperties");//参数类型@SuppressWarnings("rawtypes")Class[] paramTypes = new Class[2];paramTypes[0] = String.class;paramTypes[1] = int.class;Method getInt = SystemProperties.getMethod("getInt", paramTypes);//参数Object[] params = new Object[2];params[0] = new String(key);params[1] = new Integer(0);result = (Integer) getInt.invoke(SystemProperties, params);} catch (ClassNotFoundException e) {e.printStackTrace();} catch (NoSuchMethodException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();} catch (IllegalArgumentException e) {e.printStackTrace();} catch (InvocationTargetException e) {e.printStackTrace();}}return result;}/*** 华为刘海屏判断* @return*/public static boolean hasNotchAtHuawei(Context context) {boolean ret = false;try {ClassLoader classLoader = context.getClassLoader();Class HwNotchSizeUtil = classLoader.loadClass("com.huawei.android.util.HwNotchSizeUtil");Method get = HwNotchSizeUtil.getMethod("hasNotchInScreen");ret = (boolean) get.invoke(HwNotchSizeUtil);} catch (ClassNotFoundException e) {} catch (NoSuchMethodException e) {} catch (Exception e) {} finally {return ret;}}public static final int VIVO_NOTCH = 0x00000020;//是否有刘海public static final int VIVO_FILLET = 0x00000008;//是否有圆角/*** VIVO刘海屏判断* @return*/public static boolean hasNotchAtVivo(Context context) {boolean ret = false;try {ClassLoader classLoader = context.getClassLoader();Class FtFeature = classLoader.loadClass("android.util.FtFeature");Method method = FtFeature.getMethod("isFeatureSupport", int.class);ret = (boolean) method.invoke(FtFeature, VIVO_NOTCH);} catch (ClassNotFoundException e) {} catch (NoSuchMethodException e) {} catch (Exception e) {} finally {return ret;}}/*** O-P-P-O刘海屏判断* @return*/public static boolean hasNotchAtOPPO(Context context) {String temp = "com.kllk.feature.screen.heteromorphism";String name = getKllkDecryptString(temp);return context.getPackageManager().hasSystemFeature(name);}public static boolean isMiui() {boolean sIsMiui = false;try {Class<?> clz = Class.forName("miui.os.Build");if (clz != null) {sIsMiui = true;//noinspection ConstantConditionsreturn sIsMiui;}} catch (Exception e) {// ignore}return sIsMiui;}/***用于o-p-p-o 版本隐私协议*/public static String getKllkDecryptString(String encryptionString) {if (TextUtils.isEmpty(encryptionString)) {return "";}String decryptTag = "";String decryptCapitalized = "O" + "P" + "P" + "O";String decrypt = "o" + "p" + "p" + "o";if (encryptionString.contains("KLLK")) {decryptTag = encryptionString.replace("KLLK", decryptCapitalized);} else if (encryptionString.contains("kllk")) {decryptTag = encryptionString.replace("kllk", decrypt);}return decryptTag;}public static void setViewSize(View view, int width, int height) {if (view.getParent() instanceof FrameLayout) {FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams) view.getLayoutParams();lp.width = width;lp.height = height;view.setLayoutParams(lp);view.requestLayout();} else if (view.getParent() instanceof RelativeLayout) {RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams) view.getLayoutParams();lp.width = width;lp.height = height;view.setLayoutParams(lp);view.requestLayout();} else if (view.getParent() instanceof LinearLayout) {LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) view.getLayoutParams();lp.width = width;lp.height = height;view.setLayoutParams(lp);view.requestLayout();}}public static int getScreenWidthInPx(Context context) {DisplayMetrics dm = context.getApplicationContext().getResources().getDisplayMetrics();return dm.widthPixels;}public static int getScreenHeightInPx(Context context) {DisplayMetrics dm = context.getApplicationContext().getResources().getDisplayMetrics();return dm.heightPixels;}public static int getScreenHeight(Context context) {return (int) (getScreenHeightInPx(context) + getStatusBarHeight(context));}public static void removeFromParent(View view) {if (view != null) {ViewParent vp = view.getParent();if (vp instanceof ViewGroup) {((ViewGroup) vp).removeView(view);}}}/*** 获取全面屏宽高* @param context* @return*/public static int[] getScreenSize(Context context) {int[] size = new int[]{0,0};if (context == null){return size;}WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);Display display = windowManager.getDefaultDisplay();DisplayMetrics dm = new DisplayMetrics();if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {display.getRealMetrics(dm);} else {display.getMetrics(dm);}size[0] = dm.widthPixels;size[1] = dm.heightPixels;return size;}
}
ShowSeqUtils
package com.unity3d.player.tools;import android.os.Environment;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.text.SimpleDateFormat;
import java.util.Date;public class ShowSeqUtils {private FileReader fr;private BufferedReader br;private FileWriter fw;private BufferedWriter bw;public int loadShowSeq(){int show_seq = 1;//获取当前日期字符串SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");String data = sdf.format(new Date());//读取本地缓存show_seq的文件try {String rootPath = Environment.getExternalStorageDirectory().getPath();File file = new File(rootPath + "/Android/data/com.snssdk.api/cache/adloadSeqTemp.txt");if (!file.exists()) {file.createNewFile();return show_seq;}fr = new FileReader(file);br = new BufferedReader(fr);String line = "";while ((line = br.readLine()) != null) {String[] temp = line.split(",");if (temp[0].equals(data)){//日期相同返回字段show_seq = Integer.parseInt(temp[1]);}}return show_seq;} catch (Exception e) {e.printStackTrace();} finally {try {if(fr!=null){fr.close();}if(br!=null){br.close();}} catch (Exception e) {e.printStackTrace();}}return show_seq;}public void writeToFile(int show_seq){//获取当前日期字符串SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");String data = sdf.format(new Date());String content = data+","+show_seq;//读取本地缓存show_seq的文件try {String rootPath = Environment.getExternalStorageDirectory().getPath();File file = new File(rootPath + "/Android/data/com.snssdk.api/cache/");if (!file.exists()) {file.mkdir();}String filename = file.getAbsolutePath()+"/adloadSeqTemp.txt";file = new File(filename);if(!file.exists()){file.createNewFile();}fw = new FileWriter(file, false);fw.write(content);} catch (Exception e) {e.printStackTrace();} finally {try {if(fw!=null){fw.flush();fw.close();}} catch (Exception e) {e.printStackTrace();}}}
}
TToast
package com.unity3d.player.tools;import android.annotation.SuppressLint;
import android.content.Context;
import android.util.Log;
import android.widget.Toast;public final class TToast {private static Toast sToast;public static void show(Context context, String msg) {show(context, msg, Toast.LENGTH_SHORT);}public static void show(Context context, String msg, int duration) {Toast toast = getToast(context);if (toast != null) {toast.setDuration(duration);toast.setText(String.valueOf(msg));toast.show();} else {Log.i("TToast", "toast msg: " + String.valueOf(msg));}}@SuppressLint("ShowToast")private static Toast getToast(Context context) {if (context == null) {return sToast;}
// if (sToast == null) {
// synchronized (TToast.class) {
// if (sToast == null) {sToast = Toast.makeText(context.getApplicationContext(), "", Toast.LENGTH_SHORT);
// }
// }
// }return sToast;}public static void reset() {sToast = null;}
}
下一篇 接入开屏广告 传送门
Android 接入穿山甲广告相关推荐
- Unity接入穿山甲广告(使用Unity3D插件)
最近要接入穿山甲广告,我把穿山甲广告相关的接入流程记录一下,说说最近踩过的坑,和怎么解决的问题.注意我们需求是只发安卓包没有iOS的需求,本篇只介绍Unity接入安卓相关的处理(帖子是2019年底 ...
- Unity接入穿山甲广告SDK(以及GroMoreDemo)
Unity接入穿山甲广告SDK(以及GroMoreDemo) 下载安装 穿山甲官网SDK下载链接(https://www.csjplatform.com/union/media/union/downl ...
- 无需上架,接入穿山甲广告和广点通广告 sdk
我们都知道广告是商业流量变现最重要的方式之一,所以基本所有的游戏或者app都会接入广告sdk,而我们都知道穿山甲广告sdk和广点通广告sdk是国内收益相对比较高的,但是想接入穿山甲广告sdk,你的游戏 ...
- CocosCreator接入穿山甲广告(IOS)
说明 接入穿山甲广告SDK 将Cocos Creator工程打包,在手机上运行,看能否正常运行游戏,保证游戏没有问题的前提下再引入SDK所需要的各种包 根据文档引入各种包,文档地址:https://p ...
- Android 接入穿山甲激励视频广告步骤与错误总结
1.先去穿山甲官网,注册登录账号 2.侧边栏->广告变现->流量->应用->新建应用 3.侧边栏->广告变现->流量->代码位->新建代码位 4. 侧边 ...
- Android接入穿山甲SDK并实现开屏广告
一.穿山甲SDK的接入 0.进入官方下载地址,下载穿山甲AndroidSDK,下载的压缩包里包含.aar的sdk文件和工程demo. 1.将 SDK 压缩包内的 open_ad_sdk.aar 复制到 ...
- Android 如何接入穿山甲广告?
目录 下载SDK 集成SDK AndroidManifest配置 provider配置 运行环境配置 白名单配置 工具类 下载SDK 首先去穿山甲官网注册账号以及创建应用 点击进入平台 (我的是创建完 ...
- CocosCreator接入穿山甲广告1-激励视频
首先进入文档后要先去下载它文档里的sdk,这个压缩包里面含有demo,没有头绪的朋友可以进入他的工程看下,也可在模拟器上运行一下它的demo看下效果.下载完后可以进入他工程下的libs的文件夹里把两个 ...
- CocosCreator接入穿山甲广告总结
最近项目开始接入国内广告变现,接的是穿山甲sdk广告,接入的过程真的是各种坎坷,我会分为激励视频,插屏广告,底部banner三部分,在后续的文章中会一点点详细的把这三部分都总结出来,给有恰好需要的朋友 ...
- Android接入谷歌广告 - 发现各种坑
先前接入谷歌广告Admob,功能完成后AS能运行,打包哩不行一直报 com.android.build.api.transform.TransformException: java.util.zip. ...
最新文章
- 浅析Python中bytes和str区别
- win2008server设置问题
- R语言学习笔记(十一):广义线性模型
- apache服务器配置tls_Apache服务器配置https
- 他是世界首位惯性导航博士!如今101岁,依然对航天事业激情澎湃
- Linux利用PROMPT_COMMAND实现审计功能
- linux 系统盘无法ls,linux – ls:阅读目录.:输入/输出错误
- Java爬坑 -- 解决redis序列化java8 LocalDateTime错误的问题
- Linux下安装配置git
- 【零基础】PostgreSQL从入门到精通
- Stochastic Pooling简单理解
- 一个开源的会议管理系统,适合初学者练手(老司机请忽略)
- 中图分类号,文献标识码,文章编号
- android照片批量上传照片,一键批量上传手机照片到QQ相册功能 节省手机流量
- 七夕前夜,地球和月亮搭起“鹊桥”
- React 360 全景VR交互项目实战
- 在这领工资,一辈子别想取媳妇了!
- Excel如何统计大于某值小于某值的数量
- Error querying database. Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You hav
- 三星4k3d电视测试软件,说出来你可能不信:3D、4K、曲面电视慎重购买
热门文章
- 第24篇 研究WebRTC官网之生成工程文件
- 基于SpringBoot的在线学生请假管理系统的设计与实现毕业设计源码
- 利用云计算来实现业务转型呢,有五个步骤可以遵循
- 概率论的学习和整理--番外4:学习期望之前,先学习平均数(包括算术平均数,几何平均数,调和平均数等),众数,中位数等概念差别。
- MPU6050 加速计滤波
- 调整csgo画面显示FPS值
- html需要背的标签,html的header标签需要怎么使用
- CPU的后缀到底是什么意思?
- 如何用python打开qq_如何用python登录qq
- java 图形检测_使用OpenCV[Java]检测简单几何图形