Nokia Developer sitesinde yeralan Adding libraries to the project makalesinde Universal App projesine Nokia Imaging SDK kütüphanelerinin nasıl ekleneceği anlatılmış. Yönergeleri adım adım izleyelim.
Öncelikle bir Universal App projesi oluşturmamız veya açmamız lazım;
Projenin Solution Explorer panelinde görünen References kısmına sağ tuşla tıklamalı ve Manage Nuget Packages menüsünü seçmeliyiz.
Online kategorisi altından Nokia Imaging SDK paketini aratarak bulmalı ve Install butonuna tıklayarak projemize eklemeliyiz.
Ben bu yazıyı yazarken Nokia Imaging SDK, Any CPU ve x64 derlemeler ile uyumsuz olduğu için Build Configurations altından Any CPU ve x64 seçeneklerini kaldırmamız gerekiyor. Öncelikle solution‘a sağ tuşla tıklayalım ve Configuration Manager menüsünü seçelim.
Active Solution Platform kısmında Edit seçeneğini seçelim ve açılan pencerede Any CPU ve x64 seçeneklerini Remove butonuna tıklayarak kaldıralım.
Artık projemiz Nokia Imaging SDK referansına sahip ve geliştirme yapmaya başlayabiliriz.
MSDN‘de yeralan How to detect network changes for Windows Phone 8 makalesine göre Windows Phone cihazın WiFi üzerinden internete bağlı olduğunu anlamak için DeviceNetworkInformation class‘ının IsWiFiEnabled property‘sini kullanabiliriz.
Bu property sayesinde çok hızlı bir şekilde cihazda WiFi özelliğinin aktif olup/olmadığını yakalayabiliriz, fakat cihaz üzerinde WiFi aktif olabilir ama internete 3G üzerinden bağlı olabilir, DeviceNetworkInformation.IsWiFiEnabled bu durumda gene true değerini döndürecektir.
Eğer uygulamamızın çalıştığı cihazın internete WiFi üzerinden bağlı olduğundan emin olmak istiyorsak bir kontrol daha yapmalıyız.
NetworkInterface class‘ının NetworkInterfaceType property‘si eğer NetworkInterfaceType enum‘ından Wireless80211 değerine sahipse, cihazın WiFi üzerinden internete bağlı olduğundan emin olabiliriz.
Bu durumda yapmamız gereken kontrol aşağıdaki gibi olmalı;
if (DeviceNetworkInformation.IsWiFiEnabled && NetworkInterface.NetworkInterfaceType == NetworkInterfaceType.Wireless80211) { // Cihaz WiFi üzerinden internete bağlı }
Windows Store ve Windows Phone için tek bir uygulama geliştiriyorsunuz (Universal App) ve uygulamanın çalıştığı cihazın ekran çözünürlüğünü bulmanız gerekiyor.
Öncelikle Windows.Graphics.Display namespace‘inde yeralan DisplayInformation sınıfının RawPixelsPerViewPixel property‘sinin değerini okuyalım;
var rawPixelPerView = DisplayInformation.GetForCurrentView().RawPixelsPerViewPixel;</pre>
Şimdi ekran genişliği ve yüksekliği bilgilerini okuyarak yukarıda bulduğumuz değişken ile çarparak ekran çözünürlüğünü hesaplayabiliriz;
var width = Window.Current.Bounds.Width * rawPixelPerView; var height = Window.Current.Bounds.Height * rawPixelPerView;
Hesapladığımız ekran çözünürlüğünü bir MessageDialog aracılığı ile kullanıcıya göstermek için ShowAsync() methodunu kullanıyoruz;
var dialog = new MessageDialog(string.Format("Çözünürlük: {0} * {1}", width, height); dialog.ShowAsync();
Universal App projesi oluşturduktan sonra Solution Explorer içerisine bakacak olursanız [ProjectName].Shared isimli bir projenin daha yer aldığını görürsünüz.
Shared Project içerisinde hem Windows Store, hem de Windows Phone projelerinizde ortak olarak kullanacağınız dosyaları barındırabiliyorsunuz.
Örneğin, App.xaml ve App.xaml.cs dosyaları Shared Project içerisinde oluşturuluyor ve hem Windows Store hem de Windows Phone projeleri tarafından ortak kullanılıyor.
Shared Project içerisinde Assets isminde bir dizin oluşturabilir ve iki projede de ortak kullanacağımız görsel dosyalarını, ses dosyalarını tek bir yerden yönetebiliriz.
Hatta Pages isminde bir dizin içerisinde, iki projede de ortak olacak ekranları oluşturabiliriz.
Bazı durumlarda bir ekranın her iki projede de aynı şekilde gözükmesini ama farklı davranmasını isteyebiliriz. Bu durumda ilgili ekranın xaml uzantılı dosyasını Shared Project içerisine, xaml.cs (CodeBehind) dosyalarını ise her projenin içerisine ayrı ayrı koyabiliriz.
Tam tersi durum da söz konusu olabilir, bir ekranın iki projede de farklı gözükmesini ama aynı şekilde davranmasını isteyebiliriz. Bu durumda da ilgili ekranın xaml uzantılı dosyalarını her projenin içerisinde, xaml.cs uzantılı (CodeBehind) dosyasını da Shared Project içerisinde oluşturabiliriz.
Shared Project içerisinde yer alan kod dosyalarında platform’a özel değişiklik yapmamız gerekiyorsa aşağıdaki örnekte gözüktüğü gibi kontroller yapabilmemiz mümkün;
#if WINDOWS_PHONE_APP //Windows Phone platformunda çalışacak kodlar #endif
#if WINDOWS_APP //Windows platformunda çalışacak kodlar #endif
Windows Store için geliştireceğimiz uygulama içerisinden fotoğraf ve video çekecek ve Fotoğraflar ve Videolar dizinlerine kaydedeceğiz.
Yeni oluşturduğumuz projenin Package.appxmanifest dosyasını açıyor ve Capabilities tabında yeralan Webcam, Videos Library, Pictures Library kutucuklarını işaretliyoruz. Böylece uygulamamızın çalışırken ihtiyaç duyacağı yetkileri kullanıcıdan talep edilmesini sağlıyoruz.
MainPage.xaml dosyasını açarak içerisine aşağıdaki xaml kodlarını ekleyelim ve ekranın altında bir AppBar gözükmesini, içerisinde bir adet StackPanel iki adette Button olmasını sağlayalım;
<Page.BottomAppBar> <AppBar> <StackPanel Orientation=”Horizontal” HorizontalAlignment=”Right”> <Button Style=”{StaticResource PhotoAppBarButtonStyle}” Click=”PhotoButton_Click /”> <Button Style=”{StaticResource VideoAppBarButtonStyle}” Click=”VideoButton_Click /”> </StackPanel> </AppBar> </Page.BottomAppBar></pre>
Öncelikle PhotoButton_Click methodunun içini dolduralım;
private async void PhotoButton_Click(object sender, RoutedEventArgs e) { var camera = new CameraCaptureUI(); var capture = await camera.CaptureFileAsync(CameraCaptureUIMode.Photo); if (capture != null) { var file = await KnownFolders.PicturesLibrary.CreateFileAsync(Guid.NewGuid().ToString("N") + ".jpg", CreationCollisionOption.ReplaceExisting); await capture.CopyAndReplaceAsync(file); } }
İlk olarak CameraCaptureUI sınıfından yeni bir değişken oluşturup, CaptureFileAsync() methodunu çağırıyoruz, parametre olarak CameraCaptureUIMode.Photo değerini veriyoruz, böylece fotoğraf çekmek için gerekli hazırlıklarımızı tamamlamış oluyoruz.
KnownFolders sınıfının PicturesLibrary özelliği sayesinde cihazın fotoğraf kütüphanesine erişiyoruz ve CreateFileAsync() methodunu kullanarak çekilen fotoğrafı kaydedebileceğimiz bir dosya oluşturuyoruz.
capture ismindeki değişkenin CopyAndReplaceAsync() methodu sayesinde webcam kullanılarak çekilen resmi kaydediyoruz.
Video çekimi yapacak VideoButton_Click methodunun içi PhotoButton_Click methoduna çok benziyor;
private async void VideoButton_Click(object sender, RoutedEventArgs e) { var camera = new CameraCaptureUI(); var capture = await camera.CaptureFileAsync(CameraCaptureUIMode.Video); if (capture != null) { var file = await KnownFolders.VideosLibrary.CreateFileAsync(Guid.NewGuid().ToString("N") + ".wmv", CreationCollisionOption.ReplaceExisting); await capture.CopyAndReplaceAsync(file); } } Üç önemli değişiklik var; * *camera* değişkeninin *CaptureFileAsync()* methoduna parametre olarak *CameraCaptureUIMode.Photo* değeri yerine *CameraCaptureUIMode.Video* değerini veriyoruz * *KnownFolders* sınıfının *PicturesLibrary* özelliği yerine *VideosLibrary* özelliğini kullanıyoruz * *CreateFileAsync()* methoduna parametre olarak verdiğimiz dosya isminin uzantısını jpg yerine wmv yapıyoruz Böylece **Windows 8** uygulaması içerisinden hem fotoğraf hem video çekebilir ve uygun dizinlere kaydedilmesini sağlayabiliriz.
Senior Software Engineer, @Microsoft
Ada ve Ege'nin babası ;)
Makale Adedi: 484