15 Feb 2018

Tutorial Android : Mengirim dan Membaca SMS di dalam Aplikasi

Sebuah kasus yang sedang saya ingin ketahui adalah, bagaimana bisa aktivasi SMS salah satu sosial media bisa otomatis dibaca oleh aplikasinya. Nah waktunya untuk mencoba mengimplementasikan hal tersebut walau secara sederhana dan bukan buat aktivasi hanya intinya bagaimana mengirim SMS dari aplikasi kita, dan dapat membaca SMS secara otomatis pula dari aplikasi yang kita buat.

Langsung saja seperti biasa kita buat sebuah project dengan nama CobaSMS
Membuat Project SMS masrahman28.blogspot.com
Next next saja untuk mempercepat penyelesaian, kita gunakan jenis Activity yang Empty Activity
Pilih Jenis Activity masrahman28.blogspot.com
Kirim SMS
Kita buka file activity_main.xml tambahkan satu buah EditText dan Button ya, jika nomor penerima ingin dinamis tinggal tambahkan lagi saja satu buah EditText untuk memasukan nomor penerima.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.example.cobasms.MainActivity">
    <EditText
        android:id="@+id/isiSMS"
        android:layout_width="match_parent"
        android:layout_height="150dp"
        android:maxLength="160"/>
    <Button
        android:id="@+id/btnSend"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="SEND SMS"/>
</LinearLayout>

Sudah selesai tampilan atau UI yang kita buat, saatnya kita membuat proses pengiriman SMS. Buka file ActivityMain.java

    EditText etSMS;
    Button btnSend;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        etSMS = (EditText)findViewById(R.id.isiSMS);
        btnSend = (Button)findViewById(R.id.btnSend);
        btnSend.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                SmsManager.getDefault().sendTextMessage("nomor HP tujuan", null, etSMS.getText().toString(), null, null);
                etSMS.getText().clear();
            }
        });
    }

dan Aplikasi kita sudah bisa untuk mengirim SMS nih. Mudah sekali kan ternyata, begitupun dengan cara untuk membaca SMS tidak akan begitu rumit. Kita lanjutkan ya

Membaca SMS
Agar aplikasi kita dapat membaca SMS masuk, kita membutuhkan sebuah class turunan dari BroadcastReceiver jadi langsung saja kita buat sebuah class yang akan menangani SMS-SMS yang masuk ke Mobile Android kita. Langsung saja kita buat sebuah class dengan nama SMSReceiver.java

package com.example.cobasms;

import android.app.AlertDialog;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Build;
import android.os.Bundle;
import android.provider.Telephony;
import android.telephony.SmsMessage;

public class SMSReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        if(intent.getAction().equals(Telephony.Sms.Intents.SMS_RECEIVED_ACTION)) {
            String smsBody = "";
            String smsSender = "";
            if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.KITKAT){
                for (SmsMessage smsMessage : Telephony.Sms.Intents.getMessagesFromIntent(intent)) {
                    smsSender = smsMessage.getDisplayOriginatingAddress();
                    smsBody += smsMessage.getMessageBody();
                }
            }else{
                Bundle smsBundle = intent.getExtras();
                if (smsBundle != null) {
                    Object[] pdus = (Object[]) smsBundle.get("pdus");
                    if (pdus == null) {
                        System.out.println("null");
                        return;
                    }
                    SmsMessage[] messages = new SmsMessage[pdus.length];
                    for (int i = 0; i < messages.length; i++) {
                        messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);
                        smsBody += messages[i].getMessageBody();
                    }
                    smsSender = messages[0].getOriginatingAddress();
                }
            }
     //fungsi ini akan memfilter SMS yang masuk, jadi tidak semua nomor akan kita munculkan dialog
            if(smsSender.equals("nomor HP") || smsSender.equals("+nomor HP")){
                AlertDialog.Builder builder = new AlertDialog.Builder(context);
                builder.setMessage("FROM "+smsSender + " ISI "+ smsBody);
                builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialogInterface, int i) {
                        dialogInterface.dismiss();
                    }
                });
                builder.show();
            }
        }
    }
}

Nah untuk mengimplementasikan class SMSReceiver ini kita kembali lagi ke ActivityMain.java kita tambahkan dua buah method

    @Override
    protected void onResume() {
        super.onResume();
        registerReceiver(receiver, new IntentFilter(Telephony.Sms.Intents.SMS_RECEIVED_ACTION));
    }

    @Override
    protected void onStop() {
        super.onStop();
        unregisterReceiver(receiver);
    }

Cara diatas akan membaca SMS hanya pada Activity tersebut aktif saja. Sebenarnya ada lagi cara lain yaitu dengan kita menambahkan atau mendaftarkan BroadcastReceiver kita di AndroidManifest.xml di dalam tag <application></application> dengan cara ini BroadcastReceiver akan terbaca oleh semua activity dari aplikasi yang dibuat tanpa harus melakukan register receiver di setiap class nya seperti yang saya lakukan, contohnya jika menyisipkan di Manifest

        <receiver
            android:name=".SMSReceiver"
            android:enabled="true"
            android:permission="android.permission.BROADCAST_SMS">
            <intent-filter android:priority="1000">
                <action android:name="android.provider.Telephony.SMS_RECEIVED" />
            </intent-filter>
        </receiver>

Jadi coding lengkapnya untuk ActivityMain.java akan menjadi seperti di bawah ini

package com.example.cobasms;

import android.content.IntentFilter;
import android.provider.Telephony;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.telephony.SmsManager;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;

public class MainActivity extends AppCompatActivity {
    EditText etSMS;
    Button btnSend;
    SMSReceiver receiver;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        etSMS = (EditText)findViewById(R.id.isiSMS);
        btnSend = (Button)findViewById(R.id.btnSend);
        receiver = new SMSReceiver();
        btnSend.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                SmsManager.getDefault().sendTextMessage("nomor HP tujuan", null, etSMS.getText().toString(), null, null);
                etSMS.getText().clear();
            }
        });
    }

    @Override
    protected void onResume() {
        super.onResume();
        registerReceiver(receiver, new IntentFilter(Telephony.Sms.Intents.SMS_RECEIVED_ACTION));
    }

    @Override
    protected void onStop() {
        super.onStop();
        unregisterReceiver(receiver);
    }
}

Selesai sudah, aplikasi sudah bisa dijalankan. Dan ingat untuk merubah spesifikasi/filter nomor HP  yang ada di SMSReceiver.java agar dialog muncul.

1 komentar: