博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
与众不同 windows phone (20) - Device(设备)之位置服务(GPS 定位), FM 收音机, 麦克风, 震动器...
阅读量:7147 次
发布时间:2019-06-29

本文共 13570 字,大约阅读时间需要 45 分钟。

原文:

与众不同 windows phone (20) - Device(设备)之位置服务(GPS 定位), FM 收音机, 麦克风, 震动器

作者:
介绍
与众不同 windows phone 7.5 (sdk 7.1) 之设备

  • 位置服务(GPS 定位)
  • FM 收音机
  • 麦克风
  • 震动器

示例
1、演示如何使用位置服务(GPS 定位)
GpsDemo.xaml

GpsDemo.xaml.cs

/* * 演示如何使用位置服务(GPS 定位) *  * GeoCoordinateWatcher - 用于提供地理位置数据 *     Start() - 启动位置服务 *     TryStart(bool suppressPermissionPrompt, TimeSpan timeout) - 尝试启动位置服务,返回值为位置服务是否启动成功 *         suppressPermissionPrompt - 是否禁用权限提示对话框。true为禁用,false为启用 *         timeout - 启动位置服务的超时时间 *     Stop() - 停止位置服务 *      *     DesiredAccuracy - 指定提供位置服务的精度级别(System.Device.Location.GeoPositionAccuracy 枚举) *         Default - 低精度定位 *         High - 高精度定位 *     Permission - 位置提供程序的权限,只读(System.Device.Location.GeoPositionPermission 枚举) *         Unknown - 权限未知 *         Granted - 授予定位权限 *         Denied - 拒绝定位权限 *     Status - 位置服务的状态(System.Device.Location.GeoPositionStatus 枚举) *         Ready - 已经准备好相关数据 *         Initializing - 位置提供程序初始化中 *         NoData - 无有效数据 *         Disabled - 位置服务不可用 *     Position - 定位的位置数据,只读(Position.Location 是一个 System.Device.Location.GeoCoordinate 类型的对象) *     MovementThreshold - 自上次触发 PositionChanged 事件后,位置移动了此属性指定的距离后再次触发 PositionChanged 事件(单位:米) *         此属性默认值为 0,即位置的任何改变都会触发 PositionChanged 事件 *      *     PositionChanged - 经纬度数据发生改变时所触发的事件(系统会根据 MovementThreshold 属性的值来决定何时触发 PositionChanged 事件,当位置服务被打开后第一次得到位置数据时也会触发此事件) *     StatusChanged - 位置服务的状态发生改变时所触发的事件 *  *  *  * GeoCoordinate - 地理坐标 *     Altitude - 海拔高度(单位:米) *     VerticalAccuracy - 海拔高度的精度(单位:米) *     Longitude - 经度 *     Latitude - 纬度 *     IsUnknown - 是否无经纬度数据。true代表无数据,false代表有数据 *     HorizontalAccuracy - 经纬度的精度(单位:米) *     Course - 行进方向(单位:度,正北为 0 度) *     Speed - 行进速度(单位:米/秒) */using System;using System.Collections.Generic;using System.Linq;using System.Net;using System.Windows;using System.Windows.Controls;using System.Windows.Documents;using System.Windows.Input;using System.Windows.Media;using System.Windows.Media.Animation;using System.Windows.Shapes;using Microsoft.Phone.Controls;using System.Device.Location;using System.Threading;namespace Demo.Device{    public partial class GpsDemo : PhoneApplicationPage    {        private GeoCoordinateWatcher _watcher;        public GpsDemo()        {            InitializeComponent();            _watcher = new GeoCoordinateWatcher();        }        private void btnLow_Click(object sender, RoutedEventArgs e)        {            // 开启低精度位置服务            StartLocationService(GeoPositionAccuracy.Default);        }        private void btnHigh_Click(object sender, RoutedEventArgs e)        {            // 开启高精度位置服务            StartLocationService(GeoPositionAccuracy.High);        }        private void btnClose_Click(object sender, RoutedEventArgs e)        {            StopLocationService();        }        private void StartLocationService(GeoPositionAccuracy accuracy)        {            _watcher = new GeoCoordinateWatcher(accuracy);            // 位置每移动 20 米触发一次 PositionChanged 事件            _watcher.MovementThreshold = 20;             _watcher.StatusChanged += new EventHandler
(_watcher_StatusChanged); _watcher.PositionChanged += new EventHandler
>(_watcher_PositionChanged); lblStatus.Text = "GPS 服务启动中..."; new Thread((x) => { // 启动 GPS 服务,会阻塞 UI 线程,所以要在后台线程处理 if (!_watcher.TryStart(true, TimeSpan.FromSeconds(30))) { Dispatcher.BeginInvoke(delegate { lblStatus.Text = "GPS 服务无法启动"; }); } }).Start(); } private void StopLocationService() { if (_watcher != null) _watcher.Stop(); lblStatus.Text = "GPS 服务已关闭"; } void _watcher_PositionChanged(object sender, GeoPositionChangedEventArgs
e) { // 在 UI 上显示经纬度信息 Dispatcher.BeginInvoke(delegate { lblMsg.Text = "经度: " + e.Position.Location.Longitude.ToString("0.000"); lblMsg.Text += Environment.NewLine; lblMsg.Text += "纬度: " + e.Position.Location.Latitude.ToString("0.000"); }); } void _watcher_StatusChanged(object sender, GeoPositionStatusChangedEventArgs e) { // 在 UI 上显示 GPS 服务状态 Dispatcher.BeginInvoke(delegate { switch (e.Status) { case GeoPositionStatus.Disabled: if (_watcher.Permission == GeoPositionPermission.Denied) lblStatus.Text = "GPS 服务拒绝访问"; else lblStatus.Text = "GPS 服务不可用"; break; case GeoPositionStatus.Initializing: lblStatus.Text = "GPS 服务初始化"; break; case GeoPositionStatus.NoData: lblStatus.Text = "GPS 无有效数据"; break; case GeoPositionStatus.Ready: lblStatus.Text = "GPS 接收数据中"; break; } }); } }}

2、演示如何使用 FM 收音机
FMRadioDemo.xaml

FMRadioDemo.xaml.cs

/* * 演示如何使用 FM 收音机 *  * FMRadio - 用于操作 FM 收音机的类 *     Instance - 返回 FMRadio 实例 *     CurrentRegion - 收音机的区域信息(Microsoft.Devices.Radio.RadioRegion 枚举) *         UnitedStates - 美国 *         Japan - 日本 *         Europe - 其他地区 *     Frequency - 指定 FM 调频的频率 *     PowerMode - 打开或关闭收音机(Microsoft.Devices.Radio.RadioPowerMode 枚举) *         On - 打开收音机 *         Off - 关闭收音机 *     SignalStrength - 当前频率的信号强度(RSSI - Received Signal Strength Indication) */using System;using System.Collections.Generic;using System.Linq;using System.Net;using System.Windows;using System.Windows.Controls;using System.Windows.Documents;using System.Windows.Input;using System.Windows.Media;using System.Windows.Media.Animation;using System.Windows.Shapes;using Microsoft.Phone.Controls;using Microsoft.Devices.Radio;using System.Windows.Threading;using System.Threading;namespace Demo.Device{    public partial class FMRadioDemo : PhoneApplicationPage    {        private FMRadio _radio;        private DispatcherTimer _timer;        public FMRadioDemo()        {            InitializeComponent();            // 实例化 FMRadio,收听 90.5 频率            _radio = FMRadio.Instance;            _radio.CurrentRegion = RadioRegion.Europe;            _radio.Frequency = 90.5;            _timer = new DispatcherTimer();            _timer.Interval = TimeSpan.FromMilliseconds(100);            _timer.Tick += new EventHandler(_timer_Tick);            _timer.Start();            if (_radio.PowerMode == RadioPowerMode.On)                lblStatus.Text = "收音机已打开";            else                lblStatus.Text = "收音机已关闭";        }        void _timer_Tick(object sender, EventArgs e)        {            // 实时显示当前频率及信号强度            lblMsg.Text = "调频:" + _radio.Frequency;            lblMsg.Text += Environment.NewLine;            lblMsg.Text += "RSSI:" + _radio.SignalStrength.ToString("0.00");        }        // 打开收音机        private void btnStart_Click(object sender, RoutedEventArgs e)        {            lblStatus.Text = "收音机打开中。。。";            // 首次启动收音机可能需要多达 3 秒的时间,以后再启动收音机则会在 100 毫秒以内,所以建议在后台线程打开收音机            new Thread((x) =>            {                _radio.PowerMode = RadioPowerMode.On;                Dispatcher.BeginInvoke(delegate                {                    lblStatus.Text = "收音机已打开";                });            }).Start();        }        // 关闭收音机        private void btnClose_Click(object sender, RoutedEventArgs e)        {            _radio.PowerMode = RadioPowerMode.Off;            lblStatus.Text = "收音机已关闭";        }    }}

3、演示如何使用麦克风
MicrophoneDemo.xaml

MicrophoneDemo.xaml.cs

/* * 演示如何使用麦克风进行录音 *  * Microphone - 用于捕获麦克风音频的类 *     Default - 返回默认的 Microphone 实例 *     All - 返回设备的全部 Microphone 实例集合 *     SampleRate - 获取音频的采样率 *     State - Microphone 的状态(Microsoft.Xna.Framework.Audio.MicrophoneState 枚举) *         Started - 正在捕获音频 *         Stopped - 已经停止工作 *     BufferDuration - 麦克风捕获音频时的缓冲时长 *      *     BufferReady - 当麦克风捕获的音频时长达到 BufferDuration 设置的值后所触发的事件 *      *     GetData(byte[] buffer) - 将麦克风最近捕获到的音频数据写入到指定的缓冲区 *     GetSampleSizeInBytes(TimeSpan duration) - 麦克风捕获音频,根据音频时长返回音频字节数 *     GetSampleDuration(int sizeInBytes) - 麦克风捕获音频,根据音频字节数返回音频时长 *     Start() - 开始捕获 *     Stop() - 停止捕获 */using System;using System.Collections.Generic;using System.Linq;using System.Net;using System.Windows;using System.Windows.Controls;using System.Windows.Documents;using System.Windows.Input;using System.Windows.Media;using System.Windows.Media.Animation;using System.Windows.Shapes;using Microsoft.Phone.Controls;using Microsoft.Xna.Framework.Audio;using System.IO;using System.Threading;using Microsoft.Xna.Framework;namespace Demo.Device{    public partial class MicrophoneDemo : PhoneApplicationPage    {        // silverlight 和 xna 混合编程时,所需要用到的计时器        private GameTimer _timer;        private Microphone _microphone = Microphone.Default;        private SoundEffectInstance _soundInstance; // 用于播放音频数据        private byte[] _buffer; // 每一片录音数据的缓冲区        private MemoryStream _stream = new MemoryStream(); // 整个录音数据的内存流        public MicrophoneDemo()        {            InitializeComponent();            _timer = new GameTimer();            // 指定计时器每 1/30 秒执行一次,即帧率为 30 fps            _timer.UpdateInterval = TimeSpan.FromTicks(333333);            // 每次帧更新时所触发的事件            _timer.FrameAction += FrameworkDispatcherFrameAction;            _timer.Start();            _microphone.BufferReady += new EventHandler
(_microphone_BufferReady); } private void FrameworkDispatcherFrameAction(object sender, EventArgs e) { // 当使用 silverlight 和 xna 混合编程时,每次帧更新时都需要调用 FrameworkDispatcher.Update() FrameworkDispatcher.Update(); } void _microphone_BufferReady(object sender, EventArgs e) { // 当录音的缓冲被填满后,将数据写入缓冲区 _microphone.GetData(_buffer); // 将缓冲区中的数据写入内存流 _stream.Write(_buffer, 0, _buffer.Length); } private void btnRecord_Click(object sender, RoutedEventArgs e) { if (lblMsg.Text != "录音中") { // 设置录音的缓冲时长为 0.5 秒 _microphone.BufferDuration = TimeSpan.FromMilliseconds(500); // 设置录音用的缓冲区的大小 _buffer = new byte[_microphone.GetSampleSizeInBytes(_microphone.BufferDuration)]; // 初始化内存流 _stream.SetLength(0); _microphone.Start(); lblMsg.Text = "录音中"; } } private void btnPlay_Click(object sender, RoutedEventArgs e) { if (_stream.Length > 0) { // 播放录音 Thread soundThread = new Thread(new ThreadStart(playSound)); soundThread.Start(); lblMsg.Text = "播放录音"; } } private void btnStop_Click(object sender, RoutedEventArgs e) { if (_microphone.State == MicrophoneState.Started) { // 停止录音 _microphone.Stop(); lblMsg.Text = "停止录音"; } else if (_soundInstance.State == SoundState.Playing) { // 停止播放录音 _soundInstance.Stop(); lblMsg.Text = "停止播放录音"; } } private void playSound() { // 播放内存流中的音频 SoundEffect sound = new SoundEffect(_stream.ToArray(), _microphone.SampleRate, AudioChannels.Mono); _soundInstance = sound.CreateInstance(); _soundInstance.Play(); } }}

4、演示如何使用震动器
VibrationDemo.xaml

VibrationDemo.xaml.cs

/* * 演示如何使用震动器 *  * VibrateController - 用于控制震动器 *     Default - 获取 VibrateController 实例 *     Start(TimeSpan duration) - 指定震动时长,并使设备震动。有效时长在 0 - 5 秒之间,否则会抛出异常 *     Stop() - 停止设备的震动 */using System;using System.Collections.Generic;using System.Linq;using System.Net;using System.Windows;using System.Windows.Controls;using System.Windows.Documents;using System.Windows.Input;using System.Windows.Media;using System.Windows.Media.Animation;using System.Windows.Shapes;using Microsoft.Phone.Controls;using Microsoft.Devices;namespace Demo.Device{    public partial class VibrationDemo : PhoneApplicationPage    {        public VibrationDemo()        {            InitializeComponent();        }        private void btnStart_Click(object sender, RoutedEventArgs e)        {            // 震动 5 秒            VibrateController.Default.Start(TimeSpan.FromMilliseconds(5 * 1000));        }        private void btnStop_Click(object sender, RoutedEventArgs e)        {            // 停止震动            VibrateController.Default.Stop();        }    }}

OK

转载地址:http://sigrl.baihongyu.com/

你可能感兴趣的文章
Xcode打包ipa
查看>>
ansible(四)roles
查看>>
4个人工智能可解释的关键行业
查看>>
超实用面试必看,Python工程师面试题
查看>>
地平线黄畅:未来2到3年,AI芯片出货量能达上千万级别
查看>>
开博第一天 发文庆祝一下哈哈
查看>>
Linux 任务控制(bg job fg nohup &)
查看>>
oracle 存储过程_oracle存储过程_oracle的存储
查看>>
alias用户个性化配置
查看>>
我的友情链接
查看>>
PIE SDK去相关拉伸
查看>>
最新云服务厂商产品列表---截至20141016
查看>>
今天开始学习
查看>>
MySQL数据库学习笔记(三)----基本的SQL语句
查看>>
Hadoop源代码分析(MapTask)
查看>>
SQL 2008新实例基础安装
查看>>
关于Google Sitelink
查看>>
zabbix企业应用之监控磁盘读写状态
查看>>
我的友情链接
查看>>
DOS命令行操作计划任务详解
查看>>