SimpleDateFormat kullanımı

Amacımız bize “25.05.2017 09:00” gibi gelen bir tarih string’ini doğru parse istediğimiz formatta çıktı alabilmek.

Sadece saat kısmı için : “09:00” gibi sadece tarih için “25:05:2017”

“2001-07-04 12:08:56” şeklinde U.S. Pacific Time time zone da gelen stringi alıp

12:08 PM  olarak veya 12 o’clock PM  bastırabiliriz.

2001.07.04 AD at 12:08:56 PDT  => PDT pasifik daylight time demek.

Bu işler için 2 adım var 1. si gelen string için patterni bilip o pattern ile parse edip Date objesine aktarmak.

SimpleDateFormat inFormat = new SimpleDateFormat("yyyy-MM.dd HH:mm:ss");
Date date = inFormat.parse("");

Wed, Jul 4, ’01 olarak dışarı aktarmak istersek ise aşağıdaki kodu kullanırız

SimpleDateFormat timeOutputFormat = new SimpleDateFormat("EEE, MMM d, ''yy");
String timeString = timeOutputFormat.format(date);

Tarih ve saat patternleri için aşağıdaki tabloyu kullanabilirsiniz

Letter Date or Time Component Presentation Examples
G Era designator Text AD
y Year Year 1996; 96
M Month in year Month July; Jul; 07
w Week in year Number 27
W Week in month Number 2
D Day in year Number 189
d Day in month Number 10
F Day of week in month Number 2
E Day in week Text Tuesday; Tue
a Am/pm marker Text PM
H Hour in day (0-23) Number 0
k Hour in day (1-24) Number 24
K Hour in am/pm (0-11) Number 0
h Hour in am/pm (1-12) Number 12
m Minute in hour Number 30
s Second in minute Number 55
S Millisecond Number 978
z Time zone General time zone Pacific Standard Time; PST; GMT-08:00
Z Time zone RFC 822 time zone -0800

 

Android version code ve version name

Bu değerler Androidmanifest.xml içinde

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.yusuf.mobil"
    android:installLocation="auto"
    android:versionCode="2"
    android:versionName="2.0">
...

olarak yazılır. Ancak build.gradle ile de override edilebiliyor.

defaultConfig {
    applicationId "com.digiturk.iris"
    minSdkVersion 16
    targetSdkVersion 25
    versionCode 1
    versionName "1.0"
    multiDexEnabled true
}

Zxing duplicate entry problem

When I was trying to signing my apk which include embedded zxing barcode scanner , it was giving this error:

Error:Execution failed for task ‘:app:transformClassesWithJarMergingForRelease’.
> com.android.build.api.transform.TransformException: java.util.zip.ZipException: duplicate entry: com/google/zxing/integration/android/IntentIntegrator.class

I have spent my last 5 hours to solve this. So finally I got why it happens. For some reasons or accidently I did put IntentIntegrator into libs.

intent integrator

And I did put “zxing-android-embedded” which include IntentIntegrator  into dependencies already. That is why it says duplication.

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    compile ('com.journeyapps:zxing-android-embedded:3.5.0')
...

Solution 1: delete IntentIntegrator   from libs folder.

Solution 1: remove “compile fileTree(include: [‘*.jar’], dir: ‘libs’)” line from dependencies

Örnek bir Cachemanager

Android’de öyle bir cachemaneger yazmak istiyorum ki:

  1. Varsa datayı Ram’den getirsin, yoksa dosyadan okuyup getirsin. Android’de bu dosya sharedpreferences isimli XML dosyasıdır. İlk olarak Ram’den getirsin ki dosyadan okuma işlemi ile bir zaman kaybı(overhead) olmasın. Tabi bunun için bu manager aracılığı ile Ram’de duran herşey dosyaya da yazılmalı.
  2. İkinci olarak bu data farklı class tiplerinde veya JSON tipinde olabilir. Bunun için dönüş tipleri ve alınan parametreler generic olmalı. Bu da Javada “T” ile sağlanır. Dosyaya yazılacak data string olabilir çünkü başka bir tip kabul etmiyor bunun için GSON parser kütüphanesini kullandım.

İşte kod:

import static com.yusuf.helpers.Helper.PREF_USERSESSION;

public class CacheManagerServiceData {

    private static CacheManagerServiceData mCacheManager;
    public  static ConcurrentHashMap<String, String> mGenericCache;

    public static synchronized CacheManagerServiceData getInstance() {
        if (mCacheManager == null)
            mCacheManager = new CacheManagerServiceData();
        return mCacheManager;
    }

    public CacheManagerServiceData() {
        if (mGenericCache == null) {
            mGenericCache = new ConcurrentHashMap<String, String>();
        }
        if (mSessionCache == null) {
            mSessionCache = new ConcurrentHashMap<String, Session>();
        }
    }

    public <T> void setGenericCache(Context _context, String name,T data)
    {
        String _dataString = new Gson().toJson(data);

        mGenericCache.put(name,_dataString);
        Helper.putPrefString(_context,name,_dataString);
    }

    public <T> T getGenericCache(Context _context, String name,Class<T> clazz)
    {
        T _session = new Gson().fromJson(mGenericCache.get(name),clazz);
        if(_session == null)
        {
            _session = new Gson().fromJson(Helper.getPrefString(_context,name),clazz);
        }
        return _session;
    }

    public static void dropAllCacheData() {
        if (mGenericCache != null)
        {
            mGenericCache.clear();
        }

        if (mSessionCache != null)
        {
            mSessionCache.clear();
        }
    }
}

Python Kurulumu

Eskiden Python 2.7 kullanırdım. Bu sefer Python 3.6 kullanacağım. Normalde Enviroment Variables path ayarları el ile yapılması gerkiyordu bu sefer Windows installer’da Add to path seçeneği var.

Bu arada bilgisayar 64 de olsa 32 bir kurun python şu adresten bakarak:

https://www.python.org/downloads/windows/

python 36 enviroment variables

Kurulum bitince muhtemelen python komutu ile yazdığınız scriptler komut satırından çalıştırabileceksiniz.

Şimdi Python pip yükleyelim.Pip python paketlerini yüklemeye yarıyor. Nodejs’deki npm gibi.

Önce https://pip.pypa.io/en/stable/installing/ adresine gidip https://bootstrap.pypa.io/get-pip.py python scriptini indirelim. Bilgisayarda “.py” uzantısı ile duran scripti komut satırından çalıştıralım.

get pip

Kurulumun herhangi bir aşamasında veya SIP , PyQt gibi kütüphaneleri yüklerken

No module named ‘sipconfig’ 

Alırsanız bütün paketleri ve python’ı 32 bit için kurun. Bilgisayarınız 64 bit bile olsa.

Seeing this on Windows x64 too. I saw that building sip is explicitly disabled for Win64 so it’s probably intended, and known not to work correctly.

Some Android Interview Questions

Diff with Broadcst Receiver and Services

Service: If you want to do something in background , this will be running always in background even if the application closed. You can create this in separate process and also you can give your service to other app if you want. Downloading any content or Music is good example

Broadcast Reciever: Usually system will send some info which can be recieved by your app if you would wish to ,by registering. And you can do something what you want when that thing happens by using onReceive method. Example is the system will send BroadcastReceiver when new sms arrives or Booting done

How does RecyclerView differ from listview

RecyclerView was created as a ListView improvement, so yes, you can create an attached list with ListView control, but using RecyclerView is easier as it:

  1. Reuses cells while scrolling up/down – this is possible with implementing View Holder in the listView adapter, but it was an optional thing, while in the RecycleView it’s the default way of writing adapter.Decouples list from its container – so you can put list items easily at run time in the different containers (linearLayout, gridLayout) with setting LayoutManager.

What is the use of /assets and/res/raw/ folders ?

What are the fragments? Describe there lifecycle methods

What is a PendingIntent?

Diff between AsyncTask and Thread class ?

Diff between Framelayout and Tablelayout ?

How is data stored in sharedpreferences ? What is the diffrence between commit() and apply() ? Which is recommended one ?

What is StateListDrawable ?

Diff between Oncreate(), onstart,onresume, ondestroy,onstop , onpause. When are they called during the lifecycle of an Activity ?

Diff between setflags and addflags on an intent object ?

Mention 2 ways to clear the back stack of Activity when Activity is called using intent

Diff between Linearlayout and relativelayout and Absolutelayout

Diff between Activty and AppcompatActivity?

Activity , AppcompantActivty, FragmentActivity and ActionBaractivity? How are they related ?

What is Android Support Library and why is it recommended ?

Name the seven imprtant lifecycle methods of an activity?

Barcode Scanner Embedding to Android

Bize bir barcode scanner lazım oldu. Ve bunu başka bir uygulamaya zıplamadan yapmak istiyoruz. Sağolsun bir ingiliz vatandaş güzel bir library hazırlamış.

https://github.com/zxing/zxing

Hatta kendi kütüphanesini kullanarak yazdığı uygulama da markette. Deneyip performansa bakılabilir.

https://play.google.com/store/apps/details?id=com.google.zxing.client.android&hl=tr

Bu kütüphane şöyle çalışıyor: bu vatandaşın uygulaması yüklü ise telefonunuzda kütüphane aracılığı ile ona zıplayıp barcode scan edip sonuçları alıyorsunuz. Tabi biz bunu istemiyoruz.

Bunun üzerine başka bir vatandaş aynı istekler ile şöyle bir kütüphane yazmış.

https://github.com/journeyapps/zxing-android-embedded

Bu sayede scanner’ı kendi uygulamanıza gömüyorsunuz. Kurulum için ayrıntılar aşağıda:

1.   Build.gradle’daki en alt satırı ekledim.

  1. dependencies {
        compile fileTree(dir: 'libs', include: ['*.jar'])
        androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
            exclude group: 'com.android.support', module: 'support-annotations'
        })
        compile 'com.android.support:appcompat-v7:25.3.1'
        compile 'com.android.support.constraint:constraint-layout:1.0.2'
        testCompile 'junit:junit:4.12'
        compile 'com.journeyapps:zxing-android-embedded:3.5.0'
    }

    2.IntentIntegrator ve IntentResult.java classlarını githubdan kendi projeme kopyaladım.

  2. 3. Buton ekledim layout dosyasına
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Scan Barcode"
        android:onClick="scanBarcode"/>
  3. 4.  activity’ye aşağıdaki kodları ekledim.
    public void scanBarcode(View view) {
        new IntentIntegrator(this).initiateScan();
    }
    
    // Get the results:
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        IntentResult result = IntentIntegrator.parseActivityResult(requestCode, resultCode, data);
        if(result != null) {
            if(result.getContents() == null) {
                Toast.makeText(this, "Cancelled", Toast.LENGTH_LONG).show();
            } else {
                Toast.makeText(this, "Scanned: " + result.getContents(), Toast.LENGTH_LONG).show();
            }
        } else {
            super.onActivityResult(requestCode, resultCode, data);
        }
    }

Android DFP usage

TR: DFP yani DoubleClick for Publishers Android’de nasıl kullanılır ; bundan değineceğim biraz. DFP ile anlaştığınız bir firmanın reklamlarını yayınlayabilirsiniz ya da kendi posterlerini yayınlayabilirsiniz. Bunun için DFP nin web arayüzü ile banner tanımlamalısınız önce.  Android tarafında java ve xml layout olarak 2 ayağı var.  Benim Activity den bir snippet aşağıdadır.

EN: DFP means DoubleClick for Publishers so today I am gonna explain a bit about it. You can use DFP for publishing your partners’ advertisements or your internal posters etc. To do that, you need to create your own banners by using DFP web user interfaces. In Android client side you need to do sth in Java, layout xml and string.xml.

My activity code snippet is below

AdSize customAdSize = new AdSize(619, 218);
PublisherAdView rightBottomAdView = (PublisherAdView) findViewById(R.id.rightBottomAdView); PublisherAdRequest adRequest = new PublisherAdRequest.Builder().addTestDevice("AE02661203110A06E7337759DFF15D20").build(); 
rightBottomAdView.setAdSizes(customAdSize); rightBottomAdView.loadAd(adRequest);

 

Android layout can be like this

<RelativeLayout
   android:layout_width="fill_parent"
   android:layout_height="fill_parent"
   android:background="@color/fillColorHomeButton"
   android:layout_weight="1"
   android:orientation="horizontal" >

   <com.google.android.gms.ads.doubleclick.PublisherAdView
      android:id="@+id/rightBottomAdView"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:layout_centerHorizontal="true"
      android:layout_alignParentBottom="true"
      ads:adSize="BANNER"
      ads:adUnitId="@string/banner_ad_unit_id">
   </com.google.android.gms.ads.doubleclick.PublisherAdView>

</RelativeLayout>

AS you can see  ads:adUnitId=”@string/banner_ad_unit_id” should be defined int string.xml like below

<string name="banner_ad_unit_id">/6499/example/banner</string>

This id belongs to Google actually. So if you want to use their sample banner logcat would  warn us when you run the project.

“Use AdRequest.Builder.addTestDevice(“EBA3F68D25E9C90F6CA8B0905F24FABC”) to get test ads on this device.”

That is why we already added below already

PublisherAdRequest.Builder().addTestDevice("AE02661203110A06E7337759DFF15D20").build();

Android uninstall adb

adb devices -l

list the devices with description

like this one “13110943202074         device product:h3digiturk model:h3digiturk device:v2stbBrand”

pm uninstall -k com.unlu.mobil