Archive for January, 2010

Android’de Harita Üzerine Balon Yapısı Eklemek

Android ile ilgili forumlarda sıkça karşılaştığım sorunlardan birisi MapView üzerine balon yapısı yerleştirmek, daha önce bir proje için üzerinde çalıştığım prototipte layout tabanlı basit bir çözüm hazırlamıştım.

Öncelikle bir layout sınıfı hazırlayıp, dispatchDraw metodu içerisinde balonumuzu çiziyoruz:

package com.dogantekin.baloon;
....
public class BaloonLayout extends LinearLayout {
....
@Override
protected void dispatchDraw(Canvas canvas) {
Paint panelPaint = new Paint();
panelPaint.setARGB(0, 0, 0, 0);
RectF panelRect = new RectF();
panelRect.set(0,0, getMeasuredWidth(), getMeasuredHeight());
canvas.drawRoundRect(panelRect, 5, 5, panelPaint);
RectF baloonRect = new RectF();
baloonRect.set(0,0, getMeasuredWidth(), 2*(getMeasuredHeight()/3));
panelPaint.setARGB(230, 255, 255, 255);
canvas.drawRoundRect(baloonRect, 10, 10, panelPaint);
Path baloonTip = new Path();
baloonTip.moveTo(5*(getMeasuredWidth()/8), 2*(getMeasuredHeight()/3));
baloonTip.lineTo(getMeasuredWidth()/2, getMeasuredHeight());
baloonTip.lineTo(3*(getMeasuredWidth()/4), 2*(getMeasuredHeight()/3));
canvas.drawPath(baloonTip, panelPaint);
super.dispatchDraw(canvas);
}
}

Sonra bu layout’u kullanan bir layout xml’i hazırlayarak, balon içerisine yerleştirmek istediğimiz kısımları belirtiyoruz (örnek olarak başlık ve içerik için iki adet textview ve kapatmak için ise bir imageview):

<?xml version="1.0" encoding="utf-8"?>
<com.dogantekin.baloon.BaloonLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/transparent_panel"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:paddingLeft="5px"
android:paddingTop="5px"
android:paddingRight="5px"
android:paddingBottom="5px">
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<TextView
android:id="@+id/note_label"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:text="@string/note"
/>
<ImageView
android:id="@+id/close_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:paddingRight="10px"
android:src="@drawable/close"
android:clickable="true"
/>
<TextView
android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:paddingLeft="5px"
android:paddingRight="5px"
android:text=""
android:id="@+id/note_text"
android:layout_below="@+id/note_label"
android:layout_centerHorizontal="true"
android:minLines="4"
android:maxLines="4"
android:maxLength="160"
android:textSize="5pt"
/>
</RelativeLayout>
</com.dogantekin.baloon.BaloonLayout>

Evet balon yapımız hazır, şimdi ise ilgili MapActivity içerisinde ilk başta hazırladığımız balon layoutunun instance’ını oluşturmamız gerekiyor:

LayoutInflater layoutInflater = (LayoutInflater) this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
noteBaloon = (BaloonLayout) layoutInflater.inflate(R.layout.baloon, null);
RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(200,100);
layoutParams.addRule(RelativeLayout.CENTER_VERTICAL);
layoutParams.addRule(RelativeLayout.CENTER_HORIZONTAL);
noteBaloon.setLayoutParams(layoutParams);

Bu aşamadan sonra balonumuzu map view üzerinde istediğimiz nokta üzerinde göstermek için:

((TextView)noteBaloon.findViewById(R.id.note_text)).setText(msg.getData().getString(HANDLER_MESSAGE_AUTHOR)+"\n"+msg.getData().getString(HANDLER_MESSAGE_NOTE));
mapController.animateTo(noteOverlay.getTapPoint()); // kullanicinin dokundugu noktayi aliyoruz
mapView.addView(noteBaloon, new MapView.LayoutParams(200,200,noteOverlay.getTapPoint(),MapView.LayoutParams.BOTTOM_CENTER));
mapView.setEnabled(false);

sample baloon

Balonumuzu map view üzerinden kaldırmak için ise:

mapView.removeView(noteBaloon);
mapView.setEnabled(true);

