MEMBUAT APLIKASI SMS PADA ANDROID

09.13
Kali ini saya akan membuat aplikasi sms sederhana yang tampilannya seperti pada gambar dibawah ini

Untuk membuat aplikasi seperti yang tampak pada gambar di atas, maka buat projek baru pada IDE Eclipse. Saya membuat 5 class untuk activity, dan 6 halaman xml untuk tampilannya. Agar lebih jelas, maka berikut saya berikan tampilan struktur program pada IDE Eclipse saya


Mula-mula kita harus membuat user interface sebagai tampilan dari aplikasi sms sederhana tersebut. Tampilan utama tersebut terdiri dari 5 file berekstensi .xml yang sudah saya tandai kotak hitam pada gambar di atas. File-file berekstensi .xml tersebut diantaranya adalah:
activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

    <Button
        android:id="@+id/tombolbuatpesan"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/textView1"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="32dp"
        android:text="@string/buatpesan" />

    <Button
        android:id="@+id/tombolpesanmasuk"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignRight="@+id/tombolpesankeluar"
        android:layout_below="@+id/tombolbuatpesan"
        android:layout_marginTop="31dp"
        android:text="@string/pesanmasuk" />

    <Button
        android:id="@+id/tombolexit"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/tombolpesankeluar"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="26dp"
        android:text="@string/keluar" />

    <Button
        android:id="@+id/tombolpesankeluar"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/tombolpesanmasuk"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="22dp"
        android:text="@string/pesankeluar" />

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/textView2"
        android:layout_alignParentTop="true"
        android:layout_marginTop="22dp"
        android:text="@string/intro"
        android:textStyle="italic" />

    <TextView
        android:id="@+id/textView3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_below="@+id/textView2"
        android:text="@string/intro2"
        android:textStyle="italic" />

    <TextView
        android:id="@+id/textView2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/textView3"
        android:layout_below="@+id/textView1"
        android:text="@string/intro1"
        android:textStyle="italic" />

</RelativeLayout>

Baris kode di atas adalah mereferensikan tampilan utama dari aplikasi sms sederhana, di mana terdapat 4 tombol yang diwakili dengan kode Button dan 3 tulisan yang diwakili dengan TextView. Tulisan pada button dan tulisan pada textView sudah dimasukkan kedalam file .xml yang bernama strings.xml yang disimpan pada direktori /res/values.
buatpesan.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <LinearLayout
        android:id="@+id/boxkontak"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentRight="true"
        android:layout_alignParentTop="true"
        android:layout_marginTop="20dp" >

        <EditText
            android:id="@+id/nomorHp"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_weight="11.10"
            android:ems="10"
            android:inputType="number" />

        <ImageButton
            android:id="@+id/pick"
            style="@drawable/phonebook"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1.14"
            android:background="@drawable/phonebook"
            android:contentDescription="@string/datakontak"
            android:onClick="doLaunchContactPicker" />
    </LinearLayout>

    <LinearLayout
        android:id="@+id/boxsms"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentRight="true"
        android:layout_below="@+id/boxkontak"
        android:layout_marginTop="@dimen/duapuluh"
        android:orientation="horizontal" >

        <EditText
            android:id="@+id/smsBox"
            android:layout_width="263dp"
            android:layout_height="wrap_content"
            android:layout_marginRight="@dimen/lima"
            android:layout_marginTop="@dimen/sepuluh"
            android:ems="10"
            android:hint="@string/pesanhint"
            android:inputType="textMultiLine" >

            <requestFocus />
        </EditText>

        <ImageButton
            android:id="@+id/send"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="@drawable/send"
            android:contentDescription="@string/buatpesan" />

    </LinearLayout>

</RelativeLayout>
Baris kode diatas digunakan untuk membuat tampilan ‘buat pesan’ pada aplikasi sms sederhana. Sesuai yang ada pada baris kode program, pada halaman tersebut terdapat 2 editText yang digunakan untuk menampung data nomor handphone dan data pesan. Terdapat juga 2 image untuk mengambil data kontak handphone dan untuk mengirim pesan. Sebelumnya saya telah menyimpan file gambar berkstensi .PNG pada direktori /res/drawable/ supaya gambar tersebut dapat digunakan pada halaman ini.
lihatpesan.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:padding="@dimen/sepuluh" >

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="360dp"
        android:layout_above="@+id/linearLayout1"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:layout_marginTop="50dp" >

        <TextView
            android:id="@+id/tvMsg"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:ems="10"
            />

    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true" >

        <Button
            android:id="@+id/btFrd"
            android:layout_width="147dp"
            android:layout_height="wrap_content"
            android:layout_weight="0.90"
            android:text="@string/teruskan" />

        <Button
            android:id="@+id/hapus"
            android:layout_width="158dp"
            android:layout_height="wrap_content"
            android:text="@string/hapuspesan" />
    </LinearLayout>

    <TextView
        android:id="@+id/tvNumber"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:text="Large Text"
        android:textAppearance="?android:attr/textAppearanceLarge" />

    <TextView
        android:id="@+id/tvDate"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/tvNumber"
        android:layout_below="@+id/tvNumber"
        android:text="Small Text"
        android:textAppearance="?android:attr/textAppearanceSmall" />

</RelativeLayout>
Baris kode diatas digunakan untuk membuat halaman ‘lihat pesan’. Di mana terdapat 3 textView untuk menampilkan nama kontak, tanggal, dan isi pesan. Terdapat juga 2 button untuk forward pesan dan hapus pesan.
Listpesan.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <ListView
        android:id="@+id/listView1"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" />

</LinearLayout>
Baris kode diatas digunakan untuk menampilkan daftar pesan masuk maupun pesan keluar.
pesan_row.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:padding="6dip" >

    <TextView
        android:id="@+id/pengirim"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="TextView" />

    <TextView
        android:id="@+id/waktu"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/pengirim"
        android:layout_below="@+id/pengirim"
        android:text="TextView" />

    <TextView
        android:id="@+id/isipesan"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/waktu"
        android:layout_below="@+id/waktu"
        android:text="TextView" />

</RelativeLayout>
Pada baris kode diatas terdapat tiga textView yang nantinya akan digunakan untuk menampilkan nama pengirim, tanggal, dan potongan isi pesan pada list pesan masuk maupun pesan keluar.
Pesankeluar.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:scrollbars="vertical" >

    <TextView
        android:id="@+id/tvName"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:layout_marginLeft="17dp"
        android:text=""
        android:textAppearance="?android:attr/textAppearanceLarge" />

    <TextView
        android:id="@+id/tvDate"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_below="@+id/tvName"
        android:text=""
        android:textAppearance="?android:attr/textAppearanceMedium" />

    <TextView
        android:id="@+id/tvTime"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBaseline="@+id/tvDate"
        android:layout_alignBottom="@+id/tvDate"
        android:layout_marginLeft="34dp"
        android:layout_toRightOf="@+id/tvDate"
        android:text=""
        android:textAppearance="?android:attr/textAppearanceMedium" />

    <TextView
        android:id="@+id/tvSmallMsgView"
        android:layout_width="match_parent"
        android:layout_height="20dp"
        android:layout_alignParentLeft="true"
        android:layout_below="@+id/tvDate"
        android:text=""
        android:textAppearance="?android:attr/textAppearanceSmall" />

</RelativeLayout>
Baris kode diatas merupakan kode yang digunakan untuk tampilan lihat pesan untuk pesan keluar. Terdapat 4 textView yang nantinya akan digunakan untuk menampilkan nama penerima, tanggal, jam, dan isi pesan.
Nah sekarang proses membuat tampilan / UI sudah selesai, kini saatnya membuat activity-activity .java yang nantinya akan memproses kinerja dari aplikasi sms sederhana ini. Activity yang kita kerjakan pertama kali adalah MainActivity.java yang sudah otomatis tercipta saat kita membuat projek baru pada Eclipse.
MainActivity.java
package com.contohaplikasismssederhana;

import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.app.Activity;
import android.content.Intent;

public class MainActivity extends Activity {

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

              ((Button) findViewById(R.id.tombolbuatpesan))
                           .setOnClickListener(new OnClickListener() {

                                  public void onClick(View v) {
                                         MainActivity.this.startActivity(new Intent(
                                                       MainActivity.this, BuatPesan.class));
                                  }
                           });
              ((Button) findViewById(R.id.tombolpesankeluar))
                           .setOnClickListener(new OnClickListener() {

                                  public void onClick(View v) {
                                         Intent click = new Intent(MainActivity.this,
                                                       DataPesan.class);
                                         click.putExtra("tipepesan", "sent");
                                         startActivity(click);
                                  }
                            });
              ((Button) findViewById(R.id.tombolpesanmasuk))
                           .setOnClickListener(new OnClickListener() {

                                  public void onClick(View v) {
                                         Intent click = new Intent(MainActivity.this,
                                                       DataPesan.class);
                                         click.putExtra("tipepesan", "inbox");
                                         startActivity(click);
                                  }
                           });

              ((Button) findViewById(R.id.tombolexit))
                           .setOnClickListener(new OnClickListener() {

                                  public void onClick(View v) {
                                         Intent intent = new Intent(Intent.ACTION_MAIN);
                                         intent.addCategory(Intent.CATEGORY_HOME);
                                         intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                                         intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                                         startActivity(intent);
                                         System.exit(0);
                                  }
                           });
       }

}

