最近做了一个很黄很暴力的图片应用(只是服务端而已,意思是里面的内容尺度稍微有点大),开发过程还算顺畅,用了AOP和三级缓存,心情不错,于是便想试手Windows Phone开发。开发Windows Phone应用的念头已经很久了,话说我的几个手机都是Windows Phone系统的,不过微软的表现确实不给力。以前也做过一个铃声的应用,只是后来因为设计图不给力就夭折了。
这次试手也算是Windows Phone开发的开端吧,主要是公司对Windows Phone平台不太看重,整个公司好几个团队,没有一个给Windows Phone做客户端的,谁让市场占有率小呢,没办法的事情。
通过Microsoft.Phone.Info命名空间下的DeviceStatus静态类,我们可以很轻松的获取到Windows Phone设备的硬件信息。比如:制造商、系统内存、设备名称、供电设备、物理键盘等信息。
DeviceStatus类型属性列表 | |
---|---|
属性名称 | 说明 |
ApplicationCurrentMemoryUsage | 返回当前应用程序的内存使用情况(以字节为单位)。 |
ApplicationMemoryUsageLimit | 返回您的应用程序进程可以分配的最大内存数量(以字节为单位)。 |
ApplicationPeakMemoryUsage | 返回当前应用程序的高峰内存使用情况(以字节为单位)。 |
DeviceFirmwareVersion | 返回设备上运行的固件版本。 |
DeviceHardwareVersion | 返回设备上运行的硬件版本。 |
DeviceManufacturer | 返回设备制造商名称。 |
DeviceName | 返回设备名称。 |
DeviceTotalMemory | 返回设备的物理 RAM 大小(以字节为单位)。 |
IsKeyboardDeployed | 指示用户是否已部署设备的物理硬件键盘。 |
IsKeyboardPresent | 指示设备是否包含物理硬件键盘。 |
PowerSource | 指示设备当前是以电池电源运行还是插入了外部电源。 |
以上信息可参考MSDN:DeviceStatus 类
除了上面列出的可以直接取到的信息,有时候还需要获取屏幕分辨率、处理器数量、是否支持GPS、设备标示等信息。
获取屏幕分辨率
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
/// <summary>
/// 获取屏幕分辨率,这样取到的值可能不准确
/// </summary>
/// <returns></returns>
public
String GetResolutionRatio()
{
String val;
try
{
var content = System.Windows.Application.Current.Host.Content;
val = String.Format(
"{0:0}*{1:0}"
, content.ActualHeight, content.ActualWidth);
}
catch
(Exception)
{
val = String.Empty;
}
return
val;
}
|
获取处理器数量
1
|
System.Environment.ProcessorCount
|
获取是否支持GPS定位
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
/// <summary>
/// 获取 是否支持GPS
/// </summary>
/// <returns></returns>
public
Boolean GetSupportGeoCoordinateWatcher()
{
try
{
using
(var geo =
new
GeoCoordinateWatcher())
{
geo.PositionChanged +=
null
;
}
return
true
;
}
catch
(Exception)
{
return
false
;
}
}
|
获取是否支持FM收音机
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
/// <summary>
/// 获取 是否支持FM收音机
/// </summary>
/// <returns></returns>
public
Boolean GetSupportFmRadio()
{
try
{
return
FMRadio.Instance !=
null
;
}
catch
(Exception)
{
return
false
;
}
}
|
获取主摄像头信息(包括分辨率)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
/// <summary>
/// 主摄像头信息
/// </summary>
/// <returns></returns>
public
String PrimaryCamera()
{
if
(!Camera.IsCameraTypeSupported(CameraType.Primary))
return
ConvertHelper.GetSupportName(
false
);
try
{
var str = ConvertHelper.GetSupportName(
true
);
using
(var camera =
new
PhotoCamera(CameraType.Primary))
{
var size = camera.AvailableResolutions.OrderByDescending(i => i.Height * i.Width).First();
str += String.Format(
" [最大分辨率:{0}x{1}]"
, size.Width, size.Height);
}
return
str;
}
catch
(Exception)
{
return
ConvertHelper.GetSupportName(
true
);
}
}
|
获取前置像头信息(包括分辨率)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
/// <summary>
/// 前置摄像头信息
/// </summary>
/// <returns></returns>
public
String FrontFacingCamera()
{
if
(!Camera.IsCameraTypeSupported(CameraType.FrontFacing))
return
ConvertHelper.GetSupportName(
false
);
try
{
var str = ConvertHelper.GetSupportName(
true
);
using
(var camera =
new
PhotoCamera(CameraType.FrontFacing))
{
var size = camera.AvailableResolutions.OrderByDescending(i => i.Height * i.Width).First();
str += String.Format(
" [最大分辨率:{0}x{1}]"
, size.Width, size.Height);
}
return
str;
}
catch
(Exception)
{
return
ConvertHelper.GetSupportName(
true
);
}
}
|
获取是否支持震动
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
/// <summary>
/// 获取 是否支持振动器
/// </summary>
/// <returns></returns>
public
Boolean GetSupportVibrateController()
{
try
{
return
VibrateController.Default !=
null
;
}
catch
(Exception)
{
return
false
;
}
}
|
获取设备标识
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
private
string
GetDeviceUniqueId()
{
var text = String.Empty;
object
obj;
if
(DeviceExtendedProperties.TryGetValue(
"DeviceUniqueId"
,
out
obj))
{
var data = obj
as
byte
[];
if
(data !=
null
)
{
var sb =
new
StringBuilder(data.Length*2);
foreach
(var b
in
data)
{
sb.Append(b.ToString(
"X2"
));
}
text = sb.ToString().Insert(8,
"-"
).Insert(17,
"-"
).Insert(26,
"-"
).Insert(35,
"-"
);
}
}
return
text;
}
|
通过System命名空间下的Environment静态类,可以获取到诸如系统名称、系统版本、CLR版本等信息。详细信息可见MSDN:Environment 类。
获取设备上登陆的Windows Live 账号的唯一编号
1
2
3
4
5
6
7
8
9
10
|
private
string
GetWindowsLiveAnonymousId()
{
var result =
string
.Empty;
object
obj;
if
(UserExtendedProperties.TryGetValue(
"ANID"
,
out
obj) && obj !=
null
&& obj.ToString().Length >= 34)
{
result = obj.ToString().Substring(2, 32).Insert(8,
"-"
).Insert(13,
"-"
).Insert(18,
"-"
).Insert(23,
"-"
);
}
return
result;
}
|
设备的联网信息可以用通过命名空间Microsoft.Phone.Net.NetworkInformation下的DeviceNetworkInformation静态类获取到。包括是否使用了WIFI、数据网络、以及网络运营商等。
DeviceNetworkInformation类型属性列表 | |
---|---|
属性名称 | 说明 |
CellularMobileOperator | 获取蜂窝移动运营商的名称。 |
IsCellularDataEnabled | 获取一个值,该值指示网络是否启用了蜂窝数据。 |
IsCellularDataRoamingEnabled | 获取一个值,该值指示网络是否允许数据漫游。 |
IsNetworkAvailable | 获取一个值,该值指示网络是否可用。 |
IsWiFiEnabled | 获取一个值,该值指示网络是否启用了 Wi-Fi。 |
以上信息可参考MSDN : DeviceNetworkInformation 类
为了方便以后查代码,我已将项目中的核心代码粘贴在了上面,这次探索的副产物就是一个名为MyPhone的应用,和已上线的“我的手机”应用如出一辙。事实上本文的代码在很大程度上参照了这个程序。不过现在Windows Phone 8的程序不太容易反编译了,这对于开发者来说是一件好事,但是对于我等菜鸟来说,只能满世界搜代码了……
源码下载:百度网盘