Android


apache2: Could not reliably determine the server’s fully qualified domain name

Ada yang pernah mencoba menjalankan ubuntu di perangkat android? Mungkin teman-teman yang pernah mencobanya mengalami masalah yang sama dengan yang saya alami. ketika  mencoba menginstall lamp server, muncul error “AH00558: apache2: Could not reliably determine the server’s fully qualified domain name, using ::1. Set the ‘ServerName’ directive globally to suppress this message” ketika akan menjalankan apache server.

Solusi:
tambahkan ServerName pada /etc/apache2/apache2.conf.

sudo nano /etc/apache2/apache2.conf

Pada contoh ini saya tambahkan dibawah Global configuration.

# Global configuration
#
ServerName localhost

Langkah selanjutnya, restart apache2.

sudo service apache2 restart

No directory, logging in with HOME=/

Ada yang pernah mencoba menjalankan ubuntu di perangkat android? Mungkin teman-teman yang pernah mencobanya mengalami masalah yang sama dengan yang saya alami. ketika  mencoba menginstall lamp server, muncul error “No directory, logging in with HOME=/” ketika akan menjalankan mysql server. Hal ini mungkin disebabkan karena kernel android dicompile dengan konfigurasi CONFIG_ANDROID_PARANOID_NETWORK. Masalah ini dapat diperbaiki dengan menambahkan mysql user pada aid_inet dan aid_net_raw groups.

usermod -a -G aid_inet,aid_net_raw mysql
su mysql

Langkah selanjutnya tinggal menjalankan mysql.

sudo service mysql start

Simpan Layout sebagai Image

   

 

Ketika kita membuat suatu aplikasi, terkadang membutuhkan dokumentasi berupa gambar (image).

Berikut adalah salah satu cara untuk membuat image dari layout yang telah dibuat.

Buat method untuk konversi dari view ke bitmap:

private Bitmap getBitmap(View view) {
    view.measure(View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED),
            View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));
    view.layout(0, 0, view.getMeasuredWidth(), view.getMeasuredHeight());
    view.buildDrawingCache(true);
    Bitmap bitmap = Bitmap.createBitmap(view.getWidth(), view.getHeight(),Bitmap.Config.ARGB_8888);
    Canvas canvas = new Canvas(bitmap);

    Drawable background =view.getBackground();
    if (background!=null) {
        background.draw(canvas);
    }else{
        canvas.drawColor(Color.WHITE);
    }
    view.draw(canvas);
    
    return bitmap;
}

Buat method untuk simpan ke dalam bentuk file:

public void save(Bitmap image, String path) {
    try {
        FileOutputStream output = new FileOutputStream(path);
        image.compress(Bitmap.CompressFormat.PNG, 100, output);
        output.close();
        Toast.makeText(context,"File berhasil disimpan di: "+path+".",Toast.LENGTH_LONG).show();
    } catch (FileNotFoundException e) {
//        e.printStackTrace();
        Log.e(TAG, e.toString());
        Toast.makeText(context,"Gagal menyimpan file.",Toast.LENGTH_LONG).show();
    } catch (IOException e) {
//        e.printStackTrace();
        Log.e(TAG, e.toString());
        Toast.makeText(context,"Gagal menyimpan file.",Toast.LENGTH_LONG).show();
    }
}

Panggil method yang telah dibuat:

image = getBitmap(layout);

Buat fungsi untuk menyimpan image:

btnSave.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        String path = Environment.getExternalStorageDirectory()+"/image.png";
        save(image, path);
    }
});
 Buat fungsi untuk menampilkan image:
btnView.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        bmImage.setImageBitmap(image);
    }
});

 

Source code:
download


Custom Color Listview Selected

Pada res, buat file color_selector.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true" android:color="#04b3d3" />
    <item android:state_selected="true" android:color="#048563" />
    <item android:color="#04b3d3" />
</selector>

Pada textview property, tambahkan android:textColor=”@color/color_selector”.

<TextView
    android:id="@+id/tv_list"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textColor="@color/color_selector"/>

Pada program java, tambahkan view.setSelected(true);.

list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        view.setSelected(true);
    }
});

 


Android TimerTask

