Mengisi Database App saat Instalasi

22 February 2017 at 21:26 | Posted in android, Uncategorized | Leave a comment

— Catatan: Sebenarnya saya biasa posting tentang Android dev di blog yang lain (indonesiaberkicau.com), tapi hosting Qwords terlalu sering bermasalah (situs tidak merespon). Saya sudah upgrade ke paket yang lebih tinggi tapi tetap bermasalah, mau upgrade lagi apa ada jaminan bakal lancar? Informasi penyebab situs mati juga tidak ada (habis resources yang mana?). Oleh karena itu saya akan pindahkan ke blog ini saja — end

Pada aplikasi yang sedang saya buat, saya ingin agar database terisi saat user selesai menginstall app. Cara yang paling sederhana dengan mengisi satu persatu data di method SQLiteOpenHelper.onCreate(SQLiteDatabase) dengan query insert, tapi tidak praktis untuk data yang cukup banyak. Cara yang lain adalah membuat database di luar, diletakkan di assets lalu file database ini dicopy. Harusnya ini yang paling cepat, karena langsung copy antar file dan tidak melibatkan database. Cuma setelah saya coba, selalu gagal, dan ada resiko jika struktur database yang digunakan Android berganti.

Solusi yang saya gunakan adalah membuat file JSON lalu diletakkan di direktori assets kemudian diparsing dan diinsert.  Contoh JSON-nya seperti ini:

[
   {
     "nama": "resto A",
     "alamat": "sarijadi blok 23",
     "telp": "08162424"
   },
   {
     "nama": "resto B",
     "alamat": "buahbatu",
     "telp": "0832324"
   }
]

Simpan sebagai file teks, letakkan di direktori assets (…\app\src\main\assets).

Code berikut memparse data ini dan memindahkannya ke tabel. Transaction diatur manual agar kinerja lebih optimal (cuma belum saya test). Untuk data yang besar, sebaiknya proses load ini dilakukan di thread yang terpisah.

public static final String TABLE_INSERT = "insert into tempat_makan (nama, telepon, alamat) values(?,?,?)";
private static String DATA_FILE = "data.txt";
private void loadData(SQLiteDatabase db) {
    try {
        InputStream myInput  = myContext.getAssets().open(DATA_FILE);
        String jsonStr = getStringFromInputStream(myInput);
        SQLiteStatement insert = db.compileStatement(TABLE_INSERT);
        db.beginTransaction();
        JSONArray jArr = new JSONArray(jsonStr); //karena dimulai dgn array
        for (int i=0; i < jArr.length(); i++)
        {
            JSONObject jObj = jArr.getJSONObject(i);

            String nama      = jObj.getString("nama");
            String alamat    = jObj.getString("alamat");
            String telp      = jObj.getString("telp");

            insert.bindString(1,nama);
            insert.bindString(2,alamat);
            insert.bindString(3,telp);
            insert.execute();
        }
        db.setTransactionSuccessful();
    } catch (Exception e) {
        e.printStackTrace();
        Log.e("yw",e.getMessage());
    } finally {
        db.endTransaction();
    }
}

