Archive for category Android
Uygulama İçinden Ekran Görüntüsü Almak
Posted by Sezer Yeşiltaş in Android on June 7th, 2010
Android platformunda ekran görüntüsü almak için kolay bir yol yok ama en azından kendi uygulamamızın içerisinden, yine kendi uygulamamızın ekran görüntüsünü alabilme şansımız var.
Ne işimize yarayacak derseniz, uygulamanıza, ekranı arkadaşınla paylaş gibi bir özellik ekleyebilirsiniz, ya da ekran görüntüsünü sosyal ağlara gönderebilirsiniz. Aklıma gelen bir başka alan ise o anki ekran görüntüsünü alıp üzerinde image processing yapmak ve başka amaç için kullanmak, mesela kullanıcı, favorilere ekle dediğinde ekran görüntüsünü alıp küçültüp, eğip bükebilir ve bu thumbnail’lerden bir katalog oluşturabilirsiniz :)
Muhtemelen Android 2.1 ile gelen browser’daki bookmark’lar bu şekilde yapılıyor:

bookmarks
Neyse ben nasıl yapılacağına geçeyim.
Bildiğiniz gibi her Android ekranı bir Activity’den oluşuyor ve her Activity’e bir layout set ediyoruz, her layout’un (aslında view’ın) da bir draw methodu bulunuyor. Sistem gerektiği durumlarda bu draw methodunu çağırıyor ve bir Canvas objesine tasarladığımız layout’u çiziyor. Canvas objesi de Bitmap objesi barındırıyor ve çizim bu bitmap’e yapılıyor.
Bizim ekran görüntüsü almak için çıkış noktamız bu draw methodu olacak, önce kendi Bitmap ve Canvas objemizi yaratacağız ve layout’un draw methoduna bu canvası vereceğiz. Draw methodu bizim Canvas’ımıza çizimi yapacak, böylece kendi yarattığımız Canvas ve dolayısıyla Bitmap’te ekran görüntüsü oluşacak sonra bunu JPEG yapıp sd karta kaydeceğiz.
private void captureScreen() { RelativeLayout mainLayout = (RelativeLayout) findViewById(R.id.main); File root = Environment.getExternalStorageDirectory(); File file = new File(root,"Ekran.jpg"); Bitmap b = Bitmap.createBitmap(mainLayout.getWidth(), mainLayout .getHeight(), Bitmap.Config.ARGB_8888); Canvas c = new Canvas(b); mainLayout.draw(c); FileOutputStream fos = null; try { fos = new FileOutputStream(file); if (fos != null) { b.compress(Bitmap.CompressFormat.JPEG, 90, fos); fos.close(); } } catch (Exception e) { e.printStackTrace(); } }
SD kartımızıda Ekran.jpg isimli bir dosya oluşturmuş olduk :)
Burada dikkat edilecek konu, findViewById ile layoutumuzu alırken bunun daha önce setContentView() methodu ile inflate edilmiş olması. Eğer setContentView() ile kullanmadığımız bir layout ise bu layout’u manuel inflate etmek gerekecek.
Android 2.2 Froyo SDK
Posted by Sezer Yeşiltaş in Android on June 2nd, 2010

Ben etkinliği youtube’tan takip etmeye çalıştım, özellikle Vic Gundotra’nın yaptığı 45 dakikalık sunum, Android geliştiricilerini en çok ilgilendiren bölümdü. Youtube yasağı nedeniyle bu videolara her yerden erişmenin çok kolay olmadığını biliyorum, bu nedenle ilgili videoyu indirip aşağıda herkesin izleyebileceği şekilde yayınlamaya karar verdim. Ayrıca biz geliştiriciler için bu yeni versiyonun bir kaç tane heyecan verici özelliğinden de bahsetmeye çalışacağım.
Google I/O Day 2 keynote
Froyo, hem son kullanıcı hem geliştiriciler için birçok yenilik getiriyor, son kullanıcıyı ilgilendiren kısmı bir kenara bırakıp bizleri ilgilendiren ve benim en çok etkilendiğim konulara geçmek istiyorum.
SD Karta Kurulum
Artık uygulamalarımızı manifest dosyasında belirteceğimiz bir parametre ile direk sd karta kurulumunu sağlayabiliyoruz, hatta burada birden fazla seçenekle karşılaşıyoruz:
- preferExternal : mümkünse sd karta, değilse internal hafızaya kurar.
- auto : uygulamanın bazı özelliklerine göre sistem karar verir, burada sd karta kurma ihtimali de var.
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:installLocation="preferExternal" ... >
Servisler, widget’lar, live wallpaper, live folder gibi bazı uygulamaları isteseniz de sd karta kurulmasına izin verilmiyor. Özellikle büyük boyutlarda içerik barındıran uygulamaların (genellikle oyunların) SD karta kurulması tavsiye ediliyor.
SD karta kurulumda hemen akla iki tane risk geliyor, bir tanesi performans diğeri ise uygulamanın buradan alınarak Market dışı yollarla dağıtılmasına imkan vermesi. Bu iki sorunu da çözmüşler:
- SD karta kurulum yapıldığında, bu uygulama sadece o cihazda çalışacak şekilde encrypt ediliyor ve encrypt ettikleri key random olarak değişiyor.
- Tüm class’ların compile edildiği dex formatındaki dosya, kullanıcı datası ve database, internal hafızaya açıldığı için performans sorununun önüne geçilmiş.
Backup ve C2DM Servisleri
Bir başka önemli konu ise backup mevzusu. Apple’ın iTunes’u veya diğer klasik cihazlarda cd’lerden çıkan telefon yönetim programları (pc suite tarzı) ile telefonumuzu pc üzerinden yönetebiliyoruz. Bu programlarla backup alabiliyor, dosya transferleri yapabiliyoruz.
Bir buçuk senedir Andorid’te bu ihtiyacın nasıl karşılanacağını merakla bekliyordum, telefon defteri, takvim gibi uygulamalar zaten Google hesabımız ile sync olduğu için çok da ihtiyaç duymuyordum ama yine de bir eksiklik olarak göze çarpıyordu. Google iki tane servis ile bu sorunu çözmüş durumda, Backup Servisi ve C2DM Servisi.
Backup yeni bir servis, C2DM ise Cloud to Device Messaging anlamına gelen ve zaten kullanılan ama API’ları geliştiricilere açılmayan bir servisti, henüz hayata geçmediler ama her ikisinin de 2.2 SDK ile birlikte api’ları açılmış durumda.
Backup servisi, uygulamamızda kullanıcı tarafında üretilen ve cihaz içinde saklanan preferences ve database bilgisini ya da kendi başka yöntemlerle sakladığımız bilgileri cloud’ta backup’lanmasını sağlıyor. Görünen o ki, Google hesabımızla giriş yaptığımız bir web arayüzü ile backup ve restore başlatabileceğiz, ayrıca cihaz üzerinden de backup başlatabileceğiz hatta uygulamamızın içerisinden de Google backup serverına, backup talebi iletebileceğiz. Backup başladığında, kullanıcının sistem üzerinde(ayarlar gibi) ve uygulamalarda oluşturduğu tüm data cloud’ta yedeklenecek. Kullanıcı başka bir Android cihaz satın aldığında, tüm ayarları yeni cihaza otomatik olarak gelecek. Ayrıca kullanıcı, bizim yazdığımız uygulamayı yeniden kurduğunda, uygulamamızın backup aldırdığı data da otomatik olarak geri gelecek.
C2DM ise gerçekten çok etkileyici bir servis olmuş. Geliştirici tarafından yazılmış bir server üzerinden cihaza iletilmek üzere bir intent gönderebiliyoruz. Bizim serverımız direk cihazla iletişime geçmiyor, biz mesajımızı C2DM server’a iletiyoruz gerisini o hellediyor.
Intent gönderme konusunu açarsak olay daha net anlaşılacak. Intent aracılığıyla cihaza
- Dialer, SMS, Browser, Map gibi uygulamalara, göstermek üzere data gönderebiliyoruz, mesela bir coğrafik lokasyon ve zoom seviyesi datası göndererek, cihazda Map uygulamasının açılmasını sağlayabiliyoruz ya da bir telefon numarası göndererek bu numaraya mesaj yazmak üzere sms programını açabiliyoruz.
- Spesifik bir uygulamanın çalışmasını sağlayabiliyoruz.
Google, C2DM servisini kullanarak cihazımıza uygulama gönderecek yeni bir Market web arayüzü hazırlamış durumda, henüz hayata geçmedi ama şöyle çalışacak:
- Web’ten Google Market’e gideceğiz ve Google hesabımızla giriş yapacağız.
- Tüm uygulamalar aynı telefonumuzda olduğu gibi listelenecek.
- İstediğimiz birini seçip kur düğmesine basacağız ve otomatik olarak telefonumuzda kurulumun başladığını göreceğiz :)
Uzaktan telefon yönetimini Web üzerinden yapan bir sistem kurulmuş durumda, artık Android’in bir Pc uygulamasına ihtiyacı kalmadı, uzaktan backup/restore, uygulama yönetimi, mp3 ve resim indirme gibi işlemler Web üzerinden yapılabilecek. Bu servisler sayesinde Android, büyük eksiklik olan cihazı uzaktan yönetim konusuna son noktayı koymuş görünüyor.
Android 2.2 SDK’ında başka özellikler, iyileştirmeler ve düzeltmeler de barındırıyor, Android 2.2 SDK’sı ile gelen tüm değişikliklere aşağıdaki linkten erişebilirsiniz:
Shared Preference’a ArrayList kaydetmek
Posted by Omer Saatcioglu in Android on April 16th, 2010
Shared Preference API’ında ArrayList’leri kaydetmek için gerekli bir method sağlanmamış. Sadece basit data tipleri kaydedilebiliyor. Bu yüzden, ArrayList gibi kompleks data tiplerini kaydetmek için objeyi serialize edip kaydedebilir ve kullanmak için de aldıktan sonra deserialize edebiliriz.
Serialize/Deserialize için kendi kodumuzu da yazabiliriz ya da şurdaki kodu logging kısımlarını kaldırarak Android’te çalışabilecek hale getirebiliriz.
ObjectSerializer class’ımızı yarattıktan sonraki işlem basit.
Kaydetmek için:
public void setArrayList(ArrayList<String> al){
editor.putString(ARRAY_LIST_TAG, ObjectSerializer.serialize(al));
}
almak için:
public ArrayList<String> getArrayList(){
return (ArrayList<String>) ObjectSerializer.deserialize(sharedPreferences.getString(ARRAY_LIST_TAG, “”));
}
Aslında serialization methodunu istediğiniz objeye uygulayabildiğinizden, her türlü kompleks data tipini aynı metodla Shared Preference’a kaydedebilirsiniz. Shared Preference hakkında daha detaylı bilgi almak için şuraya bakabilirsiniz.
İyi geliştirmeler dilerim.
Güncel Yorumlar