Gửi tin nhắn điện thoại bằng Android

Gửi tin nhắn điện thoại bằng Android

Gửi tin nhắn điện thoại bằng Android

Hi các bạn,

Nay mình sẽ hướng dẫn các bạn gửi tin nhắn thông qua Android (Java), cực kì đơn giản thôi.

Mình đi vào chi tiết luôn nhé

1/ Quyền để gửi tin nhắn

Để gửi được tin nhắn, ta cần cấp quyền này: android.permission.SEND_SMS

Khai báo vào AndroidManifest.xml

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

Xin cấp quyền tại onCreate:

ActivityCompat.requestPermissions(context,
                    new String[]{Manifest.permission.SEND_SMS}
                    READ_SMS_PERMISSIONS_REQUEST);

(Về kiểm tra sau khi cấp quyền, cách cấp quyền cụ thể thì các bạn đợi bài post sau nhé)

2/ Gửi tin nhắn điện thoại bằng Android (cơ bản)

Rất đơn giản, 2 dòng là ta có thể gửi được tin nhắn (trực tiếp tại app, không thông qua Intent)

SmsManager sms = SmsManager.getDefault();
sms.sendTextMessage(phoneNumber, null, message, null, null);

Với biến String phoneNumber là số điện thoại, và String message là nội dung tin nhắn.

Các bạn nhớ test tại device thật để gửi tin nhé (Emulator ko dc đâu :D)

3/ Gửi tin nhắn điện thoại bằng Android (nâng cao)

Nâng cao là sao? Là ta có thể track được toàn bộ state của tin nhắn khi ta gửi, như đã gửi chưa, nhận chưa, lỗi,…

Đây là full function để các bạn có thể sử dụng và tùy biến tùy thích.

private void sendSMS(String phoneNumber, final String message)
    {
        String SENT = "SMS_SENT";
        String DELIVERED = "SMS_DELIVERED";

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

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

        //---when the SMS has been sent---
        registerReceiver(new BroadcastReceiver(){
            @Override
            public void onReceive(Context arg0, Intent arg1) {
                switch (getResultCode())
                {
                    case Activity.RESULT_OK:
                        Toast.makeText(SmsPageActivity.this, "SMS sent",
                                Toast.LENGTH_SHORT).show();
                        addRecord(message);
                        break;
                    case SmsManager.RESULT_ERROR_GENERIC_FAILURE:
                        Toast.makeText(SmsPageActivity.this, "Generic failure",
                                Toast.LENGTH_SHORT).show();
                        break;
                    case SmsManager.RESULT_ERROR_NO_SERVICE:
                        Toast.makeText(SmsPageActivity.this, "No service",
                                Toast.LENGTH_SHORT).show();
                        break;
                    case SmsManager.RESULT_ERROR_NULL_PDU:
                        Toast.makeText(SmsPageActivity.this, "Null PDU",
                                Toast.LENGTH_SHORT).show();
                        break;
                    case SmsManager.RESULT_ERROR_RADIO_OFF:
                        Toast.makeText(SmsPageActivity.this, "Radio off",
                                Toast.LENGTH_SHORT).show();
                        break;
                }
            }
        }, new IntentFilter(SENT));

        //---when the SMS has been delivered---
        registerReceiver(new BroadcastReceiver(){
            @Override
            public void onReceive(Context arg0, Intent arg1) {
                switch (getResultCode())
                {
                    case Activity.RESULT_OK:
                        Toast.makeText(SmsPageActivity.this, "SMS delivered",
                                Toast.LENGTH_SHORT).show();
                        break;
                    case Activity.RESULT_CANCELED:
                        Toast.makeText(SmsPageActivity.this, "SMS not delivered",
                                Toast.LENGTH_SHORT).show();
                        break;
                }
            }
        }, new IntentFilter(DELIVERED));

        SmsManager sms = SmsManager.getDefault();
        sms.sendTextMessage(phoneNumber, null, message, sentPI, deliveredPI);
    }

4/ Note

Khi làm việc với cái này, các bạn cần lưu ý:

  1. Test trên device thật, có sim (kể cả điện thoại 2 sim)
  2. Đối với điện thoại 2 sim, nó sẽ tự chọn 1 sim để gửi (với Xiaomi Redmi 5A của mình thì nó lấy sim 2 để gửi tin)
  3. Cần lưu ý sim phải có tiền nhé, không thì nó sẽ ra lỗi “Generic” đó 😀

Chúc các bạn thành công!

facebook
Seth Phát

Seth Phát

Mình là Phát - biệt danh Seth Phát. Hiện đang là một Sr. Full-Stack Engineer. Mình là một người yêu thích và đam mê lập trình và hiện tại đang theo về phần Web là chủ yếu. Mạnh Back-end và khá Front-end, vẫn đang theo đều cả 2 :v. Còn gì bằng khi được làm những thứ mà mình yêu thích, đam mê ;)

Bình luận qua Facebook