Trong bài này chúng ta sẽ tìm hiểu cách gửi tin nhắn SMS. Về cơ bản thì có 2 cách để có thể gửi SMS là:
- Dùng lớp
SmsManager
- Dùng
Intent
Lớp SmsManager
cho phép chúng ta thiết lập các thông số khác nhau và do đó chúng ta có thể gửi tin nhắn một cách linh hoạt theo ý chúng ta muốn. Còn cách sử dụng Intent
tức là chúng ta chỉ đơn giản là mở một ứng dụng SMS khác trong máy ra rồi để người dùng “tự xử” thôi. Trong bài này chúng ta sẽ sử dụng lớp SmsManager.
Bây giờ chúng ta tạo project mới và bắt đầu tìm hiểu cách sử dụng.
Xin quyền gửi SMS
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="phocode.com.smsmanager"> <uses-permission android:name="android.permission.SEND_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> </application> </manifest>
Để ứng dụng có thể gửi tin nhắn SMS thì đầu tiên chúng ta phải xin cấp quyền android.permission.SEND_SMS.
Giao diện
Chúng ta thiết kế giao diện như sau:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context="phocode.com.smsmanager.MainActivity"> <EditText android:id="@+id/phoneNumber" android:layout_width="fill_parent" android:layout_height="wrap_content" android:ems="10" android:hint="Phone number" android:inputType="phone"/> <EditText android:id="@+id/smsBody" android:layout_width="fill_parent" android:layout_height="0dp" android:layout_weight="1" android:gravity="top" android:hint="Content" /> <Button android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="Send" android:onClick="sendSms"/> </LinearLayout>
Ở đây chúng ta có 2 EditText
dùng để nhập số điện thoại cần gửi và nội dung tin nhắn, một Button
để gọi phương thức gửi.
MainActivity
Trong Activity
chúng ta xử lý như sau:
package phocode.com.smsmanager; 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; import android.widget.Toast; public class MainActivity extends AppCompatActivity { private EditText phoneNumber; private EditText content; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); phoneNumber = (EditText) findViewById(R.id.phoneNumber); content = (EditText) findViewById(R.id.smsBody); } public void sendSms(View view) { try { SmsManager smsManager = SmsManager.getDefault(); smsManager.sendTextMessage(phoneNumber.getText().toString(), null, content.getText().toString(), null, null); Toast.makeText(getApplicationContext(), "SMS sent successful", Toast.LENGTH_LONG).show(); } catch(IllegalArgumentException ex) { Toast.makeText(getApplicationContext(), "Sending SMS failed", Toast.LENGTH_LONG).show(); } } }
Lớp Activity
này kế thừa từ lớp AppCompatActivity.
public void sendSms(View view) { ... }
Chúng ta định nghĩa phương thức sendSms()
tương ứng như đã khai báo với Button.
SmsManager smsManager = SmsManager.getDefault();
Lớp SmsManager
sẽ chịu trách nhiệm việc gửi tin nhắn. Chúng ta không tạo lớp này một cách trực tiếp mà gọi từ phương thức SmsManager.getDefault().
smsManager.sendTextMessage(phoneNumber.getText().toString(), null, content.getText().toString(), null, null);
Để gửi tin nhắn thì chúng ta gọi phương thức SmsManager.sendTextMessage().
Tham số đầu tiên là số điện thoại nhận. Tham số thứ 2 là chuỗi chỉ định địa chỉ của trung tâm tin nhắn (Short Message Service Center – SMSC), về cơ bản thì khi bạn gửi một tin nhắn đến một số điện thoại nào đó, tin nhắn của bạn phải được gửi về trung tâm này rồi trung tâm này sẽ gửi đến số điện thoại đích trong thẻ SIM của bạn, ở đây chúng ta truyền vào null thì phương thức này sẽ sử dụng số SMSC mặc định. Tham số thứ 3 là nội dung tin nhắn truyền đi. Tham số thứ 4 và thứ 5 là đối tượng Intent
được gọi khi tin nhắn đã được gửi đi và khi người nhận đã nhận được tin nhắn, ở đây chúng ta truyền vào null.
catch(IllegalArgumentException ex) { Toast.makeText(getApplicationContext(), "Sending SMS failed", Toast.LENGTH_LONG).show(); }
Phương thức sendTextMessage()
giải phóng lỗi IllegalArgumentException
khi số điện thoại và nội dung tin nhắn nhập vào là rỗng, chúng ta có thể bắt lỗi này để xử lý.