Blackberry ile GPS ve GeoLocation

Batuhan Düzgün tarafından yayınlanmıştır 11. February 2012 06:59

Merhaba arkadaşlar, bu yazımda Blackberry ile Mobil programlama konusu kapsamında, GPS ve GeoLocation kullanımı anlatacağım. Artık, günümüzde bir çok akıllı telefonda GPS olmazsa olmaz donanımlardan biri haline geldi. Bu nedenle ortaya çıkan birçok mobil işletim sisteminde ve SDK’da GPS programlama için alt yapılar sunulur hale geldi. Aslında günümüzde, mobil işletim sistemleri ve SDK’lar, görsel görünümlü ve pencere sistemine dayalı işletim sistemlerinin 90’larda geçirdiği olgunlaşma çağını geçiriyor. Bu nedenle programlanmasında ve kararlı SDK’lar çıkarılmasında hala eksiklikler olduğu aşikardır. Mobil SDK’lar içerisinde en kararlı olanlardan biride kuşkusuz iOS gelmektedir. Android ve Blackberry gibi SDK’lar ve Mobil işletim sistemleri önemli bir yere sahiptir. 

Blackberry ile uygulama geliştirebilmek için RIM kütüphaneleri kullanılır. Bunun için Blackberry JDE kurulumu ile gelen IDE’yi veya Eclipse Blackberry Plug-In kullanabilirsiniz. Blackberry ile programlama yapabilmek gerçekten başlangıçta sinir bozucu ve baş ağrıtıcı olabiliyor. Fakat, Blackberry’nin RIM kütüphanesini ve SDK’yı anlayınca, aslında Blackberry’nin sunduğu programlama gücüne gerçekten saygı duyuyorsunuz. Çünkü, kütüphanede ekli olan bütün bileşenlerden kalıtım yoluyla farklı davranışlar ve görünümler sergileyen bir çok bileşen yazabilirsiniz. Yapılma olanağı zor olan bir çok şeyi farklı çözüm şekilleriyle ve programlama gücüyle kolayca çözebilme imkanı verebilmektedir.

 

GPS ve GeoLocation

GPS Dünya çevresine yerleştirilmiş uydulardan, basit radyo sinyalleriyle konum bilgisi almayı sağlayan bir donanımdır. Bu donanım bir çok askeri ve gündelik projede kullanılmaktadır. Eğer istenirse, bu donanım satın alını, gömülü sistem programlama yapılıp, istediğiniz gibi çalışmasını sağlayabilirsiniz. Tabiki telefonlar içerisinde gelen GPS’i SDK’nin sunduğu kütüphanelerdeki sınıfları ve veri yapılarını kullanarak programlayabilirsiniz. Bu sebeple Blackberry bize Java ile programlama imkanı sunduğu için bizde Java GPS ve GeoLocation kullanacağız. GeoLocation ise GPS sinyali olmadığı durumlarda konum bilgisi alabilmeyi sağlamaktadır.

Blackberry Eclipse açıp, File >> New >> Blackberry Project  yolu aşağıdaki gibi takip edilir.

Yapacağımız uygulamada, GeoLocation ve GPS çalıştıran iki thread (kanal) olacaktır. Bunlar aldıkları konum bilgisini ortak bir etikete yazacaklar.

İki adet sınıf yaratıp projemize dahil edelim. Projede “MyScreen” olarak gelen sınıfa giderek aşağıdaki sınıfları yazalım. Aşağıdaki sınıflar Thread sınıflarıdır.

 

