理想技术网 - 广告 2024-09-15T12:34:00+08:00 Typecho https://im1.cc/feed/atom/tag/%E5%B9%BF%E5%91%8A/ <![CDATA[JAVA 怎么安卓接入穿山甲广告?]]> https://im1.cc/Front/263.html 2024-09-15T12:34:00+08:00 2024-09-15T12:34:00+08:00 admin https://www.im1.cc

为什么突然写JAVA教程了?

 title=

如图所示,星宿小程序作者突然来信!

在安卓项目中接入穿山甲广告平台(Pangle Ads,之前叫穿山甲广告),你可以通过官方SDK来实现。以下是接入穿山甲广告的一般步骤,基于Java语言。

步骤1:注册并获取App ID和广告位ID

  1. 访问Pangle Ads官网,注册开发者账号。
  2. 创建应用并获取App ID。
  3. 创建广告位并获取广告位ID(如激励视频广告、插屏广告、Banner广告等)。

步骤2:集成穿山甲SDK

1. 在项目中添加依赖
修改项目的build.gradle文件。
在项目级的build.gradle中,添加Pangle SDK的maven仓库:

allprojects {
    repositories {
        google()
        jcenter()
        maven {
            url 'https://artifact.bytedance.com/repository/pangle'
        }
    }
}

在应用级的build.gradle中,添加Pangle SDK依赖项(以穿山甲广告的激励视频为例):

dependencies {
    implementation 'com.bytedance.sdk:pangle:4.0.0.6'  // SDK的版本号可能会更新,请参考官网
}

2. 配置权限
在AndroidManifest.xml中添加必要的权限和配置:

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>

<application
    ...>
    <!-- Pangle SDK初始化 -->
    <meta-data
        android:name="com.bytedance.sdk.openadsdk.APP_ID"
        android:value="你的App ID"/> <!-- 替换成你的App ID -->

    <!-- 网络安全配置 -->
    <meta-data
        android:name="com.bytedance.sdk.openadsdk.network_security_config"
        android:value="@xml/network_security_config"/>
</application>

步骤3:初始化穿山甲SDK
在你的Application类中初始化穿山甲SDK:

import com.bytedance.sdk.openadsdk.TTAdConfig;
import com.bytedance.sdk.openadsdk.TTAdSdk;

public class MyApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();

        TTAdSdk.init(this, new TTAdConfig.Builder()
                .appId("你的App ID") // 替换成你的App ID
                .useTextureView(true)
                .appName("你的应用名称")
                .titleBarTheme(TTAdConstant.TITLE_BAR_THEME_LIGHT)
                .allowShowNotify(true)
                .debug(true)  // Debug模式下会输出日志
                .build());
    }
}

步骤4:加载和展示广告

  1. 激励视频广告示例
    在合适的地方加载并展示激励视频广告:
import com.bytedance.sdk.openadsdk.TTAdNative;
import com.bytedance.sdk.openadsdk.TTAdSdk;
import com.bytedance.sdk.openadsdk.TTRewardVideoAd;
import com.bytedance.sdk.openadsdk.AdSlot;

public class MainActivity extends AppCompatActivity {
    private TTAdNative mTTAdNative;
    private TTRewardVideoAd mTTRewardVideoAd;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 创建TTAdNative对象,用于加载广告
        mTTAdNative = TTAdSdk.getAdManager().createAdNative(this);

        // 加载激励视频广告
        loadRewardVideoAd("你的广告位ID");  // 替换成你的广告位ID
    }

    private void loadRewardVideoAd(String adId) {
        // 创建广告参数
        AdSlot adSlot = new AdSlot.Builder()
                .setCodeId(adId)
                .setSupportDeepLink(true)
                .setExpressViewAcceptedSize(500, 500)  // 单位是dp
                .setUserID("user123") // 用户ID, 用于广告效果归因
                .setMediaExtra("media_extra") // 附加参数,可以传递给服务器
                .build();

        // 加载广告
        mTTAdNative.loadRewardVideoAd(adSlot, new TTAdNative.RewardVideoAdListener() {
            @Override
            public void onError(int code, String message) {
                Log.e("广告加载失败", "code: " + code + ", message: " + message);
            }

            @Override
            public void onRewardVideoAdLoad(TTRewardVideoAd ad) {
                Log.d("广告加载成功", "激励视频广告已加载");
                mTTRewardVideoAd = ad;
            }

            @Override
            public void onRewardVideoCached() {
                Log.d("广告缓存成功", "激励视频广告缓存完成");
            }
        });
    }

    private void showRewardVideoAd() {
        if (mTTRewardVideoAd != null) {
            mTTRewardVideoAd.showRewardVideoAd(this);
        }
    }
}

步骤5:测试和上线

  1. 调试广告:可以先使用穿山甲提供的测试广告位,确保广告的展示和回调正常。
  2. 上线广告:确认广告功能正常后,替换为正式的广告位ID并上线应用。

其他广告类型

穿山甲SDK支持多种广告形式,如Banner广告、插屏广告、信息流广告等,加载和展示的流程与激励视频广告类似,只需根据需求配置不同的AdSlot参数。

详细的API文档和具体广告类型的示例,可以参考穿山甲官方文档

通过上述步骤,你应该可以成功接入穿山甲广告平台,并展示相应的广告。

]]>
<![CDATA[QQ微信小程序激励视频广告onClose多次回调解决方案]]> https://im1.cc/Front/254.html 2024-06-29T11:54:00+08:00 2024-06-29T11:54:00+08:00 admin https://www.im1.cc

在 QQ 和微信小程序中,激励视频广告的 onClose 回调可能会多次触发的问题,通常是由于广告加载、播放完成或用户关闭广告引起的。这种情况下,可以通过一些技巧和状态管理来避免多次回调的影响,例如:

解决方案一:使用标志位控制回调

通过设置一个标志位来控制只处理第一次回调,忽略后续的回调事件。

let rewardedVideoAd = qq.createRewardedVideoAd({ adUnitId: 'your-ad-unit-id' });
let rewardedAdClosed = false; // 添加一个标志位

rewardedVideoAd.onClose((res) => {
  if (!rewardedAdClosed) {
    rewardedAdClosed = true;
    // 处理广告关闭事件
    if (res && res.isEnded) {
      // 用户完成观看,发放奖励
    } else {
      // 用户未完整观看,不发放奖励
    }
  }
});

rewardedVideoAd.load().then(() => {
  rewardedVideoAd.show().catch((err) => {
    rewardedAdClosed = true; // 广告展示失败也标记为关闭
    console.error('激励视频广告展示失败', err);
  });
});

解决方案二:延迟处理

在 onClose 回调中增加一个延迟处理机制,确保只处理一次回调。

let rewardedVideoAd = qq.createRewardedVideoAd({ adUnitId: 'your-ad-unit-id' });
let timeoutId = null; // 增加一个延时处理的 ID

rewardedVideoAd.onClose((res) => {
  if (timeoutId) return; // 如果已经设置了延时处理,则直接返回

  timeoutId = setTimeout(() => {
    timeoutId = null; // 清除延时处理 ID
    // 处理广告关闭事件
    if (res && res.isEnded) {
      // 用户完成观看,发放奖励
    } else {
      // 用户未完整观看,不发放奖励
    }
  }, 1000); // 延迟一定时间处理,例如 1 秒
});

rewardedVideoAd.load().then(() => {
  rewardedVideoAd.show().catch((err) => {
    console.error('激励视频广告展示失败', err);
  });
});

解决方案三:状态管理

使用状态管理来记录广告是否已经完成或用户已关闭,以避免重复处理。

let rewardedVideoAd = qq.createRewardedVideoAd({ adUnitId: 'your-ad-unit-id' });
let adState = 'loading'; // loading, showing, closed

rewardedVideoAd.onClose((res) => {
  if (adState === 'closed') return; // 如果广告已经关闭,直接返回

  adState = 'closed';
  // 处理广告关闭事件
  if (res && res.isEnded) {
    // 用户完成观看,发放奖励
  } else {
    // 用户未完整观看,不发放奖励
  }
});

rewardedVideoAd.load().then(() => {
  adState = 'loaded';
  rewardedVideoAd.show().then(() => {
    adState = 'showing';
  }).catch((err) => {
    adState = 'closed';
    console.error('激励视频广告展示失败', err);
  });
});

注意事项

  1. 激励视频广告的 onClose 回调可能因平台实现不同而触发多次,需要根据具体平台和 SDK 版本适配处理。
  2. 根据实际情况选择合适的解决方案,确保在用户观看完毕后才发放奖励,避免重复发放或漏发奖励。

通过上述方案,你可以有效地解决 QQ 和微信小程序中激励视频广告 onClose 多次回调的问题,确保用户体验和奖励的正确发放。

]]>
<![CDATA[Uniapp简单封装的激励广告和插屏广告]]> https://im1.cc/Front/250.html 2024-06-29T11:26:00+08:00 2024-06-29T11:26:00+08:00 admin https://www.im1.cc

在 Uniapp 中,你可以通过封装激励广告和插屏广告来简化它们的使用。以下是一个简单的封装示例,针对微信小程序平台的 wx.createRewardedVideoAd 和 wx.createInterstitialAd API。

激励广告封装

// util/rewardedAd.js
export default class RewardedAd {
  constructor(adUnitId) {
    this.adUnitId = adUnitId;
    this.rewardedVideoAd = null;
    this.initAd();
  }

  initAd() {
    if (wx.createRewardedVideoAd) {
      this.rewardedVideoAd = wx.createRewardedVideoAd({
        adUnitId: this.adUnitId
      });

      this.rewardedVideoAd.onLoad(() => {
        console.log('激励视频广告加载成功');
      });

      this.rewardedVideoAd.onError(err => {
        console.error('激励视频广告加载失败', err);
      });

      this.rewardedVideoAd.onClose(res => {
        if (res && res.isEnded) {
          console.log('用户完整观看了广告');
          if (this.onReward) this.onReward();
        } else {
          console.log('用户中途退出了广告');
        }
      });
    } else {
      console.warn('当前环境不支持激励视频广告');
    }
  }

  showAd() {
    if (this.rewardedVideoAd) {
      this.rewardedVideoAd.show().catch(() => {
        // 广告加载失败时重新加载
        this.rewardedVideoAd.load().then(() => this.rewardedVideoAd.show());
      });
    }
  }

  onReward(callback) {
    this.onReward = callback;
  }
}

使用示例:

// 在某个页面中
import RewardedAd from '@/util/rewardedAd';

const ad = new RewardedAd('your-ad-unit-id');
ad.onReward(() => {
  // 用户观看广告后获得奖励
  console.log('用户获得奖励');
});

// 显示广告
ad.showAd();

插屏广告封装:

// util/interstitialAd.js
export default class InterstitialAd {
  constructor(adUnitId) {
    this.adUnitId = adUnitId;
    this.interstitialAd = null;
    this.initAd();
  }

  initAd() {
    if (wx.createInterstitialAd) {
      this.interstitialAd = wx.createInterstitialAd({
        adUnitId: this.adUnitId
      });

      this.interstitialAd.onLoad(() => {
        console.log('插屏广告加载成功');
      });

      this.interstitialAd.onError(err => {
        console.error('插屏广告加载失败', err);
      });

      this.interstitialAd.onClose(() => {
        console.log('插屏广告关闭');
      });
    } else {
      console.warn('当前环境不支持插屏广告');
    }
  }

  showAd() {
    if (this.interstitialAd) {
      this.interstitialAd.show().catch(() => {
        // 广告加载失败时重新加载
        this.interstitialAd.load().then(() => this.interstitialAd.show());
      });
    }
  }
}

使用示例:

// 在某个页面中
import InterstitialAd from '@/util/interstitialAd';

const ad = new InterstitialAd('your-ad-unit-id');

// 显示广告
ad.showAd();

总结

  1. 激励广告:RewardedAd 类封装了激励广告的初始化、显示和奖励回调。
  2. 插屏广告:InterstitialAd 类封装了插屏广告的初始化和显示。

这两个类分别处理广告的加载、显示和相关事件,简化了广告的使用流程。只需提供广告单元 ID 并调用 showAd 方法即可显示广告。

]]>