实现App和游戏的视频广告切换

App和游戏中会遇到集成多个广告,根据广告的价格,切不同的量。于是自己写了些,给视频广告设置展示权值,权值大的,切的量就多些。



下面介绍一下

public interface IVideoAd {
	public String getName();
	public int getWeight();
	public void play(VideoAdPlayCallBack callBack);
	public boolean isReady();
	
	public void init();
	public void onStart();
	public void onPause();
	public void onResume();
	public void onStop();
	public void onDestroy();
	public boolean onBackPressed();
}

首先定义了所有视频广告需要实现IVideoAd接口的方法,设置广告名字,权值,等等。


例如Vungle这个视频广告

public class VungleVideo implements IVideoAd{
	private static final String TAG = "VungleVideo";
	private Activity mGameActivity;
	private String mAppID;
	private VideoAdPlayCallBack mCallBack;
	final static VunglePub vunglePub = VunglePub.getInstance();
	
	VungleVideo(Activity gameActivity,String appID){
		mGameActivity = gameActivity;
		mAppID = appID;
	}
	@Override
	public void init() {
		// TODO Auto-generated method stub
		vunglePub.init(mGameActivity, mAppID);
		vunglePub.setEventListeners(vungleListener);
	}
	@Override
	public void onStart() {
		// TODO Auto-generated method stub
	}

	@Override
	public void onPause() {
		// TODO Auto-generated method stub
		vunglePub.onPause();
	}

	@Override
	public void onResume() {
		// TODO Auto-generated method stub
		vunglePub.onResume();
	}

	@Override
	public void onDestroy() {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void play(VideoAdPlayCallBack callBack) {
		// TODO Auto-generated method stub
		Log.d(TAG, "playVideoAd:: isCachedAdAvailable="
				+ VunglePub.getInstance().isAdPlayable());

		final AdConfig overrideConfig = new AdConfig();
		// set any configuration options you like.
		overrideConfig.setIncentivized(true);
		overrideConfig.setSoundEnabled(true);

		final VunglePub vunglePub = VunglePub.getInstance();
		mGameActivity.runOnUiThread(new Runnable() {
			@Override
			public void run() {
				Log.d(TAG, "vunglePub.playAd");
				vunglePub.playAd(overrideConfig);
			}
		});
	}
	public boolean isReady(){
		boolean isReady = VunglePub.getInstance().isAdPlayable();
		Log.d(TAG, "isReady:"+isReady);
		return isReady;	
	}
	private final static EventListener vungleListener = new EventListener() {
		private VungleVideo mVungleVideo;
		public void EventListener(VungleVideo vungleVideo){
			mVungleVideo = vungleVideo;
		}
		@Override
		public void onVideoView(boolean isCompletedView, int watchedMillis,
				int videoDurationMillis) {
			// Called each time a video completes. isCompletedView is true if
			// the video was not skipped.
			Log.d(TAG, "onVideoView,isCompletedView=" + isCompletedView
					+ " videoDurationMillis=" + videoDurationMillis);
		}

		@Override
		public void onAdStart() {
			// Called before playing an ad
			Log.d(TAG, "onAdStart");
		}

		@Override
		public void onAdUnavailable(String reason) {
			// called when VunglePub.playAd() was called but no ad is available
			// to show to the user
			Log.e(TAG, "onAdUnavailable:" + reason);
		}

		@Override
		public void onAdEnd(boolean wasCallToActionClicked) {
			// Called when the user leaves the ad and control is returned to
			// your application
			Log.d(TAG, "onAdEnd");
			mVungleVideo.mCallBack.onVideoAdFinished(mVungleVideo.getName());
		}

		@Override
		public void onAdPlayableChanged(boolean arg0) {
			Log.d(TAG, "onAdPlayableChanged");
		}

	};
	@Override
	public boolean onBackPressed() {
		// TODO Auto-generated method stub
		return false;
	}
	@Override
	public void onStop() {
		// TODO Auto-generated method stub
		
	}
	@Override
	public String getName() {
		// TODO Auto-generated method stub
		return "vungle";
	}
	@Override
	public int getWeight() {
		// TODO Auto-generated method stub
		return 1;
	}

}


public interface VideoAdPlayCallBack {
	public void onVideoAdFinished(String videoAdName);
	public void onVideoAdStart(String videoAdName);
}


上面是广告类的代码,主要是在play()中实现广告播放,VideoAdPlayCallBack作为广告开始播放和结束的监听回调。



下面介绍广告的管理类VideoAdManager


public class VideoAdManager {
	private static final String TAG = "VideoAdManager";
	private static final String VIDEO_LAST_PLAY_TIME = "PLAY_VIDEO_LAST_TIME";
	private static final String VIDEO_PLAY_TIMES = "VIDEO_PLAY_TIMES";
	private static Map<String,IVideoAd> _videoAds = new HashMap<String,IVideoAd>();
	private static VideoAdPlayCallBack mVideoAdPlayCallBack = null;
	private static Activity _gameActivity;
	private static boolean mUseLocalTime = true;
	private static int mVideoAdDailyTimes = 1;
	/**
	 * 添加视频广告
	 * @param videoAdName 广告名字
	 * @param videoAd
	 */
	public static void addVideoAd(String videoAdName,IVideoAd videoAd){
		_videoAds.put(videoAdName, videoAd);
	}
	/**
	 * 使用本地时间计算视频广告是否显示
	 * @param enable
	 */
	public static void setUseLocalTime(boolean enable){
		mUseLocalTime = enable;
	}
	public static boolean getUseLocalTime(){
		return mUseLocalTime;
	}
	/**
	 * 视频广告每天显示的次数
	 * @param dailyTimes
	 */
	public static void setVideoAdDailyTimes(int dailyTimes){
		mVideoAdDailyTimes = dailyTimes;
	}
	public void onCreate(Activity gameActivity,VideoAdPlayCallBack videoAdPlayCallBack){
		_gameActivity = gameActivity;
		mVideoAdPlayCallBack = videoAdPlayCallBack;
	}
	public static void init(){
		for(Map.Entry<String, IVideoAd> item : _videoAds.entrySet()){
			item.getValue().init();
		} 
	}
	/**
	 * 当天的视频广告显示次数是否超过最大的显示次数
	 * @return
	 */
	public static boolean shouldDisplay(){
		String lastPlayTimeStampString = getLastPlayTimeStampString();
		String currentTimeStampString = timeStampToString(System.currentTimeMillis()/1000);
		
		if (lastPlayTimeStampString.equals(currentTimeStampString)) {
			int playTimes = getPlayTimes();
			if (playTimes < mVideoAdDailyTimes) {
				return true;
			} else {
				return false;
			}
		} else {
			setPlayTimes(0);
			return true;
		}
	}
	/**
	 * 视频广告是否准备好
	 * @return
	 */
	public static boolean isReady(){
		if(mUseLocalTime){
			if(!shouldDisplay()){
				return false;
			}
		}
		
		for(Map.Entry<String, IVideoAd> item : _videoAds.entrySet()){
			if(item.getValue().isReady()){
				return true;
			}
		}
		return false;
	}
	/**
	 * 播放视频广告
	 */
	public void play(){
		if(!shouldDisplay()){
			Log.e(TAG, "video ad play times more than the max diaplay times ");
			return;
		}
		IVideoAd videoAd = randomVideoAd();
		if(videoAd != null && videoAd.isReady()){
			videoAd.play(callBack);
		}		
	}
	/**
	 * 根据权重选择广告
	 * @return
	 */
	private static IVideoAd randomVideoAd(){
		int allWeight = 0;
		for(Map.Entry<String, IVideoAd> entry : _videoAds.entrySet()){
			allWeight = allWeight + entry.getValue().getWeight();
		}
		
		Random random = new Random();
		int randomNum = random.nextInt(allWeight);
		float randomTemp = 0;
		IVideoAd videoAd = null;
		for(Map.Entry<String, IVideoAd> entry : _videoAds.entrySet()){
			randomTemp = randomTemp + entry.getValue().getWeight();
			if(randomNum < randomTemp){
				videoAd = entry.getValue();
				break;
			}
		}
		return videoAd;
	}
	
	/**
	 * 视频播完
	 */
	public static void videoAdEnd(){
		if(mUseLocalTime){
			String lastPlayTimeStampString = getLastPlayTimeStampString();
			String currentTimeStampString = timeStampToString(System.currentTimeMillis()/1000);
			int playTimes = 0;
			if (currentTimeStampString.equals(lastPlayTimeStampString)) {
				playTimes = getPlayTimes();
			}
			playTimes++;

			setLastPlayTimeStampString(currentTimeStampString);
			setPlayTimes(playTimes);	
		}
	}
	
	private static int getPlayTimes() {
		return PrefsUtils.getPreferencesInt(_gameActivity,VIDEO_PLAY_TIMES, 0);		
	}
	private static void setPlayTimes(int value) {
		PrefsUtils.setPreferencesInt(_gameActivity,VIDEO_PLAY_TIMES, value);		
	}
	private static String getLastPlayTimeStampString(){
		return PrefsUtils.getPreferencesString(_gameActivity,VIDEO_LAST_PLAY_TIME, "");
	}
	private static void setLastPlayTimeStampString(String timeStamp){
		PrefsUtils.setPreferencesString(_gameActivity,VIDEO_LAST_PLAY_TIME, timeStamp);
	}
	@SuppressLint("SimpleDateFormat")
	private static String timeStampToString(long timeStamp) {
		SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
		return format.format(new Date(timeStamp));
	}
	
	public static void onStart(){
		for(Map.Entry<String, IVideoAd> item : _videoAds.entrySet()){
			item.getValue().onStart();
		}
	}
	public static void onPause(){
		for(Map.Entry<String, IVideoAd> item : _videoAds.entrySet()){
			item.getValue().onPause();
		}
	}
	public static void onResume(){
		for(Map.Entry<String, IVideoAd> item : _videoAds.entrySet()){
			item.getValue().onResume();
		}
	}
	public static void onDestroy(){
		for(Map.Entry<String, IVideoAd> item : _videoAds.entrySet()){
			item.getValue().onDestroy();
		}
	}
	public static boolean onBackPressed(){
		for(Map.Entry<String, IVideoAd> item : _videoAds.entrySet()){
			if(item.getValue().onBackPressed()){
				return true;
			}
		}
		return false;
	}
	static VideoAdPlayCallBack callBack = new  VideoAdPlayCallBack(){

		@Override
		public void onVideoAdFinished(String videoAdName) {
			// TODO Auto-generated method stub
			videoAdEnd();
			mVideoAdPlayCallBack.onVideoAdFinished(videoAdName);
		}

		@Override
		public void onVideoAdStart(String videoAdName) {
			// TODO Auto-generated method stub
			mVideoAdPlayCallBack.onVideoAdStart(videoAdName);
		}
	};
}


VideoAdManager 提供了广告的添加,然后在需要播放的时候,根据广告的权重,随机一个广告进行显示。

并且增加了一个每日显示最大次数的限制的功能。显示次数和时间都存在了SharedPreferences。

源码:https://github.com/twolight/sdk/tree/master/VideoAdLib


  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值