// GPS'den konum almak için çalıştırılacak olan sınıf taslağı.

      // Bu sınıftan bir nesne yaratılıp, thread şeklinde start edilecektir.

      public class GpsProvider extends Thread {

            // BlackberryCriteria GPS'den hangi mod tipinden bir instance ile konum alınacağını belirtir.

            private BlackBerryCriteria _CriteriaObject = null;

            // LocationProvider ile oluşturulmuş Criteria moduna göre bir instance yaratır.

            private LocationProvider _LocationProvider = null;

            // Thread'i 3 dakika sonunda sonlandırmaya yarayan bayrak değişkenidir.

            private boolean _IsStop = false;

            // Uygulama çalışırken 10 saniyelik bekletme yapacak olan wait nesnesi.

            private Long _Waiter = new Long(0);

            // Kaç 10 saniye olduğunu tutan sayaç.

            private int _SecondCounter = 0;

            // Sonuç karakter katarı.

            private String _Result;

            public void run() {

                  // Run metodu işletilmeye başlandığında Thread start edilmiş demektir.

                  // Thread start olduktan sonra run metoduna düşer çalışmaya başlar.

                  // Eğer ki Criteria nesnesi null ise bir tane oluşturulması gerekir.

                  if(_CriteriaObject == null) {

                        // GPS modunda Criteria oluşturulur.

                        _CriteriaObject = new BlackBerryCriteria(GPSInfo.GPS_MODE_AUTONOMOUS);

                        // LocationProvider boş ise bir LocationProvider gereklidir ve yaratılır.

                        if(_LocationProvider == null) {

                             try {

                                   // Hangi mod ile criteria oluşturulduysa LocationProvider ile bir örnek yaratılır.

                                   _LocationProvider = LocationProvider.getInstance(_CriteriaObject);

                             } catch (LocationException e) {

                                   // TODO Auto-generated catch block

                                   e.printStackTrace();

                             }

                        }

                  }

                  // Sürekli çalışan döngü. Ta ki thread ilgili koşula ulaşıncaya kadar işletilir.

                  while(!_IsStop) {

                        Location _currentLocation = null;

                        try {

                             // Location (konum) alınır.

                             _currentLocation = _LocationProvider.getLocation(300);

                             // Sayaç arttırılır.

                             _SecondCounter++;

                             // Alınan konum bilgisi valid mi değilmi kontrol edilir.

                             if(_currentLocation.isValid()) {

                                   // Enlem ve boylam bilgileri alınır.

                                   double _latitude = _currentLocation.getQualifiedCoordinates().getLatitude();

                                   double _longtitude = _currentLocation.getQualifiedCoordinates().getLongitude();

                                   // double tipteki veriler String'e convert edilir.

                                   _Result = String.valueOf(_latitude) +","+ String.valueOf(_longtitude);

                                   // Görsel bileşen ile ilgili bir işlem yapıldığında bunun bir Runnable içinde,

                                   // Ayrı bir Thread'de yapılması gerekir. Böylece bizim çalıştırdığımız Thread ile,

                                   // Sistemin görsel bileşenler için çalıştırmış olduğu sistem Thread'i cross olmaycaktır.

                                   UiApplication.getUiApplication().invokeLater(new Runnable() {

                                         // InvokeLater metodu ile aşağıdaki satırlar çalıştırılır.

                                         public void run() {

                                               _ResultLabel.setText("GPS : " + _Result);

                                         }

                                   });

                             }

                             // 3 dakika dolduğunda Thread stop edilir.

                             if(_SecondCounter > 18) {

                                   _IsStop = true;

                                   _SecondCounter = 0;

                             }

                        } catch (LocationException e) {

                             // TODO Auto-generated catch block

                             e.printStackTrace();

                        } catch (InterruptedException e) {

                             // TODO Auto-generated catch block

                             e.printStackTrace();

                        }

                        try {synchronized(_Waiter){_Waiter.wait(10000);}} catch(Exception ex){}

                continue;

                  }

            }

      }

GeoLocation ile ilgili sınıf yapısı aşağıda verilmiştir. Hemen hemen yukarıdaki ile aynıdır.

// Yukarıda bahsedilenlerin aynısı GeoLocation içinde geçerlidir.

      public class GeoLocationProvider extends Thread {

            private BlackBerryCriteria _CriteriaObject = null;

            private BlackBerryLocationProvider _LocationProvider = null;

            private boolean _IsStop = false;

            private Long _Waiter = new Long(0);

            private int _SecondCounter = 0;

            private String _Result;

            public void run() {

                  if(_CriteriaObject == null) {

                        _CriteriaObject = new BlackBerryCriteria(LocationInfo.GEOLOCATION_MODE);

                        if(_LocationProvider == null) {

                             try {

                                   _LocationProvider = (BlackBerryLocationProvider)LocationProvider.getInstance(_CriteriaObject);

                             } catch (LocationException e) {

                                   // TODO Auto-generated catch block

                                   e.printStackTrace();

                             }

                        }

                  }

                  while(!_IsStop) {

                        Location _currentLocation = null;

                        try {

                             _currentLocation = _LocationProvider.getLocation(300);

                             _SecondCounter++;

                             if(_currentLocation.isValid()) {

                                   double _latitude = _currentLocation.getQualifiedCoordinates().getLatitude();

                                   double _longtitude = _currentLocation.getQualifiedCoordinates().getLongitude();

                                   _Result = String.valueOf(_latitude) +","+ String.valueOf(_longtitude);

                                   UiApplication.getUiApplication().invokeLater(new Runnable() {

                                         public void run() {

                                               _ResultLabel.setText("Location : " + _Result);

                                         }

                                   });

                             }

                             if(_SecondCounter > 18) {

                                   _IsStop = true;

                                   _SecondCounter = 0;

                             }

                        } catch (LocationException e) {

                             // TODO Auto-generated catch block

                             e.printStackTrace();

                        } catch (InterruptedException e) {

                             // TODO Auto-generated catch block

                             e.printStackTrace();

                        }

                        try {synchronized(_Waiter){_Waiter.wait(10000);}} catch(Exception ex){}

                continue;

                  }

            }

      }