Pada kali ini akan dicontohkan penggunaan Timer dan TimerTask untuk sekali perhitungan timer maupun timer yang berulang-ulang (repeat) pada jeda waktu tertentu.

Buat variabel yang diperlukan pada program java.

private Timer timer;
private TimerTask timerTask;

Buat method startTimer(int time). Method ini digunakan untuk perhitungan timer yang bersifat sekali jalan.

private void startTimer(int time) {
    stopTimer();
    timer = new Timer();
    initTimerTask();
    timer.schedule(timerTask,time);
}

Buat method startRepeatTimer(int time). Method ini digunakan untuk perhitungan timer yang berulang-ulang (repeat).

private void startRepeatTimer(int time) {
    stopTimer();
    timer = new Timer();
    initTimerTask();
    timer.schedule(timerTask,time,time);
}

Buat method stopTimer();

private void stopTimer() {
    if(timer != null) {
    timer.cancel();
    timer = null;
}

Buat method initTimerTask();

private void initTimerTask() {
    timerTask = new TimerTask() {
        @Override
        public void run() {
            System.out.println("On Timer.");
        }
    };
}

Untuk menjalankan timer, tinggal panggil method startTimer(int timer) atau method startRepeatTImer(int timer).

 

Gunakan Handler jika ingin menampilkan data pada TextView maupun sejenisnya.

Buat object dari class Handler.

Handler timerHandler;
timerHandler = new Handler() {
    @Override
    public void handleMessage(Message msg) {
        switch (msg.what) {
            case 0:
                textView.setText(msg.obj);
                break;
            default:
                break;
        }
    }
};

Gunakan sendMessage untuk menampilkan data.

private void initTimerTask() {
    timerTask = new TimerTask() {
        @Override
        public void run() {
            Message msg = Message.obtain(null,0,"On Timer.");
            timerHandler.sendMessage(msg);
        }
    };
}

 

Source code:
donwload


Android BroadcastReceiver

Untuk bagian broadcast:

Intent intent = new Intent();
intent.setAction(receiver);
intent.putExtra("pagi","Selamat pagi.");
sendBroadcast(intent);

Untuk bagian receiver:

// Buat receiver.
BroadcastReceiver bReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        String str = intent.getStringExtra("pagi");
        Log.d(TAG,str);
    }
};
// Buat filter.
IntentFilter filter = new IntentFilter();
filter.addAction(receiver);
// Daftarkan receiver dan filter.
registerReceiver(bReceiver,filter);

 

Source code:
download


Detecting Internet Connection

Jika kita menggunakan koneksi internet pada program android, hal yang perlu diperhatikan adalah status dari koneksi internet tersebut. Jangan sampai program yang dibuat tidak mengetahui kalau internet telah terputus. Untuk mengatasi hal ini, dengan BroadcastReceiver.

context.registerReceiver(new BroadcastReceiver() {
    @Override
        public void onReceive(Context context, Intent intent) {
            boolean noConnectivity = intent.getBooleanExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY, false);
                if (noConnectivity) {
                    // Lakukan sesuatu jika tidak ada koneksi.
                } else {
            // Lakukan sesuatu jika tidak ada koneksi.
                }
           }
}, new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION));

Pada bagian manifest, tambahkan permissin berikut:

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

Android Speedometer 2

Pada kesempatan kali ini akan saya jelaskan cara membuat speedometer analog. Untuk membuat aplikasi ini, akan digunakan library dari cardiomood. Untuk pengguna eclipse, library tersebut dapat diunduh disini (link ini merupakan hasil convert yang dilakukan oleh penulis).

  1. Buat project android.
  2. Pada layout.xml, tambahkan program berikut:
    <com.cardiomood.android.speedometer.SpeedometerView
    android:layout_height="wrap_content"
    android:layout_width="match_parent"
    android:padding="8dp"
    android:id="@+id/speedometer" />
  3. Pada bagian activity, tambahkan program berikut:
    // Customize SpeedometerView
    SpeedometerView speedometer = (SpeedometerView) findViewById(R.id.speedometer);
    
    // Add label converter
    speedometer.setLabelConverter(new SpeedometerView.LabelConverter() {
         @Override
         public String getLabelFor(double progress, double maxProgress) {
             return String.valueOf((int) Math.round(progress));
         }
    });
            
    // configure value range and ticks
    speedometer.setMaxSpeed(300);
    speedometer.setMajorTickStep(30);
    speedometer.setMinorTicks(2);
    
    // Configure value range colors
    speedometer.addColoredRange(30, 140, Color.GREEN);
    speedometer.addColoredRange(140, 180, Color.YELLOW);
    speedometer.addColoredRange(180, 400, Color.RED);
            
    // Update value
    speedometer.setSpeed(100);
  4. Jalankan program.

