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