Ekrana konulacak olan MyScreen sınıfının kurucusu aşağıdaki gibidir. MyScreen sınıfı MainScreen sınıfından kalıtım almıştır. MainScreen sınıfından kalıtım alan bir sınıf görsel bir pencere özelliği kazanır. Bunu masaüstü programlamada bir form gibi düşünebilirsiniz. UIApplication sınıfından kalıtım bir sınıf ise uygulamanın başlangıç sınıfıdır. Bu sınıf içinde pushScreen veya PopScreen metodlarıyla MainScreen türünden pencereleri gösterebilir kaldırabilirsiniz.

public MyScreen()

    {       

      // Sayfa başlığı set edilir.

        setTitle("-- GPS and GeoLocation --");

        // Blackberry Label bileşeni yaratılır. FIELD_HCENTER bileşenin ekranda ortalanacağını belirtir.

        _ResultLabel = new LabelField("", FIELD_HCENTER);

        add(_ResultLabel);

        // GPS'in açık olup olmadığının kontrolü yapılır.

        if(GPSInfo.isGPSModeAvailable(GPSInfo.GPS_MODE_AUTONOMOUS)) {

            // GPS için hazırlanmış olan Thread yaratılır ve start edilir.

            GpsProvider _gpsThread = new GpsProvider();

            _gpsThread.start();

        }

        // GeoLocation durumunun açık olmadığı kontrol edilir.

        if(LocationInfo.isLocationOn() || LocationInfo.isLocationSourceAvailable(LocationInfo.GEOLOCATION_MODE)) {

            //GeoLocation için hazırlanmış olan Thread yaratılır ve start edilir.

            GeoLocationProvider _geolocationThread = new GeoLocationProvider();

            _geolocationThread.start();

        }

    }

Aşağıda görüldüğü gibi MyScreen adlı sınıfa ait bir pencerenin ekrana basılması olayıdır.

public MyApp()

    {       

        // Push a screen onto the UI stack for rendering.

        pushScreen(new MyScreen());

    } 

Kaynak kodlara ait link >> http://www.2shared.com/file/8q95sDwu/BlackberryGPSample.html 

Bir yazının daha sonuna gelmiş bulunuyorum. Bir sonraki  makalemde görüşmek dileğiyle …

Batuhan Düzgün

Bilgisayar Mühendisi

Endüstri Mühendisi

Be the first to rate this post

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Etiketler:

Blackberry

Comments

Add comment


(Will show your Gravatar icon)  

  Country flag

biuquote
  • Comment
  • Preview
Loading





Bu site BlogEngine.NET 1.4.5.0 ile oluşturulmuştur. Türkçe çevirisi BlogEngine TR ekibi tarafından yapılmıştır.

Batuhan Düzgün

Sakarya Üniversitesi 

Bilgisayar Mühendisi

Endüstri Mühendisi

Yeditepe Üniversitesi

Bilgisayar Mühendisliği Yüksek Lisans 

 sahibinden.com

   Kıdemli Uzman Yazılım Mühendisi  

E-Mail 

   batuhan.duzgun@sahibinden.com

   batuhan.duzgun@windowslive.com

  github.com/batux

 

Sayfalar

Calendar

<<  July 2018  >>
MoTuWeThFrSaSu
2526272829301
2345678
9101112131415
16171819202122
23242526272829
303112345

Yazıları geniş takvimde göster