Source code:
Download


Android NDK

Berikut adalah salah satu cara menggunakan Android NDK:

  1. Buat program Java.
  2. Buat program C/C++.
  3. Generate header.
    Contoh:

    javah -o HalloJNI.h -jni -classpath ../src com.example.hallojni.TestJNI

    HalloJNI.h -> File  hasil generate.
    com.example.hallojni.TestJNI -> class TestJNI.java

  4. Include header file pada program C/C++;
  5. Jalankan program.

 

Beberapa error yang mungkin ditemui:

01-01 09:56:00.686: E/AndroidRuntime(3229): FATAL EXCEPTION: main
01-01 09:56:00.686: E/AndroidRuntime(3229): java.lang.UnsatisfiedLinkError: getMessage
01-01 09:56:00.686: E/AndroidRuntime(3229):     at com.example.hallojni.TestJNI.getMessage(Native Method)
01-01 09:56:00.686: E/AndroidRuntime(3229):     at com.example.hallojni.MainActivity.onCreate(MainActivity.java:19)
01-01 09:56:00.686: E/AndroidRuntime(3229):     at android.app.Activity.performCreate(Activity.java:4492)
01-01 09:56:00.686: E/AndroidRuntime(3229):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
01-01 09:56:00.686: E/AndroidRuntime(3229):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920)
01-01 09:56:00.686: E/AndroidRuntime(3229):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981)
01-01 09:56:00.686: E/AndroidRuntime(3229):     at android.app.ActivityThread.access$600(ActivityThread.java:123)
01-01 09:56:00.686: E/AndroidRuntime(3229):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147)
01-01 09:56:00.686: E/AndroidRuntime(3229):     at android.os.Handler.dispatchMessage(Handler.java:99)
01-01 09:56:00.686: E/AndroidRuntime(3229):     at android.os.Looper.loop(Looper.java:137)
01-01 09:56:00.686: E/AndroidRuntime(3229):     at android.app.ActivityThread.main(ActivityThread.java:4424)
01-01 09:56:00.686: E/AndroidRuntime(3229):     at java.lang.reflect.Method.invokeNative(Native Method)
01-01 09:56:00.686: E/AndroidRuntime(3229):     at java.lang.reflect.Method.invoke(Method.java:511)
01-01 09:56:00.686: E/AndroidRuntime(3229):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
01-01 09:56:00.686: E/AndroidRuntime(3229):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
01-01 09:56:00.686: E/AndroidRuntime(3229):     at dalvik.system.NativeStart.main(Native Method)

Solusi:

  1. Pastikan nama class sama.
  2. Pastikan header file sudah di include.

android open failed: EACCES (Permission denied) 2

Jika mendapatkan pesan error berikut:

android open failed: EACCES (Permission denied)

bisa jadi karena tidak mempunyai akses untuk menulis ke media external.

Salah satu solusinya adalah mengubah file permissions secara manual. Berikut adalah langkah-langkah untuk mengubah file permission:

  1. Pastikan bahwa perangkat android yang digunakan dalam keadaan rooted.
  2. Buka file manager yang mempunyai hak akses root (misal: ES File Explorer), arahkan kedirektori “/system/etc/permissions”.
  3. Edit “platform.xml” dan cari bagian “<permission name=”android.permission.WRITE_EXTERNAL_STORAGE” >”. Tambahkan grup permission “<group gid=”media_rw” />” sehingga menjadi:
    <permission name="android.permission.WRITE_EXTERNAL_STORAGE" >
        <group gid="sdcard_rw" />
        <group gid="media_rw" />
    </permission>
  4. Simpan, kemudian restart perangkat android.