// convert InputStream to String
private static String getStringFromInputStream(InputStream is) {
    BufferedReader br = null;
    StringBuilder sb = new StringBuilder();

    String line;
    try {

        br = new BufferedReader(new InputStreamReader(is));
        while ((line = br.readLine()) != null) {
            sb.append(line);
        }

    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        if (br != null) {
            try {
                br.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    return sb.toString();
}

Advertisements

LibGDX untuk membuat Game pada Android (Modul Tutorial LibGDX)

13 October 2013 at 07:42 | Posted in android, kuliah | 1 Comment
Tags: , ,

Update April 2015: tutorial libgdx di blog saya yang lain.

LibGDX  (libgdx.badlogicgames.com) adalah framework untuk membuat game,  visualisasi dan simulasi.  Kelebihan LibGDX diantaranya:

  1. Multiplatform. Dapat menghasilkan app untuk desktop (Win, Linux, Max), Android, iOS dan web dengan mudah.
  2. Free dan opensource (lisensi Apache 2.0).
  3. Basisnya Java.
  4. Tidak perlu mengetahui Android SDK.  Anda dapat membuat game di Android walaupun belum pernah membuat app di Android sebelumnya, tentunya asal mengerti Java.
  5. Tidak perlu menggunakan emulator!  Proses pengembangan jadi jauh lebih cepat. Jalankan project di desktop dan nanti setelah selesai baru jalankan versi Androidnya tanpa tambahan code.
  6. Kinerja bagus, melebihi beberapa framework lain (pembahasan tentang ini: http://www.sparkrift.com…l)
  7. Menyediakan banyak fitur yang memudahkan programmer membuat game seperti box2D, Scene2D, Bullets  3D dan lainnya.
  8. Dokumentasi lumayan dan forum-nya aktif.

Saya membuat modul praktikum untuk kuliah game programming di Ilkom UPI. Lisensi tutorialnya adalah creative commons dan formatnya MS Word, jadi silahkan didistribusikan, dimodifikasi asal nama saya jangan dibuang.  Bagi yang berminat, dokumennya dapat didownload di: yuliadi.com/ilkom  (cari dokumen yang diawali “tutorial_libgdx”)

Implementasi Game/Animation Loop di Android Bagian 2

4 August 2013 at 00:26 | Posted in android | 1 Comment

Pada posting sebelumnya, telah dibahas implementasi game loop di Android.  Tetapi implementasi tersebut masih memiliki kelemahan. JIka jumlah objek banyak sehingga proses update posisi membutuhkan waktu lama,  ditambah lagi delay yang fix 0.2 detik maka loop akan berlangsung lebih lama dari seharusnya. Kecepatan animasi juga dapat berbeda untuk berbagai smartphone.

Ada dua cara untuk memperbaiki: pertama delay dilakukan secara dinamik, semakin lambat smartphone, semakin lambat loop maka sleep juga akan semakin sebentar. Yang kedua, jika loop membutuhkan waktu lebih lama dari minimal waktu yang ditentukan, maka untuk mengejar ketertinggalan update posisi akan dilakukan tanpa ditampilkan (hanya updateposisi tanpa draw). Penjelasan lebih rinci dapat dilihat di http://obviam.net/index.php/the-android-game-loop/   Kode dibawah juga saya adaptasi dari contoh pada web tersebut.  Berikut kode-nya, banyak komentar yang saya tambahkan pada kode ini, semoga bisa lebih memperjelas.

import com.example.animasicanvas2.R;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.Log;
import android.view.SurfaceHolder;

//menggunakan runnable, karena hanya run yang dibutuhkan untuk dioverride
//baca: http://manikandanmv.wordpress.com/tag/extends-thread-vs-implements-runnable/
//tentang bedanya extends thread vs runnable

//sebagian kode diambil dari : http://obviam.net/index.php/the-android-game-loop/

public class GameRunnable implements Runnable {

	 //TAMBAHAN==========

	// nilai frame per detik (fps) yang diinginkan
	// jika 25 FPS artinya satu loop yang berisi update+draw akan dieksekusi setiap 1/25 detik
	private final static int 	MAX_FPS = 25;

	// frame period, waktu satu loop dieksekusi dalam satuan mili detik (ms)
	// jadi kalau 25 FPS, maka frame perode adalah 1/25 detik atau 1000/25 ms = 40ms
	private final static int	FRAME_PERIOD = 1000 / MAX_FPS;

	// jumlah frame yang boleh dilewat saat proses update posisi terlalu lama
	// Contoh: untuk 25 FPS, satu loop berarti diekkseskusi 40ms
	// misalnya jumlah objek yang harus diupdate posisinya banyak sehingga
	// melewati 40ms, maka akan dilakukan updateposisi *TANPA* proses draw (di-skip).
	// kenapa spt itu? karena lebih baik FPS turun daripada posisi objek berantakan.
	// konstanta berikut menyatakan berapa frame proses draw boleh di-skip
	// detilnya silahkan lihat method run()
	private final static int	MAX_FRAME_SKIPS = 5;

	 //jika true, loop di run() berakhir
	 boolean mRun=false;
	 float posX=10;
	 float posY=100;
	 Bitmap bmp;
	 private Paint cat = new Paint();

	 //akses ke surface dan canvas
	 private SurfaceHolder mSurfaceHolder;

	 //akses ke context (untuk ambil resource)
	 Context mContext;

	 long lastTick;

	 private void updatePosisi(long tick) {
		 //1 tick = 1/25 detik (untuk 25FPS)
		 //update akan dilakukan jika sudah berselang 1 detik dari update terakhir
		 if (tick-lastTick > 25) {
			 //geser ke kiri dan kalau sudah max, kembali ke awal
			 posX= posX+10;
			 if (posX>200) {
				 posX=10;
			 }
			 lastTick = tick;
		 }
	 }

	 //siapkan resources berupa bitmap,
	 //ambil bitmap icon launcher supaya mudah
	 public GameRunnable(SurfaceHolder vSurfaceHolder, Context vContext) {
		  mSurfaceHolder = vSurfaceHolder;
		  mContext = vContext;
		  Resources res = mContext.getResources();
		  bmp = BitmapFactory.decodeResource(res, R.drawable.ic_launcher);
	 }

	 //bersihkan layar dan gambar objek
	 public void doDraw(Canvas c) {
		//canvas perlu dicek apakah null, karena pada saat
		 //user pindah ke activity lain (user tekan home), c bisa
		 //berisi null (proses shutdown belum selesai dan
		 //thread masih jalan, tapi canvas sudah didestroy)
		 if (c!=null) {
			//clear screen
			c.drawColor(Color.WHITE);
			//gambar bitmap
			c.drawBitmap(bmp,posX,posY,cat);
		}
	 }

	 @Override
     public void run() {

		 //TAMBAHAN
		 // waktu mulai awal loop
		 long beginTime;

		 // waktu real yang dibutuhkan untuk loop
		 long timeDiff;

		 // waktu tidur, misal FPS 25, berarti 1 loop = 40ms. Jika timeDiff = 30 ms, maka
		 // sleeptime 10ms (sisa waktu digunakan untuk sleep)
		 // tapi jika timeDiff 60ms, maka sleepTime akan bernilai negatif (-
		 int sleepTime;

		 // jumlah frame (draw) yang sudah di-skip, lihat penjelasan tentang
		 // MAX_FRAME_SKIPS diatas
		 int framesSkipped;

		 //satuan waktu update, setiap update nilai tick akan bertambah
		 //jika objek dalam suatu game banyak, nilai tick digunakan sebagai waktu global
		 //sehingga setiap objek sinkron
		 long tick = 0;

		 //loop forever selama tidak dishutdown (mRun diset false)
		 while (mRun) {
             Canvas c = null;
             try {
                 c = mSurfaceHolder.lockCanvas(null);
                 //lock surface agar tidak diakses thread lain dulu
                 synchronized (mSurfaceHolder) {
                     //TAMBAHAN
                	 //catat waktu skr
                	 beginTime = System.currentTimeMillis();
     				 framesSkipped = 0;

                	 updatePosisi(tick);
                	 tick++;
                     doDraw(c);

                     //TAMBAHAN
                     //hitung waktu yg dibutuhkan untuk satu loop
                     timeDiff = System.currentTimeMillis() - beginTime;
     				 //hitung waktu tidur, kalau positif artinya loop
                     //lebih cepat dari max FPS dan thread akan tidur
                     //tapi kalau nilainya negatif artinya loop berjalan
                     //lebih dari waktu seharusnya shg akan dilakukan penyesuaian
                     //yaitu update posisi tanpa draw.
     				 sleepTime = (int)(FRAME_PERIOD - timeDiff);

     				 //sleep sebanyak sleepTime kalau masih ada siswa waktu (sleeptime>0)
     				 if (sleepTime > 0) {
	     				 try {
	     						Thread.sleep(sleepTime);
	     				 } catch (InterruptedException e) {
	     						e.printStackTrace();
	     						Log.e("yw","error saat mencoba sleep"+e.getMessage());

	     				 }
     				 }

     				 //jika sleeptime negatif (proses update dan draw terlalu lama)
     				 //maka masuk loop berikut
     				 //di dalam loop update dilakukan *TANPA* draw
     				 while (sleepTime < 0 && framesSkipped < MAX_FRAME_SKIPS) {

    					// update posisi saja
     					updatePosisi(tick);
     					tick++;
    					//tambah, jika sleepTime>=0 keluar
    					sleepTime += FRAME_PERIOD;

    					//jumlah draw yang di-skip, dibatasi agar FPS tidak terlalu
    					//drop
    					framesSkipped++;
    				 }

                 }
             } finally {
                 //pastikan diunlock
                 if (c != null) {
                     mSurfaceHolder.unlockCanvasAndPost(c);
                 }
             }
         }
     }

	//jika diset false maka akan shutdown (lihat method run())
	public void setRunning(boolean b) {
		mRun = b;
	}
}

Implementasi Game/Animation Loop di Android

2 June 2013 at 13:49 | Posted in android | 1 Comment
Tags: ,

Bermula dari pertanyaan mahasiswa, ternyata setelah cukup lama saya mencari belum ada penjelasan yang menurut saya enak mengenai loop untuk animasi atau game berbasis canvas (game loop). Akhirnya saya coba sendiri menggunakan dasar contoh LunarLander yang merupakan bagian dari SDK samples dengan lumayan banyak modifikasi.

Game loop pada intinya adalah:

while (true) {
	updatePosisiObjek();
	gambarObjek();
}

Contoh berikut merupakan implementasi loop untuk animasi sederhana.  Jika anda belum mengerti dasar-dasar Android, anda dapat mendownload modul pengantar android di yuliadi.com/ilkom terutama bagian canvas.

Pada app ini terdapat tiga class, pertama GameRunnable yang berfungsi untuk mengatur gerakan dan menggambar di canvas. Kedua adalah GameView yang merupakan turunan dari SurfaceView yang menyediakan canvas yang akan digambar. GameView ini juga bertugas membuat dan mematikan thread (thread ini diisi GameRunnable). Terakhir adalah activity utama (MainActivity). Penjelasan lebih detil dapat dilihat di source codenya langsung.

Source code untuk class GameRunnable:

package edu.upi.cs.yudiwbs.animasicanvas2;

import com.example.animasicanvas2.R;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.Log;
import android.view.SurfaceHolder;

//menggunakan runnable, karena hanya run yang dibutuhkan untuk dioverride
//baca: http://manikandanmv.wordpress.com/tag/extends-thread-vs-implements-runnable/
//tentang bedanya extends thread vs runnable
public class GameRunnable implements Runnable {

	 //jika true, loop di run() berakhir
	 boolean mRun=false;
	 float posX=10;
	 float posY=100;
	 Bitmap bmp;
	 private Paint cat = new Paint();

	 //akses ke surface dan canvas
	 private SurfaceHolder mSurfaceHolder;

	 //akses ke context (untuk ambil resource)
	 Context mContext;

	 private void updatePosisi() {
		 //geser ke kiri dan kalau sudah max, kembali ke awal
		 posX= posX+10;
		 if (posX>200) {
			 posX=10;
		 }

		 //tidur 0.2 detik, agar animasi tdk terlalu cepat
		 try {
				Thread.sleep((long)(1000*0.2));
		 } catch (InterruptedException e) {
				e.printStackTrace();
				Log.e("yw","error saat mencoba sleep"+e.getMessage());

		 }
	 }

	 //siapkan resources berupa bitmap, ambil bitmap icon launcher supaya mudah
	 public GameRunnable(SurfaceHolder vSurfaceHolder, Context vContext) {
		  mSurfaceHolder = vSurfaceHolder;
		  mContext = vContext;
		  Resources res = mContext.getResources();
		  bmp = BitmapFactory.decodeResource(res, R.drawable.ic_launcher);
	 }

	 //bersihkan layar dan gambar objek
	 public void doDraw(Canvas c) {
		 //canvas perlu dicek apakah null, karena pada saat
		 //user pindah ke activity lain (user tekan home), c bisa
		 //berisi null (proses shutdown belum selesai dan
		 //thread masih jalan, tapi canvas sudah didestroy)
		 if (c!=null) {
			//clear screen
			c.drawColor(Color.WHITE);
			//gambar bitmap
			c.drawBitmap(bmp,posX,posY,cat);
		}
	 }

	 @Override
     public void run() {
		 //loop forever selama tidak dishutdown (mRun diset false)
         while (mRun) {
        	 Log.i("yw","looping...."); //hapus log ini kalau tidak mendebug
             Canvas c = null;
             try {
                 c = mSurfaceHolder.lockCanvas(null);
                 //lock surface agar tidak diakses thread lain dulu
                 synchronized (mSurfaceHolder) {
                     updatePosisi();
                     doDraw(c);
                 }
             } finally {
                 //pastikan diunlock
                 if (c != null) {
                     mSurfaceHolder.unlockCanvasAndPost(c);
                 }
             }
         }
     }

	//jika diset false maka akan shutdown (lihat method run())
	public void setRunning(boolean b) {
		mRun = b;
	}
}

Sedangkan code untuk class GameView adalah

package edu.upi.cs.yudiwbs.animasicanvas2;

import android.content.Context;

import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

//surfaceView digunakan karena GUI akan seriung diupdate
//dan cepat untuk animasi
public class GameView extends SurfaceView implements SurfaceHolder.Callback  {

	public Thread mThread;
	private GameRunnable gr;

	//buat thread dan jalankan
	public void startThread() {
		//objek GameRunnable jadi parameter
		mThread = new Thread(gr);
		gr.setRunning(true);
	    mThread.start();

	}

	public void shutDownThread() {
		Log.i("yw","shutdown thread mulai");
		boolean retry = true;
        gr.setRunning(false);  //matikan,

        //loop terus sampai thread berhenti karena
        //setRunning(false) tidak menghentikan seketika
        //coba lihat method GameThread.run()
        while (retry) {
            try {
                mThread.join();
                retry = false;
            } catch (InterruptedException e) {
            }
        }
        Log.i("yw","shutdown selesai");
	}

	public GameView(Context context) {
		super(context);
		SurfaceHolder holder = getHolder();
		holder.addCallback(this);
		gr = new GameRunnable(holder,context);
	}

	@Override
	public void surfaceCreated(SurfaceHolder holder) {
		Log.i("yw","jalankan thread !!");
		startThread();
	}

	@Override
	public void surfaceDestroyed(SurfaceHolder holder) {
		shutDownThread();
	}

	@Override
	public void surfaceChanged(SurfaceHolder holder, int format, int width,
			int height) {
		// bisa digunakan untuk memberi tahu GameRunnable ada perubahan dimensi
		// surface (misal dirotate)
	}
}

Dan terakhir adalah MainActivity

package edu.upi.cs.yudiwbs.animasicanvas2;

import com.example.animasicanvas2.R;

import android.os.Bundle;
import android.app.Activity;

public class MainActivity extends Activity {

GameView gv;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		gv= new GameView(this);
		setContentView(gv);
	}

	 @Override
	 protected void onPause() {
	    super.onPause();
	    //nantinya perlu diisi dengan penyimpanan state
	    //melalui bundle
	 }

	 @Override
	protected void onResume() {
		super.onResume();
		//nantinya perlu diisi dengan load state
	 }

}

Kode diatas masih memiliki kelemahan, perhatikan penggunaan delay 0.2 ms pada updatePosisi() di GameRunnable. Jika suatu saat app ini diinstall pada smartphone yang lambat dan memiliki ratusan objek yang harus diupdate posisinya maka animasi akan berjalan semakin lambat. Pada kasus sepeert itu seharusnya delay dikurangi. Posting berikutnya akan membahas cara untuk mengatasi hal ini.

Salah satu hal yang perlu ditangani adalah saat pengguna pindah ke app lain dan kembali. Misalnya dengan menekan home, pindah ke app lain lalu kembali ke app animasi ini. Setiap pengguna pindah ke app lain, maka thread harus distop agar tidak memakan resources. Setelah mencoba beberapa kali dan memperhatikan hasil log, saat home ditekan, maka canvas pada doDraw dapat bernilai null. Jadi saat thread masih berjalan canvas dapat bernilai null. Ini sebabnya perlu ada pengecekan kondisi if (c!=null) pada method GameRunnable.doDraw (baris 63). Pada app LunarLander yang asli, tidak ada pengecekan ini dan terjadi error saat user menekan home.

Hal yang lain, saat home ditekan, maka GameView.surfaceDestroyed pasti akan dipanggil. Tadinya saya mengira sistem tidak akan men-destroy kecuali kalau membutuhkan. Ini menyebabkan proses mematikan thread dilakukan bukan di activity.onPause tapi cukup di method surfaceDestroyed. Tentu dalam kondisi sebenarnya onPause dan onResume perlu ditangani untuk menyimpan state. Sebagai contoh, saat app ini dijalankan dan kemudian device dirotasi maka app akan mulai dari awal lagi (nilai GameRunnable.posX hilang).

Mempercepat Emulator Android

15 September 2012 at 00:45 | Posted in android | 10 Comments

– update Nov 2013 –
Emulator 4.2.2 versi Atom Intel sering error saat dijalankan, solusinya adalah check opsi “Wipe user data” pada launch options.

– end update-

Salah satu hal yang menyebalkan dalam membuat aplikasi android adalah emulatornya yang sangat lambat. Lambat saat load dan juga tidak responsif. Untuk mempercepat, bisa saja menggunakan smartphone Android yang dihubungkan dengan kabel USB. Tetapi cara ini tidak fleksibel dan tidak praktis, harus bolak-balik antara layar laptop dengan layar smartphone. Belum lagi jika ingin mencoba di beberapa versi Android.

Berita bagusnya, bagi yang menggunakan  prosesor Intel yang mendukung teknologi Intel VT  (virtualization tech) dapat  mempercepat waktu loading dan eksekusi  secara signifikan.  Harus dipastikan dulu prosesor yang Anda miliki mendukung VT-x  dengan mengeceknya di  http://ark.intel.com/Products/VirtualizationTechnology.   Jika ada di dalam daftar tersebut, maka langkah selanjutnya mudah (saya asumsikan Android SDK sudah diinstall).

Petama install Intel Hardware Accelerated Execution Manager (HAXM), download dan install software di alamat berikut:

http://software.intel.com/en-us/articles/intel-hardware-accelerated-execution-manager/

Atau alternatifnya melalui android SDK manager dibagian Extra.

Setelah itu install  Intel Jelly Bean x86 Emulator System, dapat  melalui android SDK dengan cara mendownload “Intel Atom x86 System Image”.  Versi terendah yang memiliki Intel System Image adalah API 10 (Android 2.3.3), tapi khusus untuk versi 2.3.3 ini ada trik yang harus dilakukan agar emulator dapat bekerja (baca keterangan di paling bawah).

ataupun melalui cara manual (download zip). Petunjuk lengkapnya ada di:

http://software.intel.com/en-us/articles/android-41-jelly-bean-x86-emulator-system-image

Selanjutnya buat AVD berdasarkan image ini dengan cara memilih  Intel sebagai target, sekali lagi: intel sebagai target (jangan ARM).  Kemudian aktifkan GPU Emulation saat membuat AVD (dibagian hardware, klik button “new” dan pilih GPU).  Coba jalankan dan AVD ini akan berjalan jauh lebih cepat dan lebih responsif (perkiraan kasar saya 400% lebih cepat).

Mengapa lebih cepat? secara default emulator android menggunakan arsitektur  ARM.  Dengan menggunakan system image Intel,   semua fitur yang disediakan prosesor Intel dapat dimanfaatkan.

Pembahasan lebih rinci tentang ini  dapat dibaca di: http://developer.android.com/tools/devices/emulator.html#accel-vm

—-
Untuk Intel System Image versi 2.3.3, jika menggunakan konfigurasi default  maka emulator akan hang diawal booting. Solusinya adalah mengeset resolusi menjadi 480×800 dan mematikan GPU (gambar bawah).   Karena resolusi diset manual, maka panel berisi keyboard/home/back  akan hilang.  Untuk mengatasi ini aktifkan keyboard support sedangkan untuk mensimulasikan tombol HOME ketik HOME, dan untuk BACK ketik ESC.

Aplikasi Android untuk Memonitor Lalulintas Bandung berdasarkan Tweet

26 April 2012 at 09:04 | Posted in android, text processing, twitter | 12 Comments

Sebelum  pergi ke luar rumah, biasanya saya memeriksa kondisi lalulintas Bandung dengan dua cara:  melihat web cam di bandung247.com dan mencari tweet dengan keyword #lalinbdg.  Sayangnya webcam di bandung247   masih terbatas,   belum ada webcam untuk Jalan Setiabudhi, Tamansari, Siliwangi, Sukajadi dan Cihampelas yang merupakan jalur utama saya pulang-pergi ke kampus.

Untuk twitter sendiri, hashtag #lalinbdg telah menjadi standard defacto bagi  pengguna twitter yang ingin melaporkan kondisi lalulintas.  Informasi terupdate sangat cepat.  Jika ada kemacetan, kecelakaan dan banjir,  maka hampir secara  real time akan  muncul.

Tetapi  mencari informasi menggunakan twitter-client atau melalui web twitter.com tidak menyenangkan. Banyak terjadi duplikasi, yang  disebabkan oleh  account seperti infobdg, bandungtraffic, dan pengguna yang meretweet.    Lalu jika membuka situs twitter.com  di smartphone,  fungsi search justru ada di bagian paling bawah.   Sedangkan jika menggunakan  twitter client, banyak fitur-fitur yang  sebenarnya saya tidak perlukan. Saya hanya butuh search saja, bukan melihat timeline, post dsb.

Solusinya saya buat app android yang khusus untuk menampilkan tweet seputar informasi lalulintas Bandung melalui hashtag #lalinbdg.  Kelebihan aplikasi ini adalah: pengurangan duplikasi, sangat simple karena hanya punya satu fungsi:search, dan ada rangkuman sehingga informasi lebih mudah dilihat saat di kendaraan. Berikut adalah contoh snapshotnya.

Jika ada yang berminat (Android 2.2 keatas), silahkan download di: https://play.google.com/store/apps/details?id=edu.upi.cs

Cara Menginstall SDK Android tanpa Internet

13 February 2011 at 21:44 | Posted in android, kuliah, Uncategorized | 68 Comments

Update Nov 2012:

Penting: sudah tersedia bundle installer Android SDK untuk Windows yang lengkap: Eclipse+ADT, platform-tools, SDK tools, platform dan system_image : http://developer.android.com/sdk/index.html   JADI LANGKAH-LANGKAH YANG DITULIS DI POSTING INI SUDAH TIDAK DIPERLUKAN LAGI. ANDA BISA MENGINSTALL SECARA OFFLINE DENGAN BUNDLE TERSEBUT. Untuk cara instalasi dengan bundle dapat dilihat di posting ini.  Sedangkan dasar-dasar membuat app Android dapat dilihat pada modul tutorial Android (ambil versi yang  paling baru) yang saya gunakan untuk memberikan praktikum  di kampus.  Modul ini berisi prosedur instalasi sampai widget, sqlite, grafik, koneksi server, pemanfaatan google map dll. Formatnya MS-Word, berlisensi creative common.  Jadi silahkan digunakan  untuk belajar,  pelatihan dst. Boleh didistribusikan, dimodifikasi dan diremix,  asal setelah dimodifikasi  doc-nya juga disebar,  nama saya tetap ada dan tidak untuk komersial.  Bagi yang belum menguasai Java, bisa mendownload  modul ini untuk dipelajari.

Update April 2012:

Pertama: posting  ini ditujukan untuk membantu pelaksanaan praktikum/pelatihan mobile computing di lab. Instalasi SDK dan  ADT di 30 komputer lab secara bersamaan menggunakan internet tentu sulit, lebih praktis  jika dilakukan offline.  Jadi jika anda hanya ingin menginstall untuk komputer pribadi,  dianjurkan menggunakan cara biasa saja (via SDK secara online) .

Update Okt 2012:
Disesuaikan dengan SDK dan ADT terakhir  (versi r20.0.3)

——–

Tidak sulit menginstall Android SDK,  tapi  perlu beberapa penyesuaikan jika memiliki koneksi internet yang terbatas atau tidak ada.  Beberapa hal saya ambil dari site ini, tapi dengan penjelasan dan tambahan Eclipse+ADT.  Saya juga masih perlu banyak belajar, jadi cmiiw 🙂

Berikut langkah-langkahnya, (bagi mahasiswa Ilkom UPI, saya sudah siapkan file-file  yang dibutuhkan di pengelola Lab Praktikum atau di Lab Basdat):

Catatan: Langkah 1 dan 2 dapat dilewat jika Anda telah menginstall Eclipse. Nama file  dapat berubah sesuai dengan versi masing-masing. Saya mencantumkan nama file  supaya memudahkan mahasiswa yang menjalankan instalasi dari CD/flash disk.

  1. Siapkan dan install Java SDK Nama filenya akan seperti  “jdk-7u7-windows-i586.exe”. Nama  dapat  berbeda  sesuai dengan versi JDK.
  2. Siapkan dan install Eclipse. Nama filenya seperti “eclipse-java-juno-SR1-win32.zip”.  Tidak perlu diinstall, tinggal ekstrak saja ke tempat yang diinginkan. Jalankan untuk memastikan Eclipse sudah bekerja.
  3. Siapkan dan install SDK Android Nama filenya seperti “installer_r20.0.3-windows.exe”, install dan catat lokasi installernya.
  4. Pada tahap ini biasanya kita harus menginstall Android platform via   SDK Manager melalui internet. Jika anda hanya menginstall untuk satu komputer, sangat disarankan untuk melakukan instalasi lewat internet dan loncat ke langkah 10.
  5. Buka struktur repo Android . Cari dengan ctrl-f kata “<sdk:platform>”.   Terlihat bahwa disediakan  beberapa versi platform  (kenapa tidak yang terbaru saja? jawabannya Android yang beredar dipasaran terdiri dari berbagai versi dan dapat tidak  kompatibel antara versi baru dengan yang lama). Kemudian lihat isi tag “<sdk:url>”.   Misalnya yang dipilih versi 2.2, maka ambil isi <sdk:url>android-2.2_r03-linux.zip</sdk:url>   lalu tambahkan setelah  dl-ssl.google.com/android/repository/   Sehingga URL-nya menjadi:  http://dl-ssl.google.com/android/repository/android-2.2_r03-linux.zip  (walaupun ujungnya ada kata linux, tapi bisa digunakan untuk windows). Download file ini.  Langkah 5-6 dapat diulang untuk versi platform yang lain. Misalnya untuk ICS, maka urlnya adalah http://dl-ssl.google.com/android/repository/android-16_r03.zip.
  6. Ekstrak file dari langkah 5.  Copy ke  direktori ke C:\Program Files\Android\android-sdk-windows\platforms (sesuai tempat menginstall SDK Android di langkah 3)   sehingga menjadi C:\Program Files\Android\android-sdk-windows\platforms\android-2.2_r02-windows dengan subdirektori seperti C:\Program Files\Android\android-sdk-windows\platforms\android-2.2_r02-windows\ant ,  data, images, skin dst. Nama direktori “android-2.2_r02-windows” bisa diganti dengan nama lain.
  7. Pada tahap ini anda membutuhkan direktori “platform-tools”,  “extras” dan “system-images” yang isinya saya tidak tahu harus mendownload dari mana. Cara yang saya gunakan adalah mengcopy  dari komputer yang sudah memiliki SDK lengkap (diupdate melalui internet).  
  8. Copy direktori “platform-tools”  ke C:\Program Files\Android\android-sdk-windows\  sehingga menjadi C:\Program Files\Android\android-sdk-windows\platform-tools.  Lakukan hal yang sama untuk direktori “extras” dan “system-images”.
  9. Jalankan ulang SDK-Manager (Start –> All Program –> Android SDK Tools –> SDK Manager). Platform 2.2 harusnya sudah otomatis muncul.
  10. Sekarang kita menyiapkan Android Virtual Device (AVD).  Di panel kiri SDK manager, ada pilihan “Virtual Device”. Klik ini. Lalu lihat dibagian kanan ada tombol “New”.   Klik “new”, akan keluar dialog.  Isi nama, target, ukuran SD-Card dst.  Setelah selesai,  dialog tertutup dan akan muncul AVD tersebut. Pilih AVD ini. Lalu klik “Start” dan tunggu. Proses ini cukup lama! (saat pertama coba  sempat saya close karena curiga hang, ternyata memang lama). Silahkan bermain-main dengan AVD ini, khususnya yang belum mempunyai phone Android.
  11. Siapkan  plugin Android untuk Eclipse, yaitu ADT (bagi yang mau mendownload  scroll kebawah sedikit dibagian “Download the current ADT Plugin zip file”).  Nama filenya akan seperti “ADT-20.0.3.zip.”.  Jalankan Eclipse.  Pilih  Help –> Install New Software. Klik “Add” lalu “Archive”. Pilih  file ADT-20.0.3.zip. beri nama “Android Plugin” dan pilih hanya developer tools saja. Lalu tekan next dan ikuti petunjuk selanjutnya ikuti petunjuk selanjutnya.
  12. Masih dalam Eclipse, kita coba buat app Android pertama. Klik  File -> New -> Other (atau ctrln-N)  Pilih “Android Project”  dibagian Android.  Ikuti petunjuk selanjutnya.
  13. Jalankan project tersebut dengan tombol play (ctrl-F11). Pilih Android Application. Tunggu AVD muncul dan loading  (untuk menghemat waktu, usahakan AVD tidak ditutup selama Eclipse masih terbuka).   Jika program Anda tidak muncul klik “menu” pada AVD.

Create a free website or blog at WordPress.com.
Entries and comments feeds.