SMS dengan Laporan

Dalam latihan sebelumnya, kita sudah belajar bagaimana mengirim sms melalui program dengan menggunakan class 'SmsManager'. Tetapi bagaimana kita tahu bahwa sms sudah terkirim dengan benar? Untuk mengetahuinya, kita bisa membuat dua object 'PendingIntent' untuk mendapatkan laporan status proses pengiriman sms. Kedua object 'PendingIntent' ini dilewatkan pada dua argumen terakhir dalam method 'sendTextMessage()'. Berikut di bawah ini adalah kode pada file 'MainActivity.java' yang dimodifikasi dari latihan sebelumnya. Untuk file layout 'activity_main.xml' dan file 'AndroidManifest.xml' masih menggunakan kode yang sama dari latihan sebelumnya.

File 'MainActivity.java':
package com.example.sms;

import android.app.Activity;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.telephony.SmsManager;
import android.view.View;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

String SENT = "SMS_SENT";
String DELIVERED = "SMS_DELIVERED";
PendingIntent sentPI, deliveredPI;
BroadcastReceiver smsSentReceiver, smsDeliveredReceiver;

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

sentPI = PendingIntent.getBroadcast(this, 0, new Intent(SENT), 0);
deliveredPI = PendingIntent.getBroadcast(this, 0, new Intent(DELIVERED), 0);
}

@Override
public void onResume() {
super.onResume();

/* --membuat BroadcastReceiver bila sms terkirim-- */
smsSentReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context arg0, Intent arg1) {
switch (getResultCode())
{
case Activity.RESULT_OK:
Toast.makeText(getBaseContext(), "SMS sent",
Toast.LENGTH_SHORT).show();
break;
case SmsManager.RESULT_ERROR_GENERIC_FAILURE:
Toast.makeText(getBaseContext(), "Generic failure",
Toast.LENGTH_SHORT).show();
break;
case SmsManager.RESULT_ERROR_NO_SERVICE:
Toast.makeText(getBaseContext(), "No service",
Toast.LENGTH_SHORT).show();
break;
case SmsManager.RESULT_ERROR_NULL_PDU:
Toast.makeText(getBaseContext(), "Null PDU",
Toast.LENGTH_LONG).show();
break;
case SmsManager.RESULT_ERROR_RADIO_OFF:
Toast.makeText(getBaseContext(), "Radio off",
Toast.LENGTH_SHORT).show();
break;
}
}
};

/**--membuat BroadcastReceiver nila sms diterima--*/
smsDeliveredReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context arg0, Intent arg1) {
switch (getResultCode())
{
case Activity.RESULT_OK:
Toast.makeText(getBaseContext(), "SMS delivered",
Toast.LENGTH_SHORT).show();
break;
case Activity.RESULT_CANCELED:
Toast.makeText(getBaseContext(), "SMS not delivered",
Toast.LENGTH_SHORT).show();
break;
}
}
};

/*--register kedua BroadcastReveiver tersebut--*/
registerReceiver(smsDeliveredReceiver, new IntentFilter(DELIVERED));
registerReceiver(smsSentReceiver, new IntentFilter(SENT));
}

@Override
public void onPause() {
super.onPause();
/*--unregister kedua BroadcastReceiver--*/
unregisterReceiver(smsSentReceiver);
unregisterReceiver(smsDeliveredReceiver);
}

public void onClick(View v) {
sendSMS("5556", "Selamat pagi semua...");
}

/*--kirim sms ke perangkat lain--*/
private void sendSMS(String nomorHp, String pesan) {
SmsManager sms = SmsManager.getDefault();
sms.sendTextMessage(nomorHp, null, pesan, sentPI, deliveredPI);
}
}

Penjelasan

Contoh latihan di atas membuat dua object 'PendingIntent' di dalam method 'onCreate()':
sentPI = PendingIntent.getBroadcast(this, 0, new Intent(SENT), 0);
deliveredPI = PendingIntent.getBroadcast(this, 0, new Intent(DELIVERED), 0);
Kedua object 'PendingIntent' ini akan digunakan untuk mengirim broadcast setelah sms terkirim ("SMS_SENT") dan diterima ("SMS_DELIVERED").

Dalam method onResume(), kita kemudian membuat dan me-register dua 'BroadcastReceivers'. Kedua 'BroadcastReceivers' akan mengawasi intent-intent yang cocok dengan "SMS_SENT" dan "SMS_DELIVERED" (yang dipicu oleh 'SmsManager' bila sms terkirim dan diterima secara berturut-turut):
/*--register kedua BroadcastReveiver tersebut--*/
registerReceiver(smsDeliveredReceiver, new IntentFilter(DELIVERED));
registerReceiver(smsSentReceiver, new IntentFilter(SENT));
Di dalam masing-masing 'BroadcastReceiver' kita meng-override method 'onReceive()' dan mengambil 'result code' saat itu.

Kedua object 'PendingIntent' dilewatkan ke dalam dua argumen terakhir pada method 'sendTextMessage()':
SmsManager sms = SmsManager.getDefault();
sms.sendTextMessage(nomorHp, null, pesan, sentPI, deliveredPI);
Dengan demikian, apakah sms sudah terkirim dengan benar atau gagal diterima, kita akan mendapatkan notifikasi statusnya melalui dua object 'PendingIntent' tersebut.

Terakhir, pada method 'onPause()', kita melakukan unregister kedua object 'BroadcastReceivers'.
Catatan: 
Bila kita menguji app tersebut di Android emulator, hanya object 'sentPI PendingIntent' yang akan dipicu, tetapi object 'delieveredPI PendingIntent' tidak dipanggil. Pada perangkat riil keduanya akan aktif.

No comments: