Mem-blok (intercept) App Penerima SMS built-in Supaya Tidak Menerima SMS

Dalam latihan sebelumnya, kita mungkin bertanya-tanya bahwa setiap kali kita mengirim sms ke emulator (atau perangkat), baik app kita maupun app penerima sms built-in keduanya menerima sms. Ini dikarenakan bila suatu sms diterima, semua app (termasuk app built-in) di Android akan bergiliran menangani sms yang masuk. Tetapi terkadang hal ini tidak kita inginkan, misalnya kita ingin app kita menerima sms dan kemudian mencegah/memblok supaya tidak diterima app yang lain. Ini akan sangat bermanfaat, terutama bila kita ingin membuat suatu app pelacak.

Solusinya sangat sederhana. Untuk mencegah/memblok sms yang masuk supaya tidak ditangani oleh app sms built-in, yang diperlukan adalah bahwa app kita harus menangkap sms tersebut sebelum app built-in menerimanya. Untuk melakukan ini, kita perlu tambahkan atribut 'android:priority' ke elemen <intent-filter>, seperti berikut ini:
<intent-filter><receiver android:name=".SMSReceiver">
<intent-filter android:priority="100">
<action android:name="android.provider.Telephony.SMS_RECEIVED"/>
</intent-filter>
</receiver>
Kemudian tetapkan ke atribut ini angka yang sangat tinggi, misalkan 100. Semakin tinggi angkanya, semakin awal urutan Android mengeksekusi app kita. Bila ada sms masuk diterima, app kita akan mengeksekusinya terlebih dulu, dan kita bisa memutuskan apa yang akan dilakukan dengan sms tersebut. Untuk mencegah app lain supaya tidak menerima sms tersebut, cukup panggil method 'abortBroadcast()' di dalam class 'BroadReceiver' yang sudah kita buat pada latihan sebelumnya:
@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++) {
String format = bundle.getString("format");
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);
 /*--menghentikan sms supaya tidak ter-broadcast lagi--*/
this.abortBroadcast();
}
}

Setelah kita menerapkan ini, app yang lain tidak akan bisa menerima sms.
Catatan:
Harap dicatat bahwa setelah app dengan kode tersebut di-install pada perangkat, semua sms yang masuk akan di-hadang (intercept) oleh app kita dan tidak akan muncul lagi di app sms built-in.

No comments: