Menerima SMS

Selain mengirim SMS dari app Android kita, kita juga bisa membuat app yang menerima sms yang masuk dengan menggunakan object 'BroadcastReceiver'. Hal ini bisa sangat berguna bila kita ingin app kita melakukan suatu tindakan bila ada SMS yang diterima. Misalkan, kita mungkin ingin melacak lokasi handphone kita ketika hilang atau dicuri. Dalam hal ini, kita bisa menulis suatu app yang otomatis menerima sms yang berisi suatu kode rahasia. Setelah sms tersebut diterima, kemudian kita bisa mengirim sms yang berisi koordinat lokasi ke pengirim.

Berikut adalah latihan tentang bagaimana menerima sms melalui kode program.

1. Masih menggunakan project yang sama dengan latihan sebelumnya, kita tambahkan pada file 'AndroidManifest.xml' yang ditulis tebal berikut ini:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.sms">

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

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

<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<receiver android:name=".SMSReceiver">
<intent-filter>
<action android:name="android.provider.Telephony.SMS_RECEIVED"/>
</intent-filter>
</receiver>

</application>

</manifest>
2. Di dalam folder yang sama dengan 'MainActivity.java', tambahkan file java 'SMSReceiver.java' berikut ini:
package com.example.sms;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.telephony.SmsMessage;
import android.util.Log;
import android.widget.Toast;

public class SMSReceiver extends BroadcastReceiver {

@Override
public void onReceive(Context context, Intent intent)
{
/*--mengambil sms yang masuk--*/
Bundle bundle = intent.getExtras();
SmsMessage[] msgs = null;
String str = "SMS dari ";
if (bundle != null)
{
/*--menampilkan sms yang diterima--*/
Object[] pdus = (Object[]) bundle.get("pdus");
msgs = new SmsMessage[pdus.length];
for (int i=0; i < msgs.length; i++) {
msgs[i] = SmsMessage.createFromPdu((byte[])pdus[i]);
if (i==0){
/*--mengambil nomor phone pengirim--*/
str += msgs[i].getOriginatingAddress();
str += ": ";
}
/*--mengambil isi sms--*/
str += msgs[i].getMessageBody().toString();
}
/*--menampilkan SMS baru--*/
Toast.makeText(context, str, Toast.LENGTH_SHORT).show();
Log.d("SMSReceiver", str);
}
}
}
3. Jalankan app dengan emulator di Android Studio.

4. Tekan tombol Ctrl + Shift + P, untuk mengirim sms ke emulator. App kita seharusnya sudah bisa menerima sms dan menampilkannya dengan class 'Toast'. Lihat gambar di bawah ini.
Menerima SMS

Penjelasan 

Supaya bisa menerima SMS yang masuk, kita membuat class 'BroadcastReceiver'. Class 'BroadcastReceiver' membuat app kita bisa menerima intent-intent yang dikirim oleh app yang lain dengan menggunakan method 'sendBroadcast()'. Intinya, class tersebut bisa membuat app kita menangani hal-hal yang dimunculkan oleh app lain. Bila suatu intent diterima, method 'onReceive()' dipanggil; jadi kita perlu me-override method ini. 

Bila ada SMS masuk yang diterima, method 'onReceive()' dipicu. SMS tersebut berada dalam object 'Intent' (intent; paramater kedua dalam method 'onReceive()') melalui object 'Bundle'. Perhatikan bahwa setiap SMS yang diterima akan memanggil method 'onReceive()'. Bila device kita menerima lima SMS, maka method 'onReceive()' akan dipanggil lima kali. 

Setiap SMS disimpan dalam suatu array Object dalam format PDU. Bila SMS kurang dari 160 karakter, maka array akan menjadi satu elemen. Bila SMS berisi lebih dari 160 karakter, maka SMS akan dipecah menjadi beberapa SMS dan disimpan dalam beberapa elemen dalam array tersebut. 

Untuk mengekstrak konten setiap SMS, kita menggunakan method static 'createFromPdu()' dari class 'SmsMessage'. Nomor hp pengirim didapatkan melalui method 'getOriginatingAddress()'; karena itu, bila kita perlu mengirim suatu autoreply ke si pengirim, ini adalah method yang digunakan untuk mendapatkan nomor hp si pengirim. Untuk mengekstrak isi SMS, kita menggunakan method 'getMessageBody()'. 

Salah satu karakteristik menarik dari 'BroadcastReceiver' adalah bahwa app kita akan terus siap sedia mengawasi SMS yang masuk bahkan bila app tidak sedang berjalan; sepanjang app terinstall pada perangkat, semua SMS yang masuk akan diterima oleh app tersebut.

No comments: