导出 (0) 打印
全部展开
信息
您所需的主题如下所示。但此主题未包含在此库中。

在 Windows Phone 8 中如何使用流量感知 API 调整数据使用量

2014/6/18

仅适用于:Windows Phone 8 和 Windows Phone Silverlight 8.1

您可以编码您的应用以在用户接近其数据限制时减少数据使用,在用户超过其数据限制时停止数据使用,或在 Wi-Fi 连接可用前推迟传输数据的任务。

通过数据感知功能,用户可以指定其数据计划的限制。然后,数据感知将监视与用户指定的限制相关的数据使用。借助此信息,您的应用可以帮助用户通过调整数据使用来节约金钱。

重要说明重要说明:

移动运营商可以选择性地在手机上安装数据感知应用和磁贴。因此,您的应用用户的手机上可能没有数据感知应用。没有该应用,用户将无法输入其数据限制。

当用户的数据限制未知时,您仍然可以使用数据感知 API 以确定他们是否在使用 Wi-Fi 连接或漫游。然而,您不能使用数据感知 API 确定他们是否在接近其数据限制或超过了他们的数据限制。

本主题包括以下部分。

使用数据感测 API 的应用要求 ID_CAP_NETWORKING 功能。在应用清单文件中指定此要求。有关更多信息,请参见 Windows Phone 8 应用功能和硬件要求

设计您的应用,使之在以下时间检查用户在您的应用中的数据使用:

  1. 在应用启动时 - 即 Launching 事件发生时。

  2. NetworkInformation.NetworkStatusChanged 事件在下列条件下发生:

    • 当手机和 Wi-Fi 之间的连接类型改变时。

    • 当用户进入或离开漫游状态时。

    • ApproachingDataLimitOverDataLimit 变为 true 时。

  3. 当应用在由取消激活或逻辑删除引起的暂停后被重新激活时 - 即 Activated 事件发生时。

  4. (可选)在长时间运行传输大量数据的操作之前。

通常可使用下列来自 Windows.Networking.Connectivity 命名空间的类、方法和属性来确定应用是否应减少、停止或推迟数据使用。本主题中的代码示例将演示如何使用这些对象。

  1. 通过调用 NetworkInformation 类的静态 GetInternetConnectionProfile 方法,可以检索 ConnectionProfile

  2. 检查与当前 ConnectionProfile 关联的 NetworkAdapterIanaInterfaceType 属性。

    如果电话正在使用免费的 Wi-Fi 连接,则应用无需限制数据使用。否则,请继续下一步。

  3. 通过调用其 GetConnectionCost 方法,检查与当前 ConnectionProfile 类关联的 ConnectionCost 类的 NetworkCostType 属性。可用值为 NetworkCostType 枚举的成员,如下:

    • Unknown

    • 无限制

    • 已修复

    • 变量

    如果用户的数据限值为 Unrestricted,则应用无需限制数据使用。否则,请继续下一步。

  4. 检查与当前 ConnectionProfile 类关联的 ConnectionCost 类的其他三种属性,以确定对于用户的数据限制,下列属性之一是否为 true

    如果其中一个值为 true,则应用可以减少或停止数据使用。

    如果用户尚未指定数据限制,并且 NetworkCostTypeUnknown,则 ApproachingDataLimitOverDataLimit 的值为 false。您必须为您的应用在数据使用成本未知时选择最佳行为。

    即使 NetworkCostTypeUnknownRoaming 属性仍返回精确值。

下表列出了如何让应用调整其数据使用以减少用户的数据成本的建议:

NetworkCostType

ConnectionCost

负责任的数据使用

示例

无限制

不适用。

无限制。

浏览高分辨率视频。

下载高分辨率图片。

检索电子邮件附件。

FixedVariable

下列三个属性全部为 false

无限制。

浏览高分辨率视频。

下载高分辨率图片。

检索电子邮件附件。

FixedVariable

Unknown

NetworkCostTypeFixedVariable 时,ApproachingDataLimittrue

NetworkCostTypeUnknown 时不适用。

传输较少数据。

提供选项用于重写。

浏览质量较低的视频。

下载低分辨率图片。

仅检索电子邮件标题。

推迟传输数据的任务。

FixedVariable

OverDataLimitRoamingtrue

不传输数据。

提供选项用于重写。

停止下载视频。

停止下载图片。

不检索电子邮件。

推迟传输数据的任务。

当您编写应用以减少、停止或推迟数据使用时,建议您向用户提供选项以重写此处建议的更低使用级别。然而,重复提示可能不是最佳的解决方案。要最大程度的减少对用户的打扰,可以创建应用级别的设置,为用户提供可绕过重复提示的选项。例如,可以创建包含下列可能的值的 Prompt to override reduced data usage 设置:Always overridePrompt to overrideNever override

说明注意:

您不能使用模拟面板通过改变手机到 Wi-Fi(反之亦然)的网络类型来测试数据感知代码。模拟面板不会更改数据感知 API 使用的属性和我们在此描述的属性的值。有关模拟面板中网络模拟的更多信息,请参见如何模拟 Windows Phone 的低带宽连接或较差信号

当手机具有其连接信息的 Wi-Fi 连接可用时,手机将自动从手机网络连接切换到 Wi-Fi 连接。您无需编写代码以在 Wi-Fi 连接可用时断开连接和重新连接。

下列代码示例演示了如何基于用户指定的数据限制调整数据使用。


using Windows.Networking.Connectivity;
…

namespace DataSenseSample
{
    public partial class MainPage : PhoneApplicationPage
    {

        bool m_bDoNotSendData = false;
        bool m_bSendLowResolutionImage = false;

        private const int IANA_INTERFACE_TYPE_WIFI = 71;

        NetworkStatusChangedEventHandler networkStatusCallback;

        // Constructor.
        public MainPage()
        {
            InitializeComponent();

            // Handle the NetworkStatusChanged event.
            networkStatusCallback = new NetworkStatusChangedEventHandler(OnNetworkStatusChange);
            UpdateNetworkInformation();

        }

        void UpdateNetworkInformation()
        {
            // Get current Internet Connection Profile.
            ConnectionProfile internetConnectionProfile = Windows.Networking.Connectivity.NetworkInformation.GetInternetConnectionProfile();
           
            // Check the connection details.
            if (internetConnectionProfile.NetworkAdapter.IanaInterfaceType != IANA_INTERFACE_TYPE_WIFI)
            {
                // Connection is not a Wi-Fi connection. 
                if (internetConnectionProfile.GetConnectionCost().Roaming)
                {
                    // User is roaming. Don't send data out.
                    m_bDoNotSendData = true;
                }

                if (internetConnectionProfile.GetConnectionCost().ApproachingDataLimit)
                {
                    // User is approaching data limit. Send low-resolution images.
                    m_bSendLowResolutionImage = true;
                }

                if (internetConnectionProfile.GetConnectionCost().OverDataLimit)
                {
                    // User is over data limit. Don't send data out.
                    m_bDoNotSendData = true;
                }
            }
            else
            {   
                //Connection is a Wi-Fi connection. Data restrictions are not necessary.                        
                m_bDoNotSendData = false;
                m_bSendLowResolutionImage = false;
            }

            // Optionally, report the current values in a TextBox control.
            string cost = string.Empty;
            switch (internetConnectionProfile.GetConnectionCost().NetworkCostType)
            {
                case NetworkCostType.Unrestricted:
                    cost += "Cost: Unrestricted";
                    break;
                case NetworkCostType.Fixed:
                    cost += "Cost: Fixed";
                    break;
                case NetworkCostType.Variable:
                    cost += "Cost: Variable";
                    break;
                case NetworkCostType.Unknown:
                    cost += "Cost: Unknown";
                    break;
                default:
                    cost += "Cost: Error";
                    break;
            }
            cost += "\n";
            cost += "Roaming: " + internetConnectionProfile.GetConnectionCost().Roaming + "\n";
            cost += "Over Data Limit: " + internetConnectionProfile.GetConnectionCost().OverDataLimit + "\n";
            cost += "Approaching Data Limit : " + internetConnectionProfile.GetConnectionCost().ApproachingDataLimit + "\n";

            NetworkStatus.Text = cost;
        }

        async void OnNetworkStatusChange(object sender)
        {
            UpdateNetworkInformation();
        }


    }
}

显示:
© 2014 Microsoft