Windows phone 8 学习笔记(4) 应用的启动
Windows phone 8 的應用除了可以直接從開始菜單以及應用列表中打開外,還可以通過其他的方式打開。照片中心、音樂+視頻中心提供擴展支持應用從此啟動。另外,我們還可以通過文件關(guān)聯(lián)、URI關(guān)聯(lián)的方式啟動應用。
快速導航:
??? 一、擴展音樂+視頻中心
??? 二、擴展照片中心
??? 三、文件關(guān)聯(lián)以及SD卡訪問
??? 四、URI關(guān)聯(lián)
??? 五、啟動我的其他應用和啟動內(nèi)置應用
一、擴展音樂+視頻中心
1)在音樂+視頻中心啟動應用
擴展音樂+視頻中心第一步就是要保證應用可以從音樂+視頻中心啟動,我們需要手工修改 Windows Phone 的應用清單文件,在WMAppManifest.xml文件上右鍵,選擇打開方式,用XML文本編輯器打開,我們需要設(shè)置App 節(jié)點下 HubType 值為1,代碼如下:
2)更新歷史記錄、最新上市列表
應用集成到音樂+視頻中心后,我們可以更新音樂+視頻中心的歷史記錄列表、歷史記錄正在播放圖塊、最新上市列表等,下面代碼描述了更新的方式。
我們除了可以對媒體庫的音樂進行更新歷史記錄和最新上市列表外,也可以自定義其他音樂。這樣非媒體庫的的音樂也可以更新。但是可能會存在一些問題。下面代碼演示了把安裝文件夾的音樂播放出來,并更新正在播放列表。
[C#] //從安裝文件夾讀取專輯縮略圖 StreamResourceInfo jpgStreamResourceInfo = Application.GetResourceStream(new Uri("myImg.jpg", UriKind.Relative));MediaHistoryItem mediaHistoryItem = new MediaHistoryItem(); //當前歌曲專輯的縮略圖 mediaHistoryItem.ImageStream = jpgStreamResourceInfo.Stream; mediaHistoryItem.Source = string.Empty; //音樂名,會顯示在縮略圖上 mediaHistoryItem.Title = "我的音樂"; mediaHistoryItem.PlayerContext.Add("KeySring", "我的音樂"); //準備播放 mediaElement1.Source = new Uri("1.mp3", UriKind.Relative); mediaElement1.Play();//更新音樂視頻中心的正在播放,非媒體庫音樂貌似要重啟手機才可以看到效果,不知道是不是BUG。 MediaHistory.Instance.NowPlaying = mediaHistoryItem;3)從歷史記錄和最新上市啟動時的播放處理
當用戶在音樂+視頻中心點擊對應項目時,則會自動啟動我們的應用,這個時候我們需要進行一些處理,來確定播放哪一個音樂。我們這里的處理邏輯僅僅考慮媒體庫中存在的音樂。
[C#] protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e){//從音樂視頻中心啟動時,播放相應項。MediaLibrary library = new MediaLibrary();Song _playingSong = null;if (NavigationContext.QueryString.ContainsKey("KeySring")){String songToPlay = NavigationContext.QueryString["KeySring"];foreach (Song song in library.Songs){if (songToPlay == song.Name){_playingSong = song;break;}}if (_playingSong != null)MediaPlayer.Play(_playingSong);}base.OnNavigatedTo(e);}?
二、擴展照片中心
某些時候,用戶可能希望直接從照片中心啟動與照片處理相關(guān)的應用,或者在瀏覽照片時隨手美化渲染照片,或者共享上傳到網(wǎng)絡、發(fā)送到其他應用,這個時候,我們就需要對照片中心進行擴展,擴展之后我們的應用就可以在這里直接啟動。
1)相關(guān)擴展點介紹
1.照片中心:擴展之后用戶可以直接在照片中心啟動您的應用。如下圖:
2.擴展共享選取器:可以從“共享”鏈接啟動應用,并提供將用戶的照片共享到其他位置、網(wǎng)絡,或者電子郵件。效果如下圖:
?????
3.擴展照片編輯選取器:可以從“編輯”鏈接啟動應用并允許用戶編輯他們的照片,如果沒有應用擴展此處,則打開內(nèi)置照片編輯,否則彈出選擇頁面。效果如下圖:
4.擴展富媒體應用:可如果照片是用當前應用保存或者修改后的,則照片會顯示特殊的打開鏈接,富媒體并不是指對照片本身編輯,而是包含圖片文字說明等,以及用于網(wǎng)絡交互等富編輯,比如微博應用。效果如下圖:
????
5.擴展照片應用選取器:這個擴展僅僅在WP7中被支持,以后版本已經(jīng)棄用。相當于WP8中的編輯以及富編輯。
2)擴展照片中心
擴展照片中心需要編輯清單文件,右鍵點擊WMAppManfiest.xml 文件,選擇打開方式,在彈出窗口中選擇XML文本編輯器打開。在 Tokens 元素之后,在 Extensions 元素內(nèi)添加如下代碼:
[XML] <Extensions><!--擴展照片中心--><Extension ExtensionName="Photos_Extra_Hub" ConsumerID="{5B04B775-356B-4AA0-AAF8-6491FFEA5632}" TaskID="_default" /></Extensions>3)擴展照片查看器
上面已經(jīng)介紹過了圖片查看器的相關(guān)擴展點,下面我們通過代碼演示如何實現(xiàn)這些擴展。首先,每個擴展點都需要清單文件的支持,下面我們需要在同樣的位置添加 Extensions項。代碼如下:
[XML] <Extensions><!--擴展照片中心--><Extension ExtensionName="Photos_Extra_Hub" ConsumerID="{5B04B775-356B-4AA0-AAF8-6491FFEA5632}" TaskID="_default" /><!--擴展共享選取器--><Extension ExtensionName="Photos_Extra_Share" ConsumerID="{5B04B775-356B-4AA0-AAF8-6491FFEA5632}" TaskID="_default" /><!--擴展富媒體應用--><Extension ExtensionName="Photos_Rich_Media_Edit" ConsumerID="{5B04B775-356B-4AA0-AAF8-6491FFEA5632}" TaskID="_default" /><!--擴展照片編輯選取器--><Extension ExtensionName="Photos_Extra_Image_Editor" ConsumerID="{5B04B775-356B-4AA0-AAF8-6491FFEA5632}" TaskID="_default" /></Extensions>??? 在清單文件支持這些擴展之后,當用戶通過擴展啟動應用,照片中心默認啟動我們應用的MainPage.xaml,同時通過URI參數(shù)告訴我們是哪張圖片,該做什么處理。下面我們通過在MainPage.xaml中解析URI參數(shù)來實現(xiàn)接受相關(guān)處理參數(shù)信息。如果您的應用有專門的頁面處理,則需要實現(xiàn)URI映射,URI映射請看這里。
[XAML] <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0"><Image x:Name="image1" HorizontalAlignment="Left" Height="480" Margin="10,80,0,0" VerticalAlignment="Top" Width="436"/><TextBlock HorizontalAlignment="Left" Margin="10,36,0,0" TextWrapping="Wrap" Text="圖片來源方式:" VerticalAlignment="Top"/><Button Content="保存" HorizontalAlignment="Left" Margin="315,609,0,0" VerticalAlignment="Top" Click="Button_Click_1"/><TextBlock x:Name="textBlock1" Foreground="Yellow" HorizontalAlignment="Left" Margin="170,36,0,0" Grid.Row="1" TextWrapping="Wrap" Text="未知" VerticalAlignment="Top"/></Grid> [C#] Picture selectedPicture;protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e){IDictionary<string, string> queryStrings = this.NavigationContext.QueryString;if (!queryStrings.ContainsKey("Action")){textBlock1.Text = "無來源";}else{string action = queryStrings["Action"];switch (action){case "ShareContent": textBlock1.Text = "共享選取器";break;case "RichMediaEdit": textBlock1.Text = "富媒體應用";break;case "EditPhotoContent": textBlock1.Text = "照片編輯選取器";break;}MediaLibrary library = new MediaLibrary();if (queryStrings.ContainsKey("FileId")) selectedPicture = library.GetPictureFromToken(queryStrings["FileId"]);else if (queryStrings.ContainsKey("token")) selectedPicture = library.GetPictureFromToken(queryStrings["token"]);else return;BitmapImage bitmapFromPhoto = new BitmapImage();bitmapFromPhoto.SetSource(selectedPicture.GetImage());image1.Source = bitmapFromPhoto;}base.OnNavigatedTo(e);}//保存圖片private void Button_Click_1(object sender, RoutedEventArgs e){MediaLibrary library = new MediaLibrary();library.SavePicture(selectedPicture.Name, selectedPicture.GetImage());}
4)擴展方式總結(jié)
上面我們發(fā)現(xiàn)通過照片查看器啟動的URI中都有一個Action參數(shù),還有一個參數(shù)要么是FileId,要么是token。下面列表歸納一下:
| 擴展點 | 清單文件中的擴展名稱 | URI啟動關(guān)聯(lián)地址 | 支持的平臺 |
| 照片中心 | Photos_Extra_Hub | ? | WP7\WP8 |
| 共享選取器 | Photos_Extra_Share | /MainPage.xaml?Action=ShareContent&FileId=[GUID] | WP7\WP8 |
| 富媒體應用 | Photos_Rich_Media_Edit | /MainPage.xaml?Action=RichMediaEdit&token=[GUID] | WP8 |
| 照片編輯選取器 | Photos_Extra_Image_Editor | /MainPage.xaml?Action=EditPhotoContent&FileId=[GUID] | WP8 |
| 照片應用選取器 | Photos_Extra_Viewer | /MainPage.xaml?token=[GUID] | WP7 |
?
三、文件關(guān)聯(lián)以及SD卡訪問
文件關(guān)聯(lián),顧名思義,就類似于Windows系統(tǒng)中注冊默認的啟動程序一樣。我們也可以注冊我們的應用為某些后綴名文件的默認啟動程序。之前我們講過,一個應用可訪問的存儲位置只有安裝文件夾、本地文件夾、媒體庫這三個位置,但是我們可以通過注冊文件關(guān)聯(lián)的方式,只要是關(guān)聯(lián)的文件,就算在其他位置我們也有可能訪問的到,這個文件可能來自于SD卡,也可能來自于其他應用。
1. 如何注冊文件關(guān)聯(lián)
要處理特定的文件類型,請在應用清單文件中注冊文件關(guān)聯(lián)。同樣我們還是需要右鍵打開方式,選擇Xml文本編輯器的方式打開WMAppManifest.xml文件。必須在Tokens節(jié)點后,添加 Extensions 節(jié)點,在Extensions中我們定義了關(guān)聯(lián)的文件后綴名,已經(jīng)文件的大中小型徽標。代碼如下:
[XML] <Extensions><FileTypeAssociation Name="文件關(guān)聯(lián)描述信息" TaskID="_default" NavUriFragment="fileToken=%s"><Logos><!--定義被關(guān)聯(lián)文件類型顯示徽標,大中小三種--><Logo Size="small" IsRelative="true">medium33x33.png</Logo><Logo Size="medium" IsRelative="true">medium69x69.png</Logo><Logo Size="large" IsRelative="true">large176x176.png</Logo></Logos><!--定義被關(guān)聯(lián)文件擴展名--><SupportedFileTypes><FileType ContentType="application/myfile1">.myfile3</FileType><FileType ContentType="application/myfile2">.myfile2</FileType></SupportedFileTypes></FileTypeAssociation></Extensions>2. 偵聽文件啟動
當用戶通過SD卡或者其他應用打開您所關(guān)聯(lián)的文件類型時,系統(tǒng)將啟動您的應用,并發(fā)送如下格式的URI:
??? /FileTypeAssociation?fileToken=[GUID]
但是我們發(fā)現(xiàn)這個URI并不能直接關(guān)聯(lián)到我們應用的某個頁面,所以現(xiàn)在我們需要定義一個URI映射來處理這個特殊的URL。把它轉(zhuǎn)換成標準URI來引導MainPage.xaml。
注冊URI轉(zhuǎn)換:
首先,我們需要定義一個UriMapper,實現(xiàn)URI轉(zhuǎn)換的邏輯。新建類文件AssociationUriMapper.cs,輸入代碼如下:
[C#] public class AssociationUriMapper : UriMapperBase{public override Uri MapUri(Uri uri){string tempUri = System.Net.HttpUtility.UrlDecode(uri.ToString());//驗證Uri,是否為文件關(guān)聯(lián)引發(fā)if (tempUri.StartsWith("/FileTypeAssociation?fileToken=")){string fileToke = tempUri.Substring(31);//整理成規(guī)范URL,回發(fā)到MainPage.xamlreturn new Uri("/MainPage.xaml?fileToke=" + fileToke, UriKind.Relative);}return uri;}}然后,我們需要在App.cs的InitializePhoneApplication方法中注冊我們的URI轉(zhuǎn)換類。添加方式如下圖:
下面,我們將要把偵聽到的文件識別為文本文件,并顯示出來,代碼如下:
[C#] protected async override void OnNavigatedTo(NavigationEventArgs e) {//獲取URI參數(shù)IDictionary<string, string> queryStrings = NavigationContext.QueryString;if (queryStrings.ContainsKey("fileToke")){var fileToke = queryStrings["fileToke"];//獲取文件名var fileName = SharedStorageAccessManager.GetSharedFileName(fileToke);//本地文件夾var localFolder = Windows.Storage.ApplicationData.Current.LocalFolder;//將文件拷貝到本地文件夾同名文件中var file = await SharedStorageAccessManager.CopySharedFileAsync(localFolder, fileName, NameCollisionOption.ReplaceExisting, fileToke);var stream = await file.OpenAsync(FileAccessMode.Read);StreamReader s = new StreamReader(stream.AsStream(), System.Text.Encoding.Unicode);var fileText = s.ReadToEnd();MessageBox.Show("文件名:" + fileName + "\n內(nèi)容:" + fileText);}base.OnNavigatedTo(e); }3. 啟動關(guān)聯(lián)文件
當?shù)谌綉孟氪蜷_關(guān)聯(lián)文件時,自己本身并不想實現(xiàn)解析文件的邏輯,則可以自動啟動我們的應用來打開。
通過圖示顯示運行的效果:
???
4. 訪問SD卡
如果在SD卡中有我們關(guān)聯(lián)的文件類型,我們同樣可以主動遍歷去訪問它。實現(xiàn)訪問SD卡并讀取文件文本類容的代碼如下:
[XAML] <!--ContentPanel - 在此處放置其他內(nèi)容--><Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0"><ListBox x:Name="listboxFiles" Margin="10,92,135,288"><ListBox.ItemTemplate><DataTemplate><TextBlock Text="{Binding Name}"/></DataTemplate></ListBox.ItemTemplate><ListBox.ItemContainerStyle><Style TargetType="ListBoxItem"><Setter Property="Margin" Value="5"/><Setter Property="Background" Value="Blue"/></Style></ListBox.ItemContainerStyle></ListBox><TextBlock Text="SD卡可讀文件清單:" HorizontalAlignment="Left" Margin="10,53,0,0" TextWrapping="Wrap" VerticalAlignment="Top"></TextBlock><Button Content="打開選擇" HorizontalAlignment="Left" Margin="315,465,0,0" VerticalAlignment="Top" Click="Button_Click_1"/></Grid> [C#] protected override void OnNavigatedTo(NavigationEventArgs e){filesInit();base.OnNavigatedTo(e);}//初始化文件列表,只包含可識別文件private async void filesInit(){//獲取插入手機的SD卡集合,一般最多一張SD卡。var externalStorageDevices = await ExternalStorage.GetExternalStorageDevicesAsync();//獲取集合第一張SD卡ExternalStorageDevice sdCard = externalStorageDevices.FirstOrDefault();if (sdCard == null){MessageBox.Show("并沒有發(fā)現(xiàn)SD卡,請檢查SD卡是否插好。");return;}//獲取根目錄下全部文件var files = await sdCard.RootFolder.GetFilesAsync();listboxFiles.ItemsSource = files.Where(x => x.Name.EndsWith(".myfile1") || x.Name.EndsWith(".myfile2"));}//打開文件列表選擇的文件private async void Button_Click_1(object sender, RoutedEventArgs e){ExternalStorageFile file = listboxFiles.SelectedItem as ExternalStorageFile;if (file == null) return;//讀取文件var stream = await file.OpenForReadAsync();StreamReader s = new StreamReader(stream, System.Text.Encoding.Unicode);var fileText = s.ReadToEnd();MessageBox.Show("文件名:" + file.Name + "\n內(nèi)容:" + fileText);}?
四、URI關(guān)聯(lián)
設(shè)想這樣的應用場景,我們在應用A中,想利用應用B的功能。我們自己不想實現(xiàn)同樣的功能是因為B已經(jīng)做得相當成熟了,沒有必要重復實現(xiàn)。比如:我們單擊一個電話號碼,就想直接打開撥號軟件開始撥打電話;單擊一個電子郵件,直接打開電子郵件的應用去編寫郵件,單擊一個視頻名,就可以打開視頻播放器播放該視頻。這個時候,都需要利用URI關(guān)聯(lián)的功能。
1. 注冊URI關(guān)聯(lián)
URI關(guān)聯(lián)的注冊同樣也需要編輯清單文件,右鍵點擊WMAppManfiest.xml 文件,選擇打開方式,在彈出窗口中選擇XML文本編輯器打開。在 Tokens 元素之后,在 Extensions 元素內(nèi)添加如下代碼:
[XML] <Extensions><!--注冊關(guān)聯(lián)URI,Name部分為您特定的URI前綴--><Protocol Name="testuri" NavUriFragment="encodedLaunchUri=%s" TaskID="_default" /></Extensions>注冊好后,第三方應用可以通過如下URI導航到我們的應用:
testuri:[參數(shù)部分]
2. 偵聽URI
注冊好了URI關(guān)聯(lián)后,系統(tǒng)中其他應用所有前綴為testuri的URI請求都被我們的應用捕獲,我們還需要定義一個URI轉(zhuǎn)換來讓MainPage.xaml獲取。
[C#] class AssociationUriMapper : UriMapperBase{private string tempUri;public override Uri MapUri(Uri uri){tempUri = System.Net.HttpUtility.UrlDecode(uri.ToString());//驗證Uri,是否為已注冊的關(guān)聯(lián)if (tempUri.StartsWith("/Protocol?encodedLaunchUri=testuri:")){string uriMsg = tempUri.Substring(35);return new Uri("/MainPage.xaml?Msg=" + uriMsg, UriKind.Relative);}return uri;}}我們還需要在InitializePhoneApplication 方法中注冊URI轉(zhuǎn)換
[C#] /* 在App InitializePhoneApplication 方法中,我們需要注冊URI轉(zhuǎn)換 */// 請勿向此方法中添加任何其他代碼private void InitializePhoneApplication(){if (phoneApplicationInitialized)return;// 創(chuàng)建框架但先不將它設(shè)置為 RootVisual;這允許初始// 屏幕保持活動狀態(tài),直到準備呈現(xiàn)應用程序時。RootFrame = new PhoneApplicationFrame();RootFrame.Navigated += CompleteInitializePhoneApplication;//我們插入的代碼部分!!!//注冊我們的URI轉(zhuǎn)換RootFrame.UriMapper = new AssociationUriMapper();// 處理導航故障RootFrame.NavigationFailed += RootFrame_NavigationFailed;// 在下一次導航中處理清除 BackStack 的重置請求,RootFrame.Navigated += CheckForResetNavigation;// 確保我們未再次初始化phoneApplicationInitialized = true;}在MainPage.xaml中處理URI關(guān)聯(lián)請求,代碼如下:
[C#] protected override void OnNavigatedTo(NavigationEventArgs e){IDictionary<string, string> queryStrings = NavigationContext.QueryString;if (queryStrings.ContainsKey("Msg")) MessageBox.Show("來自URI關(guān)聯(lián)調(diào)用方信息:\n" + queryStrings["Msg"]);base.OnNavigatedTo(e);}3. 啟動URI
調(diào)用方是如何啟動這個關(guān)聯(lián)URI呢?代碼如下:
[C#] private async void Button_Click_1(object sender, RoutedEventArgs e){var c = await Windows.System.Launcher.LaunchUriAsync(new System.Uri("testuri:"+textbox1.Text));}最后,我們看看演示效果:
??
五、啟動我的其他應用和啟動內(nèi)置應用
1. 啟動我的其他應用
我的應用是指發(fā)布者ID一樣的應用,我們可以在清單文件里面設(shè)置這個ID,下面的代碼展示了啟動我發(fā)布的應用列表中第二個應用。
[C#] //啟動我發(fā)布的其他應用private void Button_Click_1(object sender, RoutedEventArgs e){//查詢本機其他與當前應用發(fā)行者ID相同的其他應用IEnumerable<Package> apps = Windows.Phone.Management.Deployment.InstallationManager.FindPackagesForCurrentPublisher();//啟動第二個應用apps.Skip(1).First().Launch(string.Empty);}2. 啟動內(nèi)置應用
內(nèi)置應用指WP8手機系統(tǒng)本身自帶的應用,我們可以通過固定的方式啟動它們。下面代碼演示了如何使用。
[C#] //啟動內(nèi)置應用private void Button_Click_2(object sender, RoutedEventArgs e){//打開IE訪問百度//Windows.System.Launcher.LaunchUriAsync(new Uri("http://www.baidu.com"));//打開內(nèi)置郵箱發(fā)送郵件//Windows.System.Launcher.LaunchUriAsync(new Uri("mailto:username@163.com"));//呼叫手機//Windows.System.Launcher.LaunchUriAsync(new Uri("tel:13900000000"));//啟動Wi-Fi 設(shè)置//Windows.System.Launcher.LaunchUriAsync(new Uri("ms-settings-wifi:"));//其他的//ms-settings-accounts: 啟動帳戶設(shè)置應用。//ms-settings-airplanemode: 啟動飛行模式設(shè)置應用。//ms-settings-bluetooth: 啟動藍牙設(shè)置應用。//ms-settings-cellular: 啟動手機網(wǎng)絡設(shè)置應用。//ms-settings-emailandaccounts: 啟動電子郵件和帳戶設(shè)置應用。//ms-settings-location: 啟動位置設(shè)置應用。//ms-settings-lock: 啟動鎖屏設(shè)置應用。//ms-settings-wifi: 啟動 Wi-Fi 設(shè)置應用。//啟動 Windows Phone 商店 并顯示特定應用的詳細信息頁面。//Windows.System.Launcher.LaunchUriAsync(new Uri("zune:navigate?appid=fdf05477-814e-41d4-86cd-25d5a50ab2d8")); //啟動 商店 并顯示調(diào)用應用的查看頁面。//Windows.System.Launcher.LaunchUriAsync(new Uri("zune:reviewapp"));//啟動 商店 并顯示特定應用的查看頁面//Windows.System.Launcher.LaunchUriAsync(new Uri("zune:reviewapp?appid=appfdf05477-814e-41d4-86cd-25d5a50ab2d8"));//啟動 商店 并搜索//Windows.System.Launcher.LaunchUriAsync(new Uri("zune:search?keyword=關(guān)鍵字&publisher=發(fā)布者名稱&contenttype=app"));}?
作者:[Lipan]出處:[http://www.cnblogs.com/lipan/]
版權(quán)聲明:本文的版權(quán)歸作者與博客園共有。轉(zhuǎn)載時須注明原文出處以及作者,并保留原文指向型鏈接,不得更改原文內(nèi)容。否則作者將保留追究其法律責任。 《上一篇:Windows phone 8 學習筆記 通信 系列目錄 下一篇:Windows phone 8 學習筆記 圖塊與通知》
轉(zhuǎn)載于:https://www.cnblogs.com/lipan/archive/2013/06/04/3080275.html
總結(jié)
以上是生活随笔為你收集整理的Windows phone 8 学习笔记(4) 应用的启动的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 姓白的网名136个
- 下一篇: java信息管理系统总结_java实现科