Pada baris yang  saya beri warna biru di atas mengartikan bahwa MainActivity.java ini mereference ke halaman activity_main.xml, artinya halaman MainActivity.java ini akan menangani proses dari tampilan utama aplikasi ini. Pada halaman activity_main.xml terdapat 4 tombol utama dimana tombol-tombol tersebut  prosesnya ditangani oleh barisan kode yang sudah saya cetak tebal di atas.
Untuk lebih detailnya akan saya jelaskan satu persatu:
((Button) findViewById(R.id.tombolbuatpesan))
                           .setOnClickListener(new OnClickListener() {

                                  public void onClick(View v) {
                                         MainActivity.this.startActivity(new Intent(
                                                       MainActivity.this, BuatPesan.class));
                                  }
                           });

Baris kode diatas mewakili tombol ‘tombolbuatpesan’ yang sebelumnya sudah dibuat pada halaman main_activity.xml. Jika tombol tersebut diklik maka dia akan diarahkan oleh intent untuk menuju activity lain yaitu BuatPesan.java.
((Button) findViewById(R.id.tombolpesankeluar))
                           .setOnClickListener(new OnClickListener() {

                                  public void onClick(View v) {
                                         Intent click = new Intent(MainActivity.this,
                                                       DataPesan.class);
                                         click.putExtra("tipepesan", "sent");
                                         startActivity(click);
                                  }
});

Baris kode diatas mewakili tombol ‘tombolpesankeluar’ yang sebelumnya telah dibuat pada halaman main_activity.xml. Ketika tombol tersebut diklik maka intent akan mengarahkannya ke sebuah activity lain yaitu DataPesan.java. Karena class DataPesan diciptakan untuk meng-handle pesan keluar dan pesan masuk maka kita membutuhkan kode putExtra untuk melewatkan parameter “tipepesan”,”sent” sehingga class DataPesan memproses aksi tersebut untuk keperluan pesan keluar.

((Button) findViewById(R.id.tombolpesanmasuk))
                           .setOnClickListener(new OnClickListener() {

                                  public void onClick(View v) {
                                         Intent click = new Intent(MainActivity.this,
                                                       DataPesan.class);
                                         click.putExtra("tipepesan", "inbox");
                                         startActivity(click);
                                  }
      
});

Baris kode diatas mewakili tombol ‘tombolpesanmasuk’ yang sebelumnya telah dibuat pada halaman main_activity.xml. Ketika tombol tersebut diklik maka intent akan mengarahkannya ke halaman activity lain yaitu DataPesan.java. Hal ini mirip dengan tombol sebelumnya yaitu ‘tombolpesankeluar’ karena ketika tombol-tombol tersebut diklik maka prosesnya akan dialihkan ke halaman DataPesan.java sehingga kita membutuhkan parameterisasi untuk membedakan prosesnya, mana yang proses pesan keluar dan mana yang proses pesan masuk. Paramterisasi tersebut dilakukan mengguanakn kode putExtra seperti yang terlihat pada baris kode diatas.
((Button) findViewById(R.id.tombolexit))
                           .setOnClickListener(new OnClickListener() {

                                  public void onClick(View v) {
                                         Intent intent = new Intent(Intent.ACTION_MAIN);
                                         intent.addCategory(Intent.CATEGORY_HOME);
                                         intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                                         intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                                         startActivity(intent);
                                         System.exit(0);
                                  }
                           });
Baris kode diatas mewakili tombol ‘tombolexit’ yang sudah dibuat pada halaman main_activity.xml. Jika tombol tersebut diklik maka intent akan mengarahkan proses untuk membersihkan aplikasi dari memori smartphone serta System.exit(0); dan men-destroy aplikasi tersebut.
BuatPesan.java
package com.contohaplikasismssederhana;

import android.app.Activity;
import android.content.ContentValues;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.provider.ContactsContract.CommonDataKinds.Phone;
import android.telephony.SmsManager;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.Toast;

public class BuatPesan extends Activity {
       EditText nomorKontak, text;

       // contact picker
       private static final int CONTACT_PICKER_RESULT = 1001;

       // phonecontact
       public void doLaunchContactPicker(View view) {
              Uri uri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI;
              Intent contactPickerIntent = new Intent(Intent.ACTION_PICK, uri);
              startActivityForResult(contactPickerIntent, CONTACT_PICKER_RESULT);

       }

       protected void onActivityResult(int requestCode, int resultCode, Intent data) {
              String phone = "";
              Cursor contacts = null;
              try {
                     if (resultCode == RESULT_OK) {
                           switch (requestCode) {
                           case CONTACT_PICKER_RESULT:

                                  // gets the uri of selected contact
                                  Uri result = data.getData();
                                  // get the contact id from the Uri (last part is contact
                                  // id)
                                  String id = result.getLastPathSegment();
                                  // queries the contacts DB for phone no
                                  contacts = getContentResolver().query(
                                                ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
                                                null,
                                                ContactsContract.CommonDataKinds.Phone._ID + "=?",
                                                new String[] { id }, null);
                                  // gets index of phone no
                                  int phoneIdx = contacts.getColumnIndex(Phone.DATA);
                                  if (contacts.moveToFirst()) {
                                         // gets the phone no
                                         phone = contacts.getString(phoneIdx);
                                         EditText phoneTxt = (EditText) findViewById(R.id.nomorHp);
                                         // assigns phone no to EditText field phoneno
                                         phoneTxt.setText(phone);
                                  } else {
                                         Toast.makeText(this, "error", Toast.LENGTH_LONG).show();
                                  }

                                  break;

                           }

                     } else {
                           // gracefully handle failure
                           Toast.makeText(BuatPesan.this, R.string.belumdipilih,
                                         Toast.LENGTH_SHORT).show();
                     }
              } catch (Exception e) {
                     Toast.makeText(this, e.getMessage(), Toast.LENGTH_LONG).show();
              } finally {
                     if (contacts != null) {
                           contacts.close();
                     }
              }
       }

       @Override
       public void onCreate(final Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);

              setContentView(R.layout.buatpesan);

              final ImageButton send = (ImageButton) findViewById(R.id.send);

              text = (EditText) findViewById(R.id.smsBox);
              nomorKontak = (EditText) findViewById(R.id.nomorHp);

              // fungsi untuk menampilkan isi pesan saat akan diteruskan
              Intent i = getIntent();
              if (i.getStringExtra("message") != null) {
                     text.setText(i.getStringExtra("message"));
              }

              send.setOnClickListener(new OnClickListener() {

                     public void onClick(View v) {
                           String pesan = text.getText().toString();
                           String nomor = nomorKontak.getText().toString();
                           if (pesan.length() > 0 && nomor.length() > 0) {
                                  try {
                                         // proses kirim sms
                                         SmsManager sms = SmsManager.getDefault();
                                         sms.sendTextMessage(nomor, null, pesan, null, null);

                                         // proses simpan sms yang terkirim
                                         ContentValues values = new ContentValues();
                                         values.put("address", nomor);
                                         values.put("body", pesan);
                                         getContentResolver().insert(
                                                       Uri.parse("content://sms/sent"), values);

                                         Toast.makeText(BuatPesan.this,
                                                       "Pesan berhasil dikirim", Toast.LENGTH_SHORT)
                                                       .show();
                                         finish();
                                  } catch (Exception e) {
                                         Toast.makeText(BuatPesan.this, "Pesan gagal dikirim",
                                                       Toast.LENGTH_SHORT).show();
                                         e.printStackTrace();
                                  }

                           } else {
                                  Toast.makeText(BuatPesan.this,
                                                "Nomor atau Isi Pesan Masing Kosong",
                                                Toast.LENGTH_SHORT).show();
                           }

                     }
              });

       }

}
                                                      

Saat user meng-klik tombol ‘Buat Pesan’ pada halaman utama, makan ActivityMain.java akan mengarahkannya pada halaman BuatPesan.java. Pada baris yang dicetak dengan warna biru tebal diatas digunakan untuk me-load serta memilih kontak yang ada pada smartphone. Terdapat 4 komponen penting pada halaman ini yaitu image button yang digunakan untuk memilih kontak, kemudian edit text untuk mengisi nomor handphone, kemudian ada juga edit text untuk menginputkan isi pesan, dan yang terakhir adalah image button untuk mengirim pesan.
setContentView(R.layout.buatpesan);

              final ImageButton send = (ImageButton) findViewById(R.id.send);

              text = (EditText) findViewById(R.id.smsBox);
              nomorKontak = (EditText) findViewById(R.id.nomorHp);

              // fungsi untuk menampilkan isi pesan saat akan diteruskan
              Intent i = getIntent();
              if (i.getStringExtra("message") != null) {
                     text.setText(i.getStringExtra("message"));
              }