baloon removed

yeterli olacaktır. Layout xml’de istediğimiz eklemeleri yaparak daha zengin içeriğe sahip bir arayüz sağlayabiliriz:
rich baloon

No Comments

Android Custom ROM Oluşturmak

Android işletim sisteminin açık kaynak kodlu olması, donanım üreticilerine, gsm operatörlerine ve bu işe ilgi duyan bağımsız geliştiricilere açılmış yep yeni bir pencere olmuştur. Eğer bir Android işetim sisemini kaynak kodlarından derleyerek kendi dağıtımınızı ve bilinen daha genel adıyla custom ROM’unuzu oluşturmak istiyorsanız, sahip olmanız gereken tek şey bir Linux işletim sistemi veya bir Mac OSX Pc. Java biliyor ve Android platformuyla uğraşmışlığınız varsa, temel Linux kullanımına hakimseniz bazı değişiklikler ile kendinize özel işletim sistemini telefonunuzda kullanabilirsiniz. Peki bunu nasıl yapacağız?

  • Öncelikle repository’e erişmek için gerekli kurulumları yapacağız.
  • Android Opensource işletim sistemini bilgisayarımıza indireceğiz.
  • Kaynak kodlarda istediğimiz değişiklikleri yapacağız.
  • İşletim sistemini derleyerek kendi custom ROM’umuzu oluşturacağız.
  • ROM’u telefonumuz yükleyeceğiz.

Aşağıda anattığım tüm adımlar, Ubuntu 9.10 üzerinde edindiğim tecrübelerden oluşmaktadır. Ubuntu’yu bilgisayarıma wubi ile kurdum böylece diskimde ayrıca bir partition oluşturmama gerek kalmadı. Bu yöntemi kullanabilir ya da ayrı bir partition’a Ubuntu kurabilirsiniz. Eğer sanal makina ile Ubuntu kullanacaksanız aşağıda anlattığım adımlar aynı sonucu vermeyebilir. Özetle aşağıdaki adımları uygulamak için sanal olmayan bir Ubuntu’ya ihtiyacımız var.

Gerekli Paketler

  • Git 1.5.4 veya daha yüksek sürümü
  • JDK 5.0, update 12 veya üstü. Java 6 desteklenmiyor.
  • flex, bison, gperf, libsdl-dev, libesd0-dev, libwxgtk2.6-dev (optional), build-essential, zip, curl.
  • valgrind
$ sudo apt-get install git-core gnupg sun-java5-jdk flex bison gperf libsdl-dev libesd0-dev libwxgtk2.6-dev build-essential zip curl libncurses5-dev zlib1g-dev
$ sudo apt-get install valgrind

Not: Ubuntu 9.10′da sun-java6-jdk ön tanımlıdır. Bu sürüm desteklenmediği için sun-java5-jdk kurduk ancak bunu default jdk yapmak için aşağıdaki komutu çalıştırmalıyız:

$ sudo update-java-alternatives -s java-1.5.0-sun

Not2: sun-java5-jdk kurulumunda paket bulunamadı hatasıyla karşılaşırsanız aşağıdaki repo’ları eklemeniz gerekebilir:

$ deb http://us.archive.ubuntu.com/ubuntu/ jaunty multiverse
$ deb http://us.archive.ubuntu.com/ubuntu/ jaunty-updates multiverse

Repo Tanımlama ve İndirme

Android Git versiyon kontrol sistemini kullanır, bu nedenle repo tanımlayıp kodu checkout edeceğiz.
Öncelikle repo scripti indirilir:

$ cd ~
$ mkdir bin
$ echo $PATH
$ curl http://android.git.kernel.org/repo >~/bin/repo
$ chmod a+x ~/bin/repo

Proje için dizin yaratılır ve repo, Android’in repodaki son sürümü için initialize edilir, şu anda son sürüm olarak eclair bulunmakta yani 2.0 sürümü :) dizinin adını istediğiniz gibi verebilirsiniz.

$ mkdir mydroid
$ cd mydroid
$ repo init -u git://android.git.kernel.org/platform/manifest.git

Eğer özellikle belli bir Android sürümünü indirmek istiyorsanız mesela donut (1.6) için komut şöyle olmalı:

$ repo init -u git://android.git.kernel.org/platform/manifest.git -b donut

cupcake (1.5) için:

$ repo init -u git://android.git.kernel.org/platform/manifest.git -b cupcake

Ben son sürüm için çalıştırdım ve 2.0′ın kaynak kodlarını indirdim, yazının devamı 2.0 için geçerlidir.
initialize işlemi esnasında isim ve email adresi isteyecek, biz checkin yapmayacağımız için çok önemli değil :)
İşem başarı ile bittiyse aşağıdaki mesajı görmeliyiz.

repo initialized in /mydroid

Ve son adım! Burası uzun sürecek, makinamızdaki repo ile sunucu tarafı sync edilecek yani tüm kaynak kodları indirmeye başlıyoruz:

$ repo sync

Customization

Sync işlemi bittiğinde, Android kaynak kodları arasında gezintiye çıkmak için önümüzde hiç bir engel kalmadı. Bundan sonrası size kalıyor ama emin olun keşfetmek ilginç bir deneyim olacak. Ben bir kaç tane ufak ipucu vereyim:
Programların kaynak kodları burada (Launcher,Phone,Calendar,Contacts,Settings vb..):

mydroid/packages/apps/

ROM’u ilk kurduğunuzda gelen ön tanımlı duvar kağıdı aşağıda, ismini değiştirmeden kendi duvar kağıdınızı koyabilirsiniz:

~/mydroid/frameworks/base/core/res/res/drawable/default-wallpaper.jpg

Telefon açılırken ekrana gelen splash screen resimleri burada:

~/mydroid/frameworks/base/core/res/assets/images/

Lockscreen ROM’un içine gömülmüş, burada bazı hassas işler yapıldığı için apps altında yer almıyor, çünkü apps altındaki tüm uygulamalar sonradan silinebiliyor ya da bir başkası ile replace edilebiliyor. Yeri:

~/mydroid/frameworks/policies/base/phone/com/android/internal/policy/impl/LockScreen.java

Lockscreen resource dosyaları:

~/mydroid/frameworks/base/core/res/res

Derleme

Eğer uygulamalardan birinde değişiklik yaptıysanız sadece onu derleyip cihazınıza kurabilirsiniz. Örneğin Launcher programında değişiklik yaptınız, derlemek aşağıdaki make komutunu kullanıyoruz:

$ make Launcher

Uygulama derlenerek şu path’e yazılıyor

~/mydroid/out/target/product/generic/system/app/Launcher.apk

İşletim sisteminin tamamını derlemek için aşağıdaki adımları takip etmek gerekiyor. Eğer bir G1 developer phone sahibi iseniz bu ROM’u telefonunuza yükleyebilirsiniz.

  • HTC’nin sitesinden recover image indirilir ve ~/mydroid klasörüne kopyalanır: http://developer.htc.com/adp.html
  • HTC’nin sitesinden HTC Proprietary Binaries for ADP1 indirilir: http://developer.htc.com
  • Proprietary binary ~/mydroid/vendor/htc/dream-open/ altına kopyalanır ve açılır sonra bu dizinde çalıştırılır.
  • ~/mydroid/vendor/htc/dream-open/ altında unzip-files.sh çalıştırılır.
  • ~/mydroid altında . build/envsetup.sh çalıştırılır.
  • ~/mydroid altında lunch aosp_dream_us-eng çalıştırılır.
  • ~/mydroid altında make -j4 çalıştırılır.

Bu işlemlerin sonunda ~/mydroid/out/target/product/dream-open dizininde gerekli tüm image’ların oluştuğunu göreceksiniz.

Not: Daha önce build yaptıysak tekrar yapacaksak export USE_CCACHE=1 komutu işi hızlandırır, tertemiz bir build yapacaksan önce m clean diyoruz sonra make diyoruz.
Not2: packages altındaki uygulamaları eclipse ile açtıysak R.java ve Manifest.java dosyalarını silmeden make yapamıyoruz.

Yükleme

  • cihaz usb’ye bağlanır
  • Ubuntu’da root’a geçilir
  • $ sudo su
    #
  • adb server durdurulur:
  • out/host/linux-x86/bin/adb kill-server
  • adb server yeniden başlatılır:
  • out/host/linux-x86/bin/adb devices
  • cihaz kapatılır
  • yeniden açılırken back tuşuna basılı tutularak fastboot mode’da açılır.
  • img dosyalarının oluştuğu path set edilir:
  • export ANDROID_PRODUCT_OUT=out/target/product/dream-open
  • tüm image’lar flash edilir:
  • out/host/linux-x86/bin/fastboot -w flashall
  • Bir aksilik olmadıysa telefonunuz hazır :)

Eğer sadece değiştirdiğiniz bir uygulamayı telefonunuza install edecekseniz, adb server’ı başlatma adımından sonra aşağıdaki komut vermeniz yeterli:

out/host/linux-x86/bin/adb install out/target/product/generic/system/app/Launcher.apk

Android’in açık kaynak kodlu olması sayesinde biraz linux ve java bilgisi ile evde kendi işletim sisteminizi yapmanız mümkün olabiliyor, zaten şimdiye kadar bir çok customize edilmiş Android işletim sistemli telefon gördük,duyduk. Bir kaç örnek vermek gerekirse:

  • Google, kendi servislerini ve Market’i ekledi
  • HTC, Hero ile UI konusunda başarılı bir hamle yaptı
  • Motorola, DROID ile sosyal networklerle entegre oldu ve çok tutudu
  • Sadece büyük firmalar değil bağımsız geliştiriciler de kendi ROM’larını yapıp internet üzerinde paylaştılar, en güzel örnek: http://www.cyanogenmod.com/

No Comments

Samsung i7500 Driver Kurulumu

Samsung i7500 (Galaxy) Android cihazını bilgisayarınıza tanıtarak geliştirdiğiniz uygulamaları bu cihaz üzerinde test etmek için gerekli kurulum adımlarından bahsedeceğim.

Kullandığım cihaz üzerinde Android SDK 1.5 kurulu (Settings > About Phone > Firmware version), bilgisayarımda ise 32-bit Windows XP ve Android SDK ile beraber gelen USB Driver package, revision 2 yüklü. Farklı bir konfigürasyona sahipseniz anlatacaklarım sizin için geçerli olmayabilir.

yazi0

Adım 1: Samsung’un sitesinden telefonun driverlarını içeren Samsung New PC Studio uygulamasını indirip kurun.

Adım 2: Telefonunuzun ayarlarına girerek aşağıdaki kontrol edin:

  • Settings > Applications > Development > USB Debugging kutucuğu işaretli olsun
  • Settings > About phone > Additional Settings > Mass store only kutucuğu işaretli olmasın

Adım 3: Bilgisayarınızdaki Android SDK dizininin içerisinde usb_driver klasöründe bulunan android_winusb.inf dosyasını text editörü ile açın.

32-bit işletim sistemi kullanıyorsanız [Google.NTx86] kısmının en altına, 64-bit işletim sistemi kullanıyorsanız [Google.NTamd64] kısmının en altına aşağıdaki satırları ekleyin:

; Samsung galaxy
%CompositeAdbInterface% = USB_Install, USB\VID_04E8&PID_6640&MI_00
%SingleBootLoaderInterface% = USB_Install, USB\VID_04E8&PID_6640&MI_04

Adım 4: Telefonu USB kablosu aracılığı ile bilgisayarınıza bağlayın.  Windows’da Start > Run > devmgmt.msc yazarak Device Manager‘ı çalıştırın.

yazi1

Unknown device’ın üzerine sağ tıklayarak Update Driver‘ı seçin. Çıkan menülerden sırayla No, not this time ve Install from a list or specific location (Advanced) seçeneklerini seçin. Daha sonra Android SDK dizininin altındaki usb_driver klasörünü seçerek Next diyebilirsiniz.

yazi4

Bu aşamadan sonra Android Bootloader Interface yüklenecektir. Artık komut satırında adb devices dediğinizde (öncelikle adb kill-server demeniz gerekebilir) cihazını görebiliyor olmalısınız. Farklı konfigürasyonlar için kendi tecrübelerinizi yorumlarda paylaşırsanız sevinirim.

, , , , , ,

No Comments