Windows phone 8 学习笔记(9) 集成

原文:Windows phone 8 学习笔记(9) 集成

 本节整理了之前并没有提到的Windows phone 8 系统相关集成支持,包括选择器、锁定屏幕的、联系人的访问等。选择器列举了若干内置应用提供的相关支持;锁定屏幕展示了我们可以对锁定屏幕提供背景图像,屏幕通知等功能;联系人访问演示了对联系人的管理维护和只读访问。

快速导航:
    一、选择器
    二、锁定屏幕

    三、联系人访问

一、选择器

选择器为手机内置应用对您的开发提供的相关支持,通过选择器你可以直接调用相机应用捕获一张照片到你的应用,或者调用联系人的相关资料,保存铃声等操作。

下面列举了大部分常用选择器:
    1.地址选择器
    2.相机拍照选择器
    3.邮箱选择器
    4.电话选择器
    5.照片选择器
    6.保存联系人选择器
    7.保存电子邮件地址选择器
    8.保存电话号码选择器
    9.保存铃声选择器

下面代码罗列了调用方法。

[C#]

        //地址选择器
        void showAddressChooserTask()
        {
            var addressChooserTask = new AddressChooserTask();
            addressChooserTask.Completed += new EventHandler<AddressResult>((a, b) =>
            {
                if (b.TaskResult == TaskResult.OK)
                {
                    MessageBox.Show(b.DisplayName + "的地址是:" + b.Address);
                }
            });
            addressChooserTask.Show();
        }

        //相机拍照选择器
        void showCameraCaptureTask()
        {
            var cameraCaptureTask = new CameraCaptureTask();
            cameraCaptureTask.Completed += new EventHandler<PhotoResult>((a, b) =>
            {
                if (b.TaskResult == TaskResult.OK)
                {
                    Image image = new Image();
                    var bitmapImage = new BitmapImage();
                    bitmapImage.SetSource(b.ChosenPhoto);
                    image.Source = bitmapImage;
                    ContentPanel.Children.Add(image);
                    MessageBox.Show(b.OriginalFileName);
                }
            });
            cameraCaptureTask.Show();
        }

        //邮箱选择器
        void showEmailAddressChooserTask()
        {
            var emailAddressChooserTask = new EmailAddressChooserTask();
            emailAddressChooserTask.Completed += new EventHandler<EmailResult>((a, b) =>
            {
                if (b.TaskResult == TaskResult.OK)
                {
                    MessageBox.Show(b.DisplayName + "的邮箱是:" + b.Email);
                }
            });
            emailAddressChooserTask.Show();
        }

        //电话选择器
        void showPhoneNumberChooserTask()
        {
            var phoneNumberChooserTask = new PhoneNumberChooserTask();
            phoneNumberChooserTask.Completed += new EventHandler<PhoneNumberResult>((a, b) =>
            {
                if (b.TaskResult == TaskResult.OK)
                {
                    MessageBox.Show(b.DisplayName + "的电话是:" + b.PhoneNumber);
                }
            });
            phoneNumberChooserTask.Show();
        }

        //照片选择器
        void showPhotoChooserTask()
        {
            var photoChooserTask = new PhotoChooserTask();
            photoChooserTask.Completed += new EventHandler<PhotoResult>((a, b) =>
            {
                if (b.TaskResult == TaskResult.OK)
                {
                    Image image = new Image();
                    var bitmapImage = new BitmapImage();
                    bitmapImage.SetSource(b.ChosenPhoto);
                    image.Source = bitmapImage;
                    ContentPanel.Children.Add(image);
                    MessageBox.Show(b.OriginalFileName);
                }
            });
            photoChooserTask.Show();
        }

        //保存联系人选择器
        void showSaveContactTask()
        {
            var saveContactTask = new SaveContactTask();
            saveContactTask.Completed += new EventHandler<SaveContactResult>((a, b) =>
            {
                switch (b.TaskResult)
                {
                    case TaskResult.OK:
                        MessageBox.Show("保存成功。");
                        break;
                    case TaskResult.Cancel:
                        MessageBox.Show("取消保存。");
                        break;
                    case TaskResult.None:
                        MessageBox.Show("保存失败。");
                        break;
                }
            });
            //添加一些默认值
            saveContactTask.FirstName = "三";
            saveContactTask.LastName = "张";
            saveContactTask.MobilePhone = "13900000000";
            saveContactTask.Show();
        }

        //保存电子邮件地址选择器
        void showSaveEmailAddressTask()
        {
            var saveEmailAddressTask = new SaveEmailAddressTask();
            saveEmailAddressTask.Completed += new EventHandler<TaskEventArgs>((a, b) =>
            {
                switch (b.TaskResult)
                {
                    case TaskResult.OK:
                        MessageBox.Show("保存成功。");
                        break;
                    case TaskResult.Cancel:
                        MessageBox.Show("取消保存。");
                        break;
                    case TaskResult.None:
                        MessageBox.Show("保存失败。");
                        break;
                }
            });
            //添加默认值
            saveEmailAddressTask.Email = "mail@163.com";
            saveEmailAddressTask.Show();
        }

        //保存电话号码选择器
        void showSavePhoneNumberTask()
        {
            var savePhoneNumberTask = new SavePhoneNumberTask();
            savePhoneNumberTask.Completed += new EventHandler<TaskEventArgs>((a, b) =>
            {
                switch (b.TaskResult)
                {
                    case TaskResult.OK:
                        MessageBox.Show("保存成功。");
                        break;
                    case TaskResult.Cancel:
                        MessageBox.Show("取消保存。");
                        break;
                    case TaskResult.None:
                        MessageBox.Show("保存失败。");
                        break;
                }
            });
            //添加默认值
            savePhoneNumberTask.PhoneNumber = "13900000000";
            savePhoneNumberTask.Show();
        }

        //保存铃声选择器
        void showSaveRingtoneTask()
        {
            var saveRingtoneTask = new SaveRingtoneTask();
            saveRingtoneTask.Completed += new EventHandler<TaskEventArgs>((a, b) =>
            {
                switch (b.TaskResult)
                {
                    case TaskResult.OK:
                        MessageBox.Show("保存成功。");
                        break;
                    case TaskResult.Cancel:
                        MessageBox.Show("取消保存。");
                        break;
                    case TaskResult.None:
                        MessageBox.Show("保存失败。");
                        break;
                }
            });
            //铃声文件路径
            saveRingtoneTask.Source = new Uri("appdata:/烟花易冷.mp3");
            //铃声在列表中的显示名称
            saveRingtoneTask.DisplayName = "烟花易冷";
            saveRingtoneTask.Show();
        }

 

二、锁定屏幕

在手机锁定屏幕界面,我们的应用可以更新背景图像和添加屏幕通知。

2.锁定屏幕背景

要使应用能够更新锁定屏幕背景图像,我们必须在应用程序清单文件中声明。右键选择打开方式,选择XML文本编辑器打开WMAppManifest.xml,在Tokens下添加扩展内容。

[XML]

    <Extensions>
      <!--指示当前应用可以为锁定屏幕提供背景图像-->
      <Extension ExtensionName="LockScreen_Background" ConsumerID="{111DFF24-AA15-4A96-8006-2BFF8122084F}" TaskID="_default" />
    </Extensions>

下面看看如何更新手机锁定屏幕背景为安装文件夹下的1.jpg图片。

[C#]

        private async void SetLockImg()
        {
            try
            {
                //指示当前应用是否为锁定屏幕提供程序
                var isProvider = Windows.Phone.System.UserProfile.LockScreenManager.IsProvidedByCurrentApplication;
                if (!isProvider)
                {
                    //设置当前应用为锁定屏幕提供程序
                    var op = await Windows.Phone.System.UserProfile.LockScreenManager.RequestAccessAsync();
                    //应用是否已设置为锁定屏幕提供程序
                    isProvider = op == Windows.Phone.System.UserProfile.LockScreenRequestResult.Granted;
                }

                if (isProvider)
                {
                    // 设置锁定屏幕的背景图像
                    Windows.Phone.System.UserProfile.LockScreen.SetImageUri(new Uri("ms-appx:///1.jpg", UriKind.Absolute));

                    // 获取锁定屏幕的图像
                    var currentImage = Windows.Phone.System.UserProfile.LockScreen.GetImageUri();
                    System.Diagnostics.Debug.WriteLine("The new lock screen background image is set to {0}", currentImage.ToString());
                }
                else
                {
                    MessageBox.Show("不能提供锁定屏幕背景 ");
                }
            }
            catch
            {
            }
        }

 

2.锁定屏幕通知

应用可以设置通知信息并展示到锁定屏幕的通知区域,我们需要首先在应用程序清单文件中指定用于显示徽标的png图片文件。我们右键选择打开方式,选择XML文本编辑器打开WMAppManifest.xml,设定徽标为LockImage.png。修改Tokens标记的DeviceLockImageURI元素如下:

[XML]

<DeviceLockImageURI IsRelative="true" IsResource="false">LockImage.png</DeviceLockImageURI>

 

另外,我们还需要在清单文件中声明我们可以在锁定屏幕中显示通知。右键选择打开方式,选择XML文本编辑器打开WMAppManifest.xml,在Tokens下添加扩展内容。

[XML]

    <Extensions>
      <!--指示当前应用可以添加屏幕通知-->
      <Extension ExtensionName="LockScreen_Notification_IconCount" ConsumerID="{111DFF24-AA15-4A96-8006-2BFF8122084F}" TaskID="_default" />
      <Extension ExtensionName="LockScreen_Notification_TextField" ConsumerID="{111DFF24-AA15-4A96-8006-2BFF8122084F}" TaskID="_default" />
    </Extensions>

 

设置完成后,我们就可以在锁定屏幕展示通知了,但具体的展示还需要用户在系统设置的锁定屏幕页,添加我们的应用为锁定屏幕通知提供程序。全部设置好后,只要默认的图标有通知的数值,这个时候锁定屏幕提示就会展示。

3.从锁定屏幕设置页启动应用

注册为锁定屏幕背景提供程序后,我们的应用可以从锁定屏幕设置页启动,默认打开mainpage,我们需要处理启动uri。

[C#]

        //从系统锁定屏幕设置页面打开时的处理
        protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
        {
            base.OnNavigatedTo(e);

            string lockscreenKey = "WallpaperSettings";
            string lockscreenValue = "0";

            bool lockscreenValueExists = NavigationContext.QueryString.TryGetValue(lockscreenKey, out lockscreenValue);

            if (lockscreenValueExists)
            {
                //这里可以定义一个锁定屏幕背景增强设置的页面。
                MessageBox.Show("从锁定屏幕设置打开。");
            }
        }

 

三、联系人访问

手机内置的联系人数据库支持编程的方式去访问。我们有两种方式访问,一种是只读访问,还有一种是可以执行增删改查操作。

1.只读联系人访问

下面演示了通过查询返回只读联系人列表。

[C#]

        //联系人数据
        private void Button_Click_1(object sender, RoutedEventArgs e)
        {

            Contacts cons = new Contacts();
            cons.SearchCompleted += new EventHandler<ContactsSearchEventArgs>(Contacts_SearchCompleted);
            //参数1: 关键字;参数2:过滤类型,包含显示名称、电话号码、邮件地址、是否固定到开始屏幕等
            cons.SearchAsync("139", FilterKind.PhoneNumber, "状态");
        }

        void Contacts_SearchCompleted(object sender, ContactsSearchEventArgs e)
        {
            //获取到的联系人的集合
            listbox1.ItemsSource = e.Results;
        }

 

2.自定义联系人存储

通过这种方式我们可以对系统联系人列表做各类增删改查操作,我们将演示如何操作。

[XAML]

        <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
            <ListBox x:Name="listbox1" Margin="0,10,10,173">
                <ListBox.ItemTemplate>
                    <DataTemplate>
                        <StackPanel Orientation="Horizontal">
                            <TextBlock Text="{Binding Id}"></TextBlock>
                            <TextBlock Text="  "></TextBlock>
                            <TextBlock Text="{Binding FamilyName}"></TextBlock>
                            <TextBlock Text="{Binding GivenName}"></TextBlock>
                        </StackPanel>
                    </DataTemplate>
                </ListBox.ItemTemplate>
            </ListBox>

            <Button Content="新增" HorizontalAlignment="Left" Margin="10,603,0,0" VerticalAlignment="Top" Click="Button_Click_1"/>
            <Button Content="修改" Margin="106,603,251,21" Click="Button_Click_2"/>
            <Button Content="删除" HorizontalAlignment="Left" Margin="205,603,0,0" VerticalAlignment="Top" Click="Button_Click_3"/>
            <TextBlock x:Name="textblock1" HorizontalAlignment="Left" Margin="24,556,0,0" TextWrapping="Wrap" Text="" VerticalAlignment="Top"/>
            <Button Content="查看手机号" HorizontalAlignment="Left" Margin="291,603,0,0" VerticalAlignment="Top" Click="Button_Click_4"/>
            <Button Content="只读联系人访问〉" HorizontalAlignment="Left" Margin="224,533,0,0" VerticalAlignment="Top" Width="232" Click="Button_Click_5"/>
        </Grid>

 

[C#]

    public partial class MainPage : PhoneApplicationPage
    {
        // 构造函数
        public MainPage()
        {
            InitializeComponent();
            Query();
        }

        //新增联系人
        async Task Add(string familyName, string givenName)
        {
            ContactStore store = await ContactStore.CreateOrOpenAsync();
            StoredContact contact = new StoredContact(store);
            contact.FamilyName = familyName;
            contact.GivenName = givenName;

            //获取已知联系人属性
            IDictionary<string, object> props = await contact.GetPropertiesAsync();
            props.Add(KnownContactProperties.Telephone, "18600000000");

            //获取扩展的联系人属性
            IDictionary<string, object> extprops = await contact.GetExtendedPropertiesAsync();
            extprops.Add("扩展", "扩展属性");

            await contact.SaveAsync();

        }

        //查询联系人,并绑定到列表
        async void Query()
        {
            ContactStore store = await ContactStore.CreateOrOpenAsync();
            ContactQueryResult result = store.CreateContactQuery();
            IReadOnlyList<StoredContact> contacts = await result.GetContactsAsync();

            listbox1.ItemsSource = contacts;
        }

        //查询已知属性
        async void GetPropertie(StoredContact contact)
        {
            IDictionary<string, object> props = await contact.GetPropertiesAsync();
            if (props.Keys.Contains(KnownContactProperties.Telephone))
            {
                MessageBox.Show("手机:" + props[KnownContactProperties.Telephone].ToString());
            }
        }

        //更新联系人
        async Task Update(string Id)
        {
            try
            {
                ContactStore store = await ContactStore.CreateOrOpenAsync();
                var contact = await store.FindContactByIdAsync(Id);
                if (contact != null)
                {
                    contact.FamilyName = "赵";
                    contact.GivenName = "六";
                    await contact.SaveAsync();
                }
            }
            catch (Exception e)
            {
                textblock1.Text = e.Message;
            }
        }

        //删除联系人
        async private Task Delete(string Id)
        {
            try
            {
                ContactStore store = await ContactStore.CreateOrOpenAsync();
                await store.DeleteContactAsync(Id);
            }
            catch (Exception e)
            {
                textblock1.Text = e.Message;
            }
        }

        //新增
        private async void Button_Click_1(object sender, RoutedEventArgs e)
        {
            string[] familyNames = new string[] { "赵", "钱", "孙", "李", "周" };
            string[] givenNames = new string[] {"云","权","飞燕","白","公瑾" };
            Random r = new Random();

            await Add(familyNames[r.Next(0, familyNames.Length)], givenNames[r.Next(0, givenNames.Length)]);
            Query();
        }
        //修改
        private async void Button_Click_2(object sender, RoutedEventArgs e)
        {

           var contact= listbox1.SelectedValue as StoredContact;
           if (contact == null) return;
           await Update(contact.Id);
           Query();
        }

        //删除
        private async void Button_Click_3(object sender, RoutedEventArgs e)
        {
            var contact = listbox1.SelectedValue as StoredContact;
            if (contact == null) return;
            await Delete(contact.Id);
            Query();
        }

        //查看手机号
        private void Button_Click_4(object sender, RoutedEventArgs e)
        {
            var contact = listbox1.SelectedValue as StoredContact;
            if (contact == null) return;
            GetPropertie(contact);
        }

        private void Button_Click_5(object sender, RoutedEventArgs e)
        {
            NavigationService.Navigate(new Uri("/Page1.xaml", UriKind.Relative));
        }
    }

 

作者:李盼(Lipan)
出处:[Lipan]http://www.cnblogs.com/lipan/
版权声明:本文的版权归作者与博客园共有。转载时须注明本文的详细链接,否则作者将保留追究其法律责任。

《上一篇:Windows phone 8 学习笔记 定位地图导航
系列目录
下一篇:没有了》

时间: 2024-10-21 14:56:59

Windows phone 8 学习笔记(9) 集成的相关文章

Windows phone 8 学习笔记(4) 应用的启动

原文:Windows phone 8 学习笔记(4) 应用的启动 Windows phone 8 的应用除了可以直接从开始菜单以及应用列表中打开外,还可以通过其他的方式打开.照片中心.音乐+视频中心提供扩展支持应用从此启动.另外,我们还可以通过文件关联.URI关联的方式启动应用. 快速导航:     一.扩展音乐+视频中心     二.扩展照片中心     三.文件关联以及SD卡访问     四.URI关联     五.启动我的其他应用和启动内置应用 一.扩展音乐+视频中心 1)在音乐+视频中心

Windows录音API学习笔记--转

Windows录音API学习笔记 结构体和函数信息  结构体 WAVEINCAPS 该结构描述了一个波形音频输入设备的能力. typedef struct {     WORD      wMid; 用于波形音频输入设备的设备驱动程序制造商标识符.     WORD      wPid; 声音输入设备的产品识别码.     MMVERSION vDriverVersion; 用于波形音频输入设备的设备驱动程序的版本号.高位字节是主版本号,低字节是次版本号.     CHAR      szPna

Windows phone 8 学习笔记(8) 定位地图导航

原文:Windows phone 8 学习笔记(8) 定位地图导航  Windows phone 8 已经不使用自家的bing地图,新地图控件可以指定制图模式.视图等.bing地图的定位误差比较大,在模拟器中测试新地图貌似比较理想.本节主要讲解下位置服务以及新地图控件的使用. 快速导航:     一.定位服务     二.地图和导航 一.定位服务 通过手机定位服务可以开发利用手机地理位置的应用.我们可以通过应用监视手机行踪,配合地图使用可以用于导航等.定位服务可以及时取得手机地理位置,也可以持续

Windows phone 8 学习笔记(5) 图块与通知

原文:Windows phone 8 学习笔记(5) 图块与通知 基于metro风格的Windows phone 8 应用提到了图块的概念,它就是指启动菜单中的快速启动图标.一般一个应用必须有一个默认图块,还可以有若干个次要图块.另外,通知与图块的关系比较密切,我们可以通过在接受到消息时动态更新图块来达到适时的效果.我们本节把图块和通知放在一起讲. 快速导航:    一.图块    二.图块更新计划    三.本地通知    四.推送通知 一.图块 1)定义默认图块 默认图块只能在清单文件中定义

Windows phone 8 学习笔记(3) 通信

原文:Windows phone 8 学习笔记(3) 通信 Windows phone 8 可利用的数据通信方式比较广泛,在硬件支持的前提下,我们可以利用WiFi.蓝牙.临近感应等多种方式.数据交互一般通过套接字来完成,我们将在本文详细的分析. 快速导航:     一.WP8套接字     二.蓝牙     三.NFC     四.获取网络状态     五.访问web的几种方式 一.WP8套接字 1)创建套接字客户端 Windows phone 8中的套接字并不支持发布服务端,我们只能利用它在手

Windows phone 8 学习笔记(2) 数据文件操作

原文:Windows phone 8 学习笔记(2) 数据文件操作 Windows phone 8 应用用于数据文件存储访问的位置仅仅限于安装文件夹.本地文件夹(独立存储空间).媒体库和SD卡四个地方.本节主要讲解它们的用法以及相关限制性.另外包括本地数据库的使用方式. 快速导航:     一.分析各类数据文件存储方式     二.安装文件夹     三.本地文件夹(独立存储空间)     四.媒体库操作     五.本地数据库 一.分析各类数据文件存储方式 1)安装文件夹 安装文件夹即应用安装

Windows phone 8 学习笔记(6) 多任务

原文:Windows phone 8 学习笔记(6) 多任务 Windows phone 8 是一个单任务操作系统,任何时候都只有一个应用处于活跃状态,这里的多任务是指对后台任务的支持.本节我们先讲讲应用程序的运行状态,然后看看支持的后台任务,包括:后台代理.后台音频.后台文件传输.后台辅助线程等. 快速导航:     一.应用的状态     二.后台代理     三.后台音频     四.后台文件传输     五.后台辅助线程 一.应用的状态 1)应用的运行状态 我们通过图解来分析应用的运行状

《Advanced Windows Debugging》学习笔记

看完了很久,也一直没有完成这篇博客,在项目使用中,大多数还是用到其中的一些命令去解析,目前没有太多机会,可以让自己用基本命令去锻炼一下"遍历堆链表"等高级调试技巧.看完这本书给我最大的感觉是: 当你觉得你有些比较难解决的调试或检测问题的时候,不妨查一查是不是有相应的工具.开发过程中需要的各种分析.检测.调试工具,这本书上都有或多或少的讲解. WinDbg 堆栈解析能力天生比vs强很多.每当程序宕掉,发现Visual studio 的[Call Stack]窗口全是汇编地址的时候,我会果

Windows驱动开发工具 WDK 学习笔记(1)

目标:能够把电脑当作一个集成有高性能处理器的开发板用起来,当然,还自带了一个高级的操作系统Windows(必须的).总之,就是在一个带了操作系统的高性能开发板上的驱动程序开发. 性质:纯属业余爱好 1.昨天下载了WDK 7.1.0 Free版(From MS的正版,需要注册一个Windows Live ID,下载链接http://www.microsoft.com/downloads/en/confirmation.aspx?familyId=36a2630f-5d56-43b5-b996-76