Pada baris diatas terdapat deklarasi image button (send), edit text (nomor kontak), dan edit text (isi pesan) dan kesemuanya telah mengarah pada komponen yang sudah diciptakan pada halaman buatpesan.xml.
Pada baris kode tersebut juga terdapat intent yang digunakan untuk menangkap data jika pada saat halaman tersebut dibuka ternyata terdapat data yang di parsing oleh intent jika user meng-klik fungsi forward pada halaman lihat pesan sebelumnya.
send.setOnClickListener(new OnClickListener() {

                     public void onClick(View v) {
                           String pesan = text.getText().toString();
                           String nomor = nomorKontak.getText().toString();
                           if (pesan.length() > 0 && nomor.length() > 0) {
                                  try {
                                         // proses kirim sms
                                         SmsManager sms = SmsManager.getDefault();
                                         sms.sendTextMessage(nomor, null, pesan, null, null);

Baris kode diatas akan dijalankan saat image button (send) ditekan. EditText (nomor kontak) dan EditText (pesan) akan diinisialisasi dengan data yang dipilih / dientry oleh user. Kemudian proses pengiriman pesan akan dijalankan oleh method SmsManager. Tidak seperti method-method yang lain yang bisa langsung diinstansiasi, SmsManager memerlukan method getDefault dan sendTextMessege untuk instansiasi.
DataPesan.java
package com.contohaplikasismssederhana;

import java.util.Date;
import java.text.DateFormat;

import android.app.Activity;
import android.content.ContentResolver;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.support.v4.widget.SimpleCursorAdapter;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;
import android.widget.TextView;
import android.view.View;

public class DataPesan extends Activity {
       private SimpleCursorAdapter dataAdapter;

       @Override
       public void onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
              setContentView(R.layout.listpesan);

              displayListView();

       }

       private void displayListView() {
              Intent i = getIntent();
              Uri uriSMS = Uri
                           .parse("content://sms/" + i.getStringExtra("tipepesan"));
              Cursor cursor = getContentResolver().query(uriSMS, null, null, null,
                           null);

              String[] columns = new String[] { "address", "body", "date" };

              int[] to = new int[] { R.id.pengirim, R.id.isipesan, R.id.waktu };

              dataAdapter = new SimpleCursorAdapter(this, R.layout.pesan_row, cursor,
                           columns, to, 0);

              ListView listView = (ListView) findViewById(R.id.listView1);

              dataAdapter.setViewBinder(new SimpleCursorAdapter.ViewBinder() {
                     @Override
                     public boolean setViewValue(View view, Cursor cursor,
                                  int columnIndex) {

                           // ubah nomer hape dengan nama yang ada dikontak
                           if (columnIndex == 2) {
                                  TextView tv = (TextView) view;
                                  String pengirimDB = cursor.getString(cursor
                                                .getColumnIndex("address"));
                                  // get contact name
                                  Uri contactUri = Uri.withAppendedPath(
                                                ContactsContract.PhoneLookup.CONTENT_FILTER_URI,
                                                Uri.encode(pengirimDB));
                                  Cursor cur = getContentResolver().query(contactUri, null,
                                                null, null, null);
                                  ContentResolver contect_resolver = getContentResolver();

                                  int size = cur.getCount();
                                  if (size > 0 && cur != null) {
                                         for (int i = 0; i < size; i++) {
                                                cur.moveToPosition(i);

                                                String id1 = cur.getString(cur
                                                              .getColumnIndexOrThrow(ContactsContract.Contacts._ID));

                                                Cursor phoneCur = contect_resolver
                                                              .query(contactUri,
                                                                           null,
                                                                            ContactsContract.CommonDataKinds.Phone.CONTACT_ID
                                                                                         + " = ?",
                                                                           new String[] { id1 }, null);

                                                if (phoneCur.moveToFirst()) {
                                                       String namaKontak = phoneCur.getString(phoneCur
                                                                     .getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
                                                       phoneCur.close();
                                                       tv.setText(namaKontak);
                                                } else {
                                                       tv.setText(pengirimDB);
                                                }

                                         }

                                         cur.close();
                                  } else {
                                         tv.setText(pengirimDB);
                                  }

                                  return true;
                           }

                           // konversi tanggal
                           if (columnIndex == 4) {
                                  TextView tv = (TextView) view;
                                  String waktu = cursor.getString(cursor
                                                .getColumnIndex("date"));
                                  long l = Long.parseLong(waktu);
                                  Date d = new Date(l);
                                  String date = DateFormat.getDateInstance(DateFormat.LONG)
                                                .format(d);
                                  String time = DateFormat.getTimeInstance().format(d);
                                  String view_waktu = date + " " + time;

                                  tv.setText(view_waktu);

                                  return true;
                           }

                           return false;
                     }
              });

              // menampilkan daftar pesan
              listView.setAdapter(dataAdapter);

              // jika di pesan di klik, maka akan dialihkan ke lihat pesan secara full
              listView.setOnItemClickListener(new OnItemClickListener() {
                     @Override
                     public void onItemClick(AdapterView<?> listView, View view,
                                  int position, long id) {
                           // Get the cursor, positioned to the corresponding row in the
                            // result set
                           Cursor cursor = (Cursor) listView.getItemAtPosition(position);

                           // Get the state's capital from this row in the database.
                           String view_pengirim = cursor.getString(cursor
                                         .getColumnIndexOrThrow("address"));
                           String view_isipesan = cursor.getString(cursor
                                         .getColumnIndexOrThrow("body"));

                           String waktu = cursor.getString(cursor
                                         .getColumnIndexOrThrow("date"));

                           // konversi tanggal
                           long l = Long.parseLong(waktu);
                           Date d = new Date(l);
                           String date = DateFormat.getDateInstance(DateFormat.LONG)
                                         .format(d);
                           String time = DateFormat.getTimeInstance().format(d);
                           String view_waktu = date + " " + time;

                           String view_idpesan = cursor.getString(cursor
                                         .getColumnIndexOrThrow("_id"));
                           String view_thread = cursor.getString(cursor
                                         .getColumnIndexOrThrow("thread_id"));
                           Intent click = new Intent(DataPesan.this, LihatPesan.class);

                           // get contact name
                           Uri contactUri = Uri.withAppendedPath(
                                         ContactsContract.PhoneLookup.CONTENT_FILTER_URI,
                                         Uri.encode(view_pengirim));
                           Cursor cur = getContentResolver().query(contactUri, null, null,
                                         null, null);
                           ContentResolver contect_resolver = getContentResolver();

                           int size = cur.getCount();
                           if (size > 0 && cur != null) {
                                  for (int i = 0; i < size; i++) {
                                         cur.moveToPosition(i);

                                         String id1 = cur.getString(cur
                                                       .getColumnIndexOrThrow(ContactsContract.Contacts._ID));

                                         Cursor phoneCur = contect_resolver
                                                       .query(contactUri,
                                                                     null,
                                                                     ContactsContract.CommonDataKinds.Phone.CONTACT_ID
                                                                                  + " = ?", new String[] { id1 },
                                                                     null);

                                         if (phoneCur.moveToFirst()) {
                                                String namaKontak = phoneCur.getString(phoneCur
                                                              .getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
                                                phoneCur.close();
                                                click.putExtra("no", namaKontak);
                                         } else {
                                                click.putExtra("no", view_pengirim);
                                         }

                                  }

                                  cur.close();
                           } else {
                                  click.putExtra("no", view_pengirim);
                           }

                           // kirim data ke view pesan
                           click.putExtra("msg", view_isipesan);
                           click.putExtra("idpesan", view_idpesan);
                           click.putExtra("idthread", view_thread);
                           click.putExtra("date", view_waktu);
                           Intent i = getIntent();
                            click.putExtra("asal", i.getStringExtra("tipepesan"));
                           startActivity(click);

                     }
              });

       }

       @Override
       public void onBackPressed() {
              Intent link = new Intent(DataPesan.this, MainActivity.class);
              startActivity(link);
              finish();

       }

}
Baris kode diatas berkaitan dengan list yang ada pada pesan masuk dan pesan keluar. Pada halaman pesan masuk / pesan keluar terdapat beberapa data yang akan diload dalam bentuk listView. Activity DataPesan.java ini mengacu pada halaman listpesan.xml dimana pada halaman listpesan.xml sudah dibuat listView. Data yang akan diload pada listView mempunyai format yaitu nama pengirim, tanggal, dan sebagian isi pesan. Data tersebut akan diload dengan fungsi SimpleCursorAdapter. Kemudian untuk memenuhi format list pesan, maka halaman tersebut akan mengarahkan ke pesan_row.xml
LihatPesan.java
package com.contohaplikasismssederhana;

import android.app.Activity;
import android.content.DialogInterface;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

public class LihatPesan extends Activity {
       TextView number, date, msg;
       Button forward, hapus;

       @Override
       protected void onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
              setContentView(R.layout.lihatpesan);
              number = (TextView) findViewById(R.id.tvNumber);
              date = (TextView) findViewById(R.id.tvDate);
              msg = (TextView) findViewById(R.id.tvMsg);
              forward = (Button) findViewById(R.id.btFrd);
              hapus = (Button) findViewById(R.id.hapus);
       }

       @Override
       protected void onStart() {
              super.onStart();
              Intent i = getIntent();
              number.setText(i.getStringExtra("no"));
              date.setText(i.getStringExtra("date"));
              msg.setText(i.getStringExtra("msg"));

              forward.setOnClickListener(new OnClickListener() {

                     @Override
                     public void onClick(View v) {
                           Intent click = new Intent(LihatPesan.this, BuatPesan.class);
                           click.putExtra("message", msg.getText());
                           startActivity(click);

                     }
              });
              hapus.setOnClickListener(new OnClickListener() {
                     @Override
                     public void onClick(View v) {
                           Dialogs.showConfirmation(LihatPesan.this,
                                         R.string.hapuspesan_dialog,
                                          new DialogInterface.OnClickListener() {

                                                public void onClick(DialogInterface dialog,
                                                              int which) {
                                                       Intent i = getIntent();
                                                       String id_pesan_hapus = i
                                                                     .getStringExtra("idpesan");
                                                       String id_thread_hapus = i
                                                                     .getStringExtra("idthread");

                                                       // hapus pesan
                                                       Uri deleteUri = Uri.parse("content://sms");

                                                       getContentResolver()
                                                                     .delete(deleteUri,
                                                                                  "thread_id=? and _id=?",
                                                                                  new String[] {
                                                                                                String.valueOf(id_thread_hapus),
                                                                                                String.valueOf(id_pesan_hapus) });

                                                       finish();
                                                       Toast.makeText(LihatPesan.this,
                                                                     "Pesan Terhapus", Toast.LENGTH_SHORT)
                                                                     .show();

                                                       // redirect data pesan
                                                       onBackPressed();
                                                }
                                         });
                     }
              });

       }

       @Override
       public void onBackPressed() {
              Intent link = new Intent(LihatPesan.this, DataPesan.class);
              Intent i = getIntent();
              link.putExtra("tipepesan", i.getStringExtra("asal"));
              startActivity(link);
       }

}

Baris kode diatas ditujukan untuk memproses halaman lihatpesan.xml yang sebelumnya telah dibuat.
public class LihatPesan extends Activity {
       TextView number, date, msg;
       Button forward, hapus;

       @Override
       protected void onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
              setContentView(R.layout.lihatpesan);
              number = (TextView) findViewById(R.id.tvNumber);
              date = (TextView) findViewById(R.id.tvDate);
              msg = (TextView) findViewById(R.id.tvMsg);
              forward = (Button) findViewById(R.id.btFrd);
              hapus = (Button) findViewById(R.id.hapus);
       }
Pada bagian baris kode diatas terlihat bahwa halaman tersebut ditujukan untuk memproses halaman lihatpesan.xml. Terdapat beberapa textview dan button pada halaman tersebut. Textview tersebut diantaranya adalah number yang digunakan untuk menampilkan nama pengirim pesan, kemudian date yang digunakan untuk menampilkan tanggal pengiriman pesan, da nada juga msg yang digunakan untuk menampilkan isi pesan. Kemudian terdapat 2 button pada halaman tersebut yaitu button untuk memforward pesan dan button untuk menghapus pesan, keduanya diinisialisasi dengan nama forward dan hapus.
protected void onStart() {
              super.onStart();
              Intent i = getIntent();
              number.setText(i.getStringExtra("no"));
              date.setText(i.getStringExtra("date"));
       msg.setText(i.getStringExtra("msg"));
Data-data nama pengirim, tanggal, dan isi pesan tersebut sebelumnya telah diparsing dahulu melalui activity DataPesan.java, sehingga pada halaman ini kita hanya tinggal menangkapnya dengan fungsi getIntent(); seperti yang terlihat pada potongan baris kode diatas. Setelah itu data yang sudah ditangkap tadi kita masukkan ke textView yang sudah diinisialisasi tadi menggunakan fungsi setText.
                forward.setOnClickListener(new OnClickListener() {

                     @Override
                     public void onClick(View v) {
                           Intent click = new Intent(LihatPesan.this, BuatPesan.class);
                           click.putExtra("message", msg.getText());
                           startActivity(click);

                     }
              });
Ketika button forward ditekan maka intent (click) akan mengarahkannya ke activity BuatPesan.java seperti yang terlihat pada gambar diatas. Tentunya dengan parameter yang sudah dipersiapkan, yaitu “messege”, yang isinya adalah pesan yang sudah ditangkap dengan kode msg.getText().
hapus.setOnClickListener(new OnClickListener() {
                     @Override
                     public void onClick(View v) {
                           Dialogs.showConfirmation(LihatPesan.this,
                                         R.string.hapuspesan_dialog,
                                         new DialogInterface.OnClickListener() {

                                                public void onClick(DialogInterface dialog,
                                                              int which) {
                                                       Intent i = getIntent();
                                                       String id_pesan_hapus = i
                                                                     .getStringExtra("idpesan");
                                                       String id_thread_hapus = i
                                                                     .getStringExtra("idthread");

                                                       // hapus pesan
                                                       Uri deleteUri = Uri.parse("content://sms");

                                                       getContentResolver()
                                                                     .delete(deleteUri,
                                                                                  "thread_id=? and _id=?",
                                                                                  new String[] {
                                                                                                String.valueOf(id_thread_hapus),
                                                                                                String.valueOf(id_pesan_hapus) });

                                                       finish();
Ketika tombol ‘hapus pesan’ ditekan maka intent akan mencari id pesan kemudian menghapus data pesan tersebut. Dimana aksi tersebut diwakili oleh kode .delete.




Setelah halaman-halaman activity tersebut diciptakan, langkah selanjutnya adalah mengedit halaman AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.contohaplikasismssederhana"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-permission android:name="android.permission.SEND_SMS" />
    <uses-permission android:name="android.permission.READ_SMS" />
    <uses-permission android:name="android.permission.WRITE_SMS" />
    <uses-permission android:name="android.permission.RECEIVE_SMS" />
    <uses-permission android:name="android.permission.READ_CONTACTS" />

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="17" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.contohaplikasismssederhana.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name="com.contohaplikasismssederhana.BuatPesan"
            android:label="@string/app_name" >
        </activity>
         <activity
            android:name="com.contohaplikasismssederhana.LihatPesan"
            android:label="@string/app_name" >

        </activity>
        <activity
            android:name="com.contohaplikasismssederhana.DataPesan"
            android:label="@string/app_name" >
        </activity>
    </application>

</manifest>
Pada baris yang saya cetak tebal dengan warna merah diatas mengartikan bahwa aplikasi yang kita buat memerlukan perizinan untuk membuat, mengirim, membaca, dan menerima sms serta melihat kontak di handphone. Mengapa memerlukan perizinan? Jawabnya adalah karena kita tidak menggunakan aplikasi built in dari android.
Pada baris diatas juga terlihat bahwa kita mengguanakn 4 activity yang berbeda. Activity-activity tersebut adalah activity yang mewakili button-button utama pada tampilan utama aplikasi.
Proses selanjutnya adalah menjalankan aplikasi tersebut melalui AVD (Android Virtual Device).

Untuk membuat AVD, silahkan menuju menu Windows -> Android Virtual Device
Disini saya sudah membuat 2 AVD seperti yang telah terlihat pada gambar dibawah ini:

Kemudian saya start AVD tersebut dengan menekan button start. Tunggu hingga tampilannya seperti berikut ini.



Selanjutnya adalah me-running aplikasi yang telah kita buat ke dalam AVD tersebut caranya yaitu:
Klik kanan pada direktori projek, kemudian pilih run us -> android application


Selanjutnya akan muncul tampilan seperti berikut ini:


Pilih salah satu AVD yang akan menjalankan aplikasi kita, dalam kasus diatas saya memilih ‘mbuhView2’ sebagai AVD yang menjalankan aplikasi sms ini.

Kemudian munculah aplikasi yang sudah kita buat tadi

Saya mencoba membuat pesan dan mengirimnya ke AVD saya yang satunya, dengan cara seperti berikut ini
Saya mencoba mengirimkan pesan ke device 5556 / ‘mbuhView’ dengan cara mengetikkan nomor handphone device 5556. Karena ini AVD maka nomornya adalah 5556 sesuai nomor ID AVD tersebut. Kemudian saya mengetikkan pesan yang ingin saya kirim, dan saya klik kirim. Alhasil di AVD 5556 pesan tiba dan sesua dengan apa yang saya entry kan.



SEKIAN DAN TERIMA KASIH.

Share this :

Previous
Next Post »
2 Komentar
avatar

Ass,wr,wt saya atas Ibu salmah sangat berterima kasih banyak kepada AKI SOLEH atas bantuan pesugihan dana ghaib, kini kehidupan saya sekeluarga sudah jauh lebih baik dari sebelumnya,ternyata apa yang tertulis didalam blok AKI SOLEH itu semuanya benar benar terbukti nyata dan saya adalah salah satunya orang yang sudah membuktikannya sendiri,usaha kami dulunya bangkrut kini alhamdulillah sekarang sudah mulai bangkit lagi itu semua berkat bantuan AKI,saya tidak pernah menyangka kalau saya bisa sesukses seperti ini, dan kami sekeluarga tak lupah mengucapkan banyak berterima kasih kepada AKI,,bagi anda yang ingin dibantu sama AKI SOLEH silahkan hubungi di 082 313 336 747 insya allah AKI akan membantu anda dengan senang hati,pesugihan putih tanpa resiko apapun
Atau Chat/Tlpn di WhatsApp (WA)
No WA Aki : 082313336747

Balas
avatar

F4n583771nG | Ayo Joint.... ditunggu ya :) silahkan di add
WA kami @ +855 963 156 245
line @ fansbetting
wechat @ fansbetting3
bersama dengan kami CS fansbetting thankyou,,,

Balas

Penulisan markup di komentar
  • Silakan tinggalkan komentar sesuai topik. Komentar yang menyertakan link aktif, iklan, atau sejenisnya akan dihapus.
  • Untuk menyisipkan kode gunakan <i rel="code"> kode yang akan disisipkan </i>
  • Untuk menyisipkan kode panjang gunakan <i rel="pre"> kode yang akan disisipkan </i>
  • Untuk menyisipkan quote gunakan <i rel="quote"> catatan anda </i>
  • Untuk menyisipkan gambar gunakan <i rel="image"> URL gambar </i>
  • Untuk menyisipkan video gunakan [iframe] URL embed video [/iframe]
  • Kemudian parse kode tersebut pada kotak di bawah ini
  • © 2015 Simple SEO ✔