My Mobile Notes

Some useful tips & tricks for Android & iOS Programming, and Mobile Life

  • Contact

    Mustafa Ferhan Akman, Android Evangelist, Android & iOS Developer, Author, Blogger, Speaker

  • Subscribe

Türkiye için bir OS versiyon istatistiği

Posted by Mustafa Ferhan Akman on June 29th, 2014

17bin aktif kullanıcısı olan ve sadece Türk vatandaşlarını hedef alan bir uygulamamın OS bazında dağılımı;

(kullanıcıların %80′i Türkiye’den)

Türkiye Android version dağılımı

Tags: , ,
Posted in Android | No Comments »

BozukYol.com Yayında!

Posted by Mustafa Ferhan Akman on June 12th, 2014

BozukYol, 2 yıl önce sadece bir fikirdi.

Musa ve Süleyman ile birlikte geliştirdiğimiz BozukYol, bir kaç hafta önce Turkcell app markette yayınlandı. Uygulama Maratonu yarışması kapsamında dereceye girdi. Şimdi ise yeni özellikler ile Google Play‘de!

BozukYol’dan kısaca bahsedecek olursam, yollarda giderken karşılaştığımız yol bozukluklarını otomatik olarak track ediyor, algoritmamız sayesinde onun bir yol bozukluğu olup olmadığını anlıyor ve farklı kullanıcılardan gelen dataları harmanladıktan sonra gerçek bir yol bozukluğu olup olmadığını anlayabiliyor. Sonrasında ise, twitter üzerinden ilgili belediyelere bildirip, düzeltilene kadar takipçisi oluyor.

Android uygulamasına ait bazı ekran görüntüleri;

device-2014-05-12-161324device-2014-05-12-161052   device-2014-06-12-163206

Yolda giderken, real-time analiz ekranını inceleyebiliyorsunuz.

device-2014-06-12-163607

 

Twitter hesabınızla login olup, çeşitli badge kazanmaya başlayabiliyorsunuz. Çok yakın bir zamanda “gerçek ödüller” kazanabileceksiniz.

device-2014-06-12-163434

 

BozukYol’un gelişmiş bir çok özelliği bulunuyor.

  • Tamamen arkaplanda  çalışmak,
  • Yolda bozuk yol tespiti yaparken, çağrı gelmesi durumunda tespiti durdumak,
  • Uygulamayı arkaplanda unutmanız durumunda otomatik olarak uygulamayı duraklatmak,
  • İnternetsiz olarak yolları track edebilmek ve kablosuz ağa bağlandığınızda otomatik olarak senkronize etmek

gibi.

device-2014-06-12-163353

 

Turkcell’in düzenlediği ve dereceye giren uygulamaların basına tanıtıldığı toplantıdan bir kare;

buyuk

 

Uygulamamızın canlı demosuna ait bir video:

 

Yakın zamanda gelir modelimiz ile ilgili kurguladıklarımızı hayata geçirmeye ve kullanıcılarımıza ödüller/hediyeler vermeye başlıyor olacağız.

Uygulamayı indirmek için;

https://play.google.com/store/apps/details?id=com.bozukyol

Türkiye’nin bozuk yol haritası için;

Screen Shot 2014-06-13 at 10.16.26

http://www.bozukyol.com

 

Tags: , , , , , ,
Posted in Android, General | No Comments »

SourceTree aracını herhangi bir Git reposu ile kullanmak

Posted by Mustafa Ferhan Akman on March 19th, 2014

SourceTree mac üzerinde kullandığım en güzel git ve mercurial aracı. Command-line kullanmaya devam etmek istiyorsanız yazının geri kalanını okumak zorunda değilsiniz. Fakat ben basit işlerimi UI’dan halletmeyi seviyorum.

SourceTree resmi olarak bitbucket, github, stash’ı destekliyor. Fakat mesela GitLab’ı eklemek istediğinizde çeşitli gıcıklıklar yapabiliyor. Bitbucket ve github repolarında olduğu gibi direkt olarak eklenemiyor  ama aşağıdaki adımlarla problem çözülüyor.

1- gitlab’da mevcut olan git repo’yu command-line’dan çekiyoruz.

2- SourTree’de    Add Repo -> Add Working Copy -> projemizin git klasörünü seçiyoruz

3- Eklediğimiz repo’yu açıp,

Settings -> Edit Config File  dedikten gitlab’daki user’ımızı eklememiz gerekiyor. (bazı durumlarda)

[user]
name = Mustafa Ferhan Akman
email = mustafa.ferhan.akman@eba.gov.tr

gibi. Bu kadar.

Posted in General | Comments Off

Android DebugLog [GitHub]

Posted by Mustafa Ferhan Akman on March 5th, 2014

Yakın zamanda MFCalendarView isimli kütüphaneyi github’da paylaştığımı aktarmıştım. Şimdi, yaklaşık 2 yıldır kullandığım, çok işime yarayan ve geçmişte yaşadığım tecrübelere dayanarak hazırladığım bir kütüphane var: DebugLog.

Neden DebugLog?

DebugLog kütüphanesinin 2 temel amacı var;

  1. Uygulama geliştirilirken DebugLog aracılığı ile yazdığımız tüm logları App release edildiğimde otomatik olarak kapatmak.
  2. DDMS’e otomatik olarak daha anlaşılabilir log kayıtları düşmek.

DebugLog ile uygulama geliştirirken herhangi bir log düşmek için sadece mesajınızı yazmanız yeterli;

 DebugLog.e(message);

Mesela, aşağıdaki gibi myFunc() isimli fonksiyonun içerisinde DebugLog’u kullanırsanız,

void myFunc(){
   DebugLog.e(simple log from myFunc());
}

DebugLog aşağıdaki gibi, Tag kısmına log’un yazıldğı class ismini, log mesajının başına parantez içerisinde fonksiyonun ismini otomatik olarak yazar.

DebugLog output

Veya örnek olarak başka bir fonksiyonun içerisindeyken;

DebugLog output

android.util.Log‘un desteklediği tüm formatlarda DebugLog’u kullanabilirsiniz:

DebugLog.e(log);
DebugLog.i(i log);
DebugLog.d(d log);
DebugLog.v(v log);
DebugLog.w(w log);
DebugLog.wtf(wtf log);

Kaynak kodlarına ve örnek uygulamaya https://github.com/MustafaFerhan/DebugLog adresinden ulaşabilirsiniz.

Tags: , , , , , ,
Posted in Android | No Comments »

MFCalendarView – Android Calendar

Posted by Mustafa Ferhan Akman on February 21st, 2014

MFCalendarView isimli ilk opensource çalışmamı GitHub’daki hesabımdan paylaştım.

Neden?

  • Android’in native CalendarView’inda multiple selection özelliği olmaması. Ve event base herhangi bir takvim için eksik kalması
  • Hali hazırda yayınlanmış Square’in takvim uygulaması vardı. Fakat kütüphanenin performans probleminin  olması, kütüphaneyi UI’da create ederken en baştan “şu tarihler arasında takvimi oluştur” denme zorunluluğu (yani  ocak-şubat-mart ayını görüntüle derseniz, sonradan diğer ayları görüntüleyemiyorsunuz. Çok fazla ay gösteririseniz performans problemi oluyor)
  • Yine Square’in sadece yukarı-aşağı scroll’u destekliyor olması geliştirdiğim uygulamada UX açısından kötü bir deneyime sebep olması
  • Başka open source ve paralı kütüphanelerden bu tarz ihtiyaçlarımı karşılayamamam.

gibi sebeplerden dolayı MFCalendarView ortaya çıktı.

MFCalendarView

Kullanımı oldukça basit;

Layout XMML’inize ekleyip;

<br />
&lt;com.mustafaferhan.MFCalendarView<br />
    android:id=&quot;@+id/mFCalendarView&quot;<br />
    android:layout_width=&quot;wrap_content&quot;<br />
    android:layout_height=&quot;wrap_content&quot; &gt;<br />
&lt;/com.mustafaferhan.MFCalendarView&gt;<br />

Takvimde herhangi event atayacağımız zaman;

<br />
 ArrayList&lt;String&gt; eventDays = new ArrayList&lt;String&gt;();<br />
 eventDays.add(&quot;2014-02-25&quot;);<br />
 eventDays.add(Util.getCurrentDate());</p>
<p> mf.setEvents(eventDays);<br />

MFCalendarView’in kendi listenerları ile tarih değiştiğinde ya da görüntülenen ay değiştiğinde listenerlardan ilgili bilgiyi okuyabilirsiniz.

<br />
mf = (MFCalendarView) findViewById(R.id.mFCalendarView);<br />
mf.setOnCalendarViewListener(new onMFCalendarViewListener() {</p>
<p>    @Override<br />
        public void onDisplayedMonthChanged(int month, int year, String monthStr) {<br />
                //codes<br />
            }</p>
<p>            @Override<br />
            public void onDateChanged(String date) {<br />
                //codes<br />
            }<br />
    });</p>
<p>

Ekran görüntüsünde nokta olarak gözüken event belirteçleri aslında birer icondur. dot.png dosyasını değiştirerek orada herhangi bir belirteç kullanabilirsiniz.

Tags: , , , , , , , ,
Posted in Android | No Comments »

Android SharedPreferences yazma hızı problemi

Posted by Mustafa Ferhan Akman on February 12th, 2014

SharedPreferences’e bir datayı yazmaya çalışıyor ve arkasından hemen okumaya çalışırsanız, Android o sıra IO yaptığı için  yazdığınız kayıt hiç yokmuş gibi davranıyor.

Aslına daha öncede SharedPreferences ile benzer bir problemle karşılaşmıştım fakat sanırım problemin IO’dan kaynaklandığını çözememiştim.

Mesela, bu gece karşılaştığım bir durumda; fragment’imde kullanıcının bir edittext’e acheter cialis france mail adresini yazıyor ve ben bunu SharedPreferences’da saklıyorum. aşağıdaki gibi;

prefs.edit().putString(KEY_EMAIL, toStr(etEmail)).commit(); 

Ve hemen ardından o fragment’ı popBackStack() edip, yeni açılan fragmentta generic bir method’dan kaydedilmiş olan maili okuyorum. Kodu debugger ile debug ettiğimde, SharedPreferences üzerinden ilgili mail adresi geliyor. Yani herhangi bir problem gözükmüyor. Fakat app’i run edip gerçekten bir kullanıcı gibi kullanmaya çalıştığımda SharedPreferences bana cevap veremiyor :)

Kısa yoldan çözüm olarak, kullanıcının uygulamada donma hissini anlamayacağı kadar ama android işletim sisteminin IO yapacak fırsatı bulabileceği zaman tanıdım.

<br /><br />
try{</p><br />
<p>  Thread.sleep(100);<br /><br />
  getActivity().getFragmentManager().popBackStack();</p><br />
<p>}catch(InterruptedException e){ /* code */ }<br /><br />

Ben gece gece kafadan 100 milisaniye verdim. Kalite açısından daha düşük Android cihazları hesaba katarak belki biraz daha uzun zaman vermekte fayda olabilir.

Posted in Android | Comments Off

Android Fragment Overlap

Posted by Mustafa Ferhan Akman on January 27th, 2014

Bir uygulamamda yalnızca 1 activity olmasına rağmen 30′a yakın fragment var (:

Hal böyle olunca, bazı zamanlar fragmentlar iç içe, bazen de replace edilerek üzerine açmam gerekti. Fakat bir durumda, fazlaca fragment açıp, geri tuşu ile geriye gittiğimde daha önce açılmış 2 fragment’ın üst üste bindiğini, karıştığını gördüm.

Araştırdığımda aşağıda örnekte olduğu gibi başkalarıda bu tarz problemlerle karışılaşmışlar fakat bu fragmentların karışma problemi farklı farklı durumlarda ortaya çıktığı için benim problemimin kaynağına benzer bir çözüm bulamadım.

fragmentoverlap

Benim case’imde,

bir fragment’ı ilk başta aşağıdaki gibi çağırıp,

addNewFragment( new SearchFragment(), &amp;quot;sf&amp;quot;, false);

sonra, app’in ilerleyen bölümlerinde bir tanesinde aynı fragment’ı,

addNewFragment( new SearchFragment(), &amp;quot;sf&amp;quot;, true); 

şeklinde çağırmam oluyordu.

&lt;br /&gt;<br />
	void addNewFragment(Fragment fragment, String tag, boolean backstack){&lt;/p&gt;<br />
&lt;p&gt;		ft = getFragmentManager().beginTransaction();&lt;br /&gt;<br />
		ft.setTransition(FragmentTransaction.TRANSIT_NONE);&lt;br /&gt;<br />
		ft.replace(R.id.fragment_placeholder, fragment, tag );&lt;br /&gt;<br />
		if (backstack) {&lt;br /&gt;<br />
		 ft.addToBackStack(tag);&lt;br /&gt;<br />
		}&lt;/p&gt;<br />
&lt;p&gt;		ft.commit();&lt;br /&gt;<br />
	}&lt;br /&gt;<br />

Aynı fragment’ı her zaman aynı şekilde çağırdığımda problem basit yoldan düzeldi.

Posted in Android | No Comments »

Android Developer Days 2014 – Sizi Çağırıyor

Posted by Mustafa Ferhan Akman on January 27th, 2014

ADD 2 yıldır Türkiye’de düzenlenen, benim katıldıklarımın içeriisnde içeriği en geniş ve kaliteli android geliştirme etkinliği.

Ankara ODTÜ’de, etkinlik katılım ücretinin olmadığı, Yerli ve yabancı onlarca Android geliştiricinin bir arada bulunduğu böyle bir etkinliği kaçırmamanızı tavsiye ederim.

Ayrıntılı bilgiyi buradan alabilirsiniz.

http://www.androiddeveloperdays.com/tr/

add 2013
Geçen yıl benimde “Permission Almak ya da Almamak. İşte Bütün Mesele Bu!” isimli yarım saatlik bir konuşmam olmuştu.

Posted in Android, General | No Comments »

Android Eclipse Problemi: Errors running builder ‘Android Pre Compiler’ on project – java.lang.NullPointerException

Posted by Mustafa Ferhan Akman on December 29th, 2013

git üzerinden çektiğim projeyi Eclipse ADT’ye import ettikten sonra sebebi belli olmayan bir hata almaya başladım.

‘Building workspace’ has encountered a problem
Errors occurred during the build.
Errors running builder ‘Android Pre Compiler’ on project ‘XXX’
java.lang.NullPointerException

Biraz araştırdıktan sonra problemin .git ve .svn dosyalarından kaynaklandığı ortaya çıktı.

Eclipse’de Projenizin properties‘ine girdikten sonra,
Resources -> Resource
Add  -> “Exclude all”, “files and folders”, “all children” işaretleyip, text alanına .svn ya da .git yazıyoruz
Eclipse’i tekrar başlatıyoruz

eclipse-resource

Posted in Android | No Comments »

Android CalendarView’in geç yüklenmesi..

Posted by Mustafa Ferhan Akman on December 20th, 2013

Geçtiğimiz günlerde CalendarView ile uğraşırken, activity’min içerisinde yer alan CalendarView’in olduğu bölümü mimarisel olarak fragmen içerisine almam gerekti.

Fragment içerisine aldığımda, normalde 0.2saniyede açılan uygulamam yaklaşık 4-5 saniyede açılmaya başlamıştı:) Bir kaç dakika sonra sebebini bulduğumda ilginç bir sonuç çıktı;

XML içerisinde tanımladığın CalendarView’in direkt kendisi ya da daha sonra layout içerisinde kullanacağın fragment’ın mutlaka ve mutlaka match_parent olması gerekiyormuş.

Not: Stakoverflow’daki bir commentte Android ekibinden birisi henüz sebebini bilmediklerini yazmışlar:)


< CalendarView android:id="@+id/cv_dialog_filter_date"
android:layout_width="match_parent"
android:layout_height="match_parent" />

Posted in Android | No Comments »

 
canakkale canakkale canakkale truva search canakkale vergi mevzuati bagimsiz denetim bagimsiz denetim web security ozurluler bilisim teknoloji sgk bagimsiz denetim bagimsiz denetim