在Windows Mobile中我们获取手机信息一般都不是那么方便,在Windows Phone 7 中微软在获取用户信息和设备信息中很给力,如何获取呢?请继续往下阅读。
在命名空间Microsoft.Phone.Info下,微软给我们提供了两个类UserExtendedProperties类和DeviceExtendedProperties类,这两个类分别提供了两个静态方法GetValue和TryGetValue,我们只需传入相应参数就可以轻松获取相应信息,下面我们来讲如何获取。
使用这两个类,需要在工程Properties目录下的WMAppManifest.xml文件中声明< Capability />标签,以告知用户此程序使用了何种功能,用户就可以根据提示选择是否安装程序,打个比方,用户不想让应用程序调用电话功能,但是你的软件是有调用电话功能的,那么用户就有可能不会选择安装此种程序,如果不声明,就会报错,默认生成的WMAppManifest.xml文件已经给我们添加如下内容:
<Capabilities>
<Capability Name="ID_CAP_GAMERSERVICES"/> // 游戏相关的服务
<Capability Name="ID_CAP_IDENTITY_DEVICE"/> // 设备信息
<Capability Name="ID_CAP_IDENTITY_USER"/> // 用户信息
<Capability Name="ID_CAP_LOCATION"/> // 位置信息
<Capability Name="ID_CAP_MEDIALIB"/> // 访问媒体库
<Capability Name="ID_CAP_MICROPHONE"/> // 麦克风
<Capability Name="ID_CAP_NETWORKING"/> // 网络相关
<Capability Name="ID_CAP_PHONEDIALER"/> // 拨打电话
<Capability Name="ID_CAP_PUSH_NOTIFICATION"/> // 消息推送
<Capability Name="ID_CAP_SENSORS"/> // 传感器
<Capability Name="ID_CAP_WEBBROWSERCOMPONENT"/> // 浏览器组件
</Capabilities>
1. 获取用户信息
目前,UserExtendedProperties只能获取到用户唯一标识ANID。
1.添加命名空间using Microsoft.Phone.Info;
2.在工程Properties目录下的WMAppManifest.xml文件中默认会有如下声明,若没有,我们自行添加:
1.添加命名空间using Microsoft.Phone.Info;
2.在工程Properties目录下的WMAppManifest.xml文件中默认会有如下声明,若没有,我们自行添加:
<Capability Name="ID_CAP_IDENTITY_USER"/>
注:如果没有,但你又要去获取用户信息,就会报错。
string anid = DeviceExtendedProperties.GetValue("ANID").ToString();
或者
object value;
UserExtendedProperties.TryGetValue("ANID", out value)
注:如果你的WP7手机没有绑定Windows Live ID,GetValue返回的字符串为空,TryGetValue返回的对象也为空,模拟器上无法绑定Windows Live ID,所以也是返回空,因此要注意对返回值是否为空的判断。
2.获取设备信息
对于DeviceExtendedProperties,可以获取的信息就相对多一些,可以取到的信息如下所示:
DeviceManufacturer :获取设备制造商名称
DeviceName : 获取设备名称
DeviceUniqueId :获取设备ID
DeviceFirmwareVersion :获取设备的固件版本
DeviceHardwareVersion :获取设备的硬件版本
DeviceTotalMemory :获取设备的物理内存大小
ApplicationCurrentMemoryUsage:获取当前应用程序的使用内存大小
ApplicationPeakMemoryUsage :获取当前应用程序峰值内存大小
添加命名空间using Microsoft.Phone.Info;
在工程Properties目录下的WMAppManifest.xml文件中默认会有如下声明,若没有,我们自行添加:
<Capability Name="ID_CAP_IDENTITY_DEVICE"/>
注:如果没有,但你又要去获取用户信息,就会报错。
在工程Properties目录下的WMAppManifest.xml文件中默认会有如下声明,若没有,我们自行添加:
<Capability Name="ID_CAP_IDENTITY_DEVICE"/>
注:如果没有,但你又要去获取用户信息,就会报错。
string value = DeviceExtendedProperties.GetValue("DeviceTotalMemory").ToString();
或者
object value;
UserExtendedProperties.TryGetValue("DeviceTotalMemory ", out value)
DeviceInfo.cs类
为了便于大家的使用,在此我特地封装了个类DeviceInfo.cs,里面提供了一些静态方法来获取用户和设备信息,下面摘录部分:
/// <summary>
///获取设备制造商名称
/// </summary>
/// <returns>返回最大长度为256个字符的字符串也可能为空</returns>
public static string GetManufacturer()
{
object value;
return DeviceExtendedProperties.TryGetValue("DeviceManufacturer", out value) ? value.ToString() : string.Empty;
}
/// <summary>
/// 获取设备名称
/// </summary>
/// <returns>返回最大长度为256个字符的字符串也可能为空</returns>
public static string GetDeviceName()
{
object value;
return DeviceExtendedProperties.TryGetValue("DeviceName", out value) ? value.ToString() : string.Empty;
}
/// <summary>
///获取设备名称ID
/// </summary>
/// <returns>返回长度为20的字节数组</returns>
public static byte[] GetDeviceUniqueID()
{
object value;
return DeviceExtendedProperties.TryGetValue("DeviceUniqueId", out value) ? (byte[])value : null;
}
///<summary>
///获取当前应用程序峰值内存大小
///<summary>
///<returns>返回长整形,单位为字节</returns>
public static long GetApplicationPeakMemoryUsage()
{
object value;
return DeviceExtendedProperties.TryGetValue("ApplicationPeakMemoryUsage", out value) ? Convert.ToInt64(value) : 0;
}
///<summary>
/// 获取设备的硬件版本
///<summary>
///<returns>返回值是字符串,也可能为空</returns>
///(注建议将返回的字符串解析为Version对象)
public static Version GetDeviceHardwareVersion()
{
object value;
return DeviceExtendedProperties.TryGetValue("DeviceHardwareVersion", out value) ? new Version(value.ToString()) : new Version(string.Empty);
}
大家可以引入到自己的工程然后像如下直接调用DeviceInfo.GetApplicationPeakMemoryUsage(),此类提供的具体方法请参考GetDeviceInfo工程里的DeviceInfo.cs。
小实践:内存监视小程序
获取这些信息都有什么用处呢?下面我们来实践下,做个内存监视小程序。这个简单的小程序的作用就是每隔一定时间去检测当前应用程序的使用内存大小和峰值内存大小。
首先在设计器上拖入三个textblock控件,命名为txtblkAppPeakMemoryUsageTxt,txtblkAppCurrentMemoryUsageTxt,txtblkDeviceNameTxt,用于显示测试数据,再拖三个,用于提示数据名,
在构造函数中 获取设备名,txtblkDeviceNameTxt.Text = DeviceInfo.GetDeviceName();
声明定时器DispatcherTimer对象timer,DispatcherTimer timer;
在构造函数实例化timer对象,timer = new DispatcherTimer();
设置定时器间隔5秒,timer.Interval = new TimeSpan(0, 0, 5);
声明委托,timer.Tick += new EventHandler(timer_Tick);;
启动定时器 timer.Start();;
编写回调函数
void timer_Tick(object sender, EventArgs e)
{
try
{
txtblkAppPeakMemoryUsageTxt.Text =
DeviceInfo.GetApplicationPeakMemoryUsage().ToString();
txtblkAppCurrentMemoryUsageTxt.Text =
DeviceInfo.GetApplicationCurrentMemoryUsage().ToString();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
具体代码请参考GetDeviceInfo工程。
下面我们来看下程序的截图:
上面显示我们当前所用的是模拟器,并且显示了我第一次取到的数据。
我们发现第二次获取数据的时候,下面的内存数据变化了。
截至目前为止,我们使用的都是模拟器来测试,所有的数据的是虚拟的,大家如果手上有真机不妨到真机上测试下,体验一下真实的数据,如果你的手机已经绑定Windows Live ID你将会获取更多真实信息。
截至目前为止,我们使用的都是模拟器来测试,所有的数据的是虚拟的,大家如果手上有真机不妨到真机上测试下,体验一下真实的数据,如果你的手机已经绑定Windows Live ID你将会获取更多真实信息。