• 实现一个包含Microsoft.Advertising和SmartMad广告控件的UserControl


    目前微软为Windows Phone 7 提供了内置的广告控件,可惜的是大陆地区无法使用,但也不是绝对的,如果将应用的语言设置成英语,也是可以显示的,可以通过以下代码:

    System.Globalization.CultureInfo.CurrentCulture = "en-us";

    但在大陆地区还是使用中文的广告吧,试用了几家广告商的控件,推荐一下SmartMad亿动智道,SDK比较稳定,填充率也不错,另一家AirAd崩溃的次数比较多。

    参考资料:http://msdn.microsoft.com/zh-tw/magazine/jj190802.aspx

    http://community.bingads.microsoft.com/ads/en/publisher/f/32/p/70010/113753.aspx

    http://www.it165.net/pro/html/201210/3966.html

    http://msdn.microsoft.com/zh-cn/magazine/hh288088.aspx

    http://msdn.microsoft.com/en-us/library/hh300674(v=msads.20).aspx

    SmartMad可参考SDK自带的文档。

    要实现的目的如下:

    1、根据系统语言和是否试用判断广告是否显示。如果是英语,就显示微软的广告,中文就显示SmartMad的广告。

    2、载入广告时,显示一个提示信息,比如“载入中……”或“每天点一次,广告去无踪”。

    3、用户点击广告后,24小时内不再显示广告。

    设置第三条主要是为了避免太多的广告影响用户体验。用户只需点击一次,今天就不会再看到广告了,目前一些流行的WP7应用如书中圣等都采用了这种方式。

    具体步骤如下:

    1、首先新建一个UserControl,起名"MyAd.xaml",代码如下:

    <UserControl x:Class="HRD.UserControls.MyAd"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        mc:Ignorable="d"
        FontFamily="{StaticResource PhoneFontFamilyNormal}"
        FontSize="{StaticResource PhoneFontSizeNormal}"
        Foreground="{StaticResource PhoneForegroundBrush}"
        d:DesignHeight="80" d:DesignWidth="480"
        xmlns:my="clr-namespace:Microsoft.Advertising.Mobile.UI;assembly=Microsoft.Advertising.Mobile.UI"  
        xmlns:SmartMad="clr-namespace:SmartMad.Ads.WindowsPhone7.WPF;assembly=SmartMad.Ads.WindowsPhone7">
        
        <Grid x:Name="LayoutRoot" Width="480" Height="80" Background="{StaticResource PhoneBackgroundBrush}">
            <my:AdControl Visibility="Collapsed" ApplicationId="*" x:Name="MSAdv" AdUnitId="*" Height="80" Margin="0,0,0,0" Width="480" Grid.Row="0" IsAutoCollapseEnabled="True"
        IsAutoRefreshEnabled="True" AdRefreshed="MSAdv_AdRefreshed" IsEngagedChanged="MSAdv_IsEngagedChanged" />
            <SmartMad:AdView Visibility="Collapsed" x:Name="SMAdv" AdPositionID="*" IsDebugMode="False" AdInterval="30" AdViewEvent="SMAdv_AdViewEvent"  AdViewFullscreenEvent="SMAdv_AdViewFullscreenEvent" />
            <StackPanel HorizontalAlignment="Center" VerticalAlignment="Center" Name="pnlMsg">
                <TextBlock HorizontalAlignment="Center" VerticalAlignment="Center">
                    每天点一次,广告去无踪
                </TextBlock>
                <TextBlock HorizontalAlignment="Center" VerticalAlignment="Center">
                     No advertising if you click once a day.
                </TextBlock>
            </StackPanel>
        </Grid>
    </UserControl>

    里面放了三个控件,一个是微软的广告,一个是SmartMad的广告,再就是一个提示框。

    2、cs代码中输入以下代码:

     1         #region Common
     2         private void CheckTrialMode()
     3         {
     4             if ((Application.Current as App).IsTrial == true)
     5             {
     6 
     7                 if (this.CheckAdClickTime())
     8                 {
     9                     //var lan = AppSettingHelper.Language;
    10                     var lan = Thread.CurrentThread.CurrentCulture.ToString();
    11 
    12                     if (lan == "zh-CN")
    13                     {
    14                         this.MSAdv.IsEnabled = false;
    15                         this.MSAdv.Visibility = System.Windows.Visibility.Collapsed;
    16                         this.SMAdv.IsEnabled = true;
    17                         this.SMAdv.Visibility = System.Windows.Visibility.Visible;
    18                         this.pnlMsg.Visibility = System.Windows.Visibility.Visible;
    19                     }
    20                     else
    21                     {
    22                         this.MSAdv.IsEnabled = true;
    23                         this.MSAdv.Visibility = System.Windows.Visibility.Visible;
    24                         this.SMAdv.IsEnabled = false;
    25                         this.SMAdv.Visibility = System.Windows.Visibility.Collapsed;
    26                         this.pnlMsg.Visibility = System.Windows.Visibility.Visible;
    27                     }
    28                 }
    29                 else
    30                 {
    31                     this.HideAd();
    32                 }
    33             }
    34             else
    35             {
    36                 this.HideAd();
    37             }
    38         }
    39         /// <summary>
    40         /// 隐藏广告控件
    41         /// </summary>
    42         private void HideAd()
    43         {
    44             this.MSAdv.Visibility = System.Windows.Visibility.Collapsed;
    45             this.SMAdv.Visibility = System.Windows.Visibility.Collapsed;
    46             this.pnlMsg.Visibility = System.Windows.Visibility.Collapsed;
    47             this.LayoutRoot.Visibility = System.Windows.Visibility.Collapsed;
    48             this.LayoutRoot.Height = 0;
    49         }
    50         /// <summary>
    51         /// 检查上次点击时间 如果大于一天则显示广告
    52         /// </summary>
    53         /// <returns></returns>
    54         private bool CheckAdClickTime()
    55         {
    56             return AppSettingHelper.AdClickTime.AddDays(1).CompareTo(DateTime.Now) <= 0 ? true : false;
    57         }
    58         #endregion

    2、在页面刚载入时,先显示提示框,当广告加载完成时,隐藏提示框并显示广告。注意每家广告商的SDK事件是不同的,需要根据具体情况使用。代码如下:

     1 /// <summary>
     2         /// 获取广告后隐藏提示框
     3         /// </summary>
     4         /// <param name="sender"></param>
     5         /// <param name="e"></param>
     6         private void MSAdv_AdRefreshed(object sender, EventArgs e)
     7         {
     8             Dispatcher.BeginInvoke(() =>
     9             {
    10                 this.pnlMsg.Visibility = System.Windows.Visibility.Collapsed;
    11             });
    12         }
    13 
    14 /// <summary>
    15         /// 获取广告后隐藏提示框
    16         /// </summary>
    17         /// <param name="sender"></param>
    18         /// <param name="args"></param>
    19         private void SMAdv_AdViewEvent(object sender, SmartMad.Ads.WindowsPhone7.WPF.AdViewEventArgs args)
    20         {
    21             Dispatcher.BeginInvoke(() =>
    22             {
    23                 if (args.code == SmartMad.Ads.WindowsPhone7.WPF.AdViewEventCode.EVENT_NEWAD)
    24                 {
    25                     this.pnlMsg.Visibility = System.Windows.Visibility.Collapsed;
    26                 }
    27             });
    28         }

    3、当用户点击后,记录点击时间。注意因为用户点击广告后会导致当前应用进入后台,因此要使用代码Dispatcher.BeginInvoke()去调用,否则可能无法实现。

    如下:

     1 /// <summary>
     2         /// 微软广告的点击事件
     3         /// </summary>
     4         /// <param name="sender"></param>
     5         /// <param name="e"></param>
     6         private void MSAdv_IsEngagedChanged(object sender, EventArgs e)
     7         {
     8             AdControl ad = (AdControl)sender;
     9             if (ad.IsEngaged)
    10             {
    11                 Dispatcher.BeginInvoke(() =>
    12                 {
    13                     AppSettingHelper.AdClickTime = System.DateTime.Now;
    14                 });
    15             }
    16         }
    17 
    18 
    19 /// <summary>
    20         /// SmartMad的点击事件
    21         /// </summary>
    22         /// <param name="sender"></param>
    23         /// <param name="args"></param>
    24         private void SMAdv_AdViewFullscreenEvent(object sender, SmartMad.Ads.WindowsPhone7.WPF.AdViewFullscreenEventArgs args)
    25         {
    26             if (args.fullscreen == true)
    27             {
    28                 Dispatcher.BeginInvoke(() =>
    29                 {
    30                     AppSettingHelper.AdClickTime = System.DateTime.Now;
    31                 });
    32             }
    33         }

    4、构造函数中加入检查广告的函数。

    1 public MyAd()
    2         {
    3             InitializeComponent();
    4 
    5             this.CheckTrialMode();
    6         }

    5、在需要使用广告的页面中加入这个UserControl,就可以实现刚开始提出的需求了。

    如果您有好的实现方式,欢迎留言讨论。

    2012.11.21补充:

    目前SmartMad的广告控件,如果弹出系统浏览器的话无法捕获到SMAdv_AdViewFullscreenEvent事件,因此无法实现记录点击时间的效果。只有打开内置浏览器的广告才能实现此目的。SmartMad说下个版本的SDK才会解决此问题。

  • 相关阅读:
    c++ stl string char* 向 string 转换的问题
    不要在疲惫中工作
    今天
    悠然自得
    忙与闲
    <转>LuaTinker的bug和缺陷
    匿名管道
    SetWindowHookEx 做消息响应
    最近工作
    实现网页页面跳转的几种方法(meta标签、js实现、php实现)
  • 原文地址:https://www.cnblogs.com/yanxiaodi/p/2744795.html
Copyright © 2020-2023  润新知