Cách thực hiện các cuộc gọi và sử dụng SMS trong các ứng dụng Android
Vietnamese (Tiếng Việt) translation by Dai Phong (you can also view the original English article)
Trong hướng dẫn này, bạn sẽ tìm hiểu về Android Telephone và SMS API. Bạn sẽ học cách để thực hiện cuộc gọi từ ứng dụng của bạn và cách theo dõi các sự kiện gọi điện, cũng như cách làm thế nào để gửi và nhận tin nhắn SMS.
1. Cách thực hiện một cuộc gọi
Để bắt đầu, tôi sẽ hướng dẫn bạn cách khởi tạo một cuộc gọi từ ứng dụng của bạn bằng cách sử dụng một ứng dụng quay số hoặc trực tiếp từ ứng dụng của bạn để giúp dễ dàng hơn cho người dùng của bạn.
Tạo một dự án Android Studio mới
Mở Android Studio và tạo ra một dự án mới với một Activity rỗng được gọi là MainActivity.
Tạo Layout
Hiện giờ, layout của chúng ta sẽ chỉ có một trường EditText và một nút Dial:
1 |
<?xml version="1.0" encoding="utf-8"?>
|
2 |
<LinearLayout
|
3 |
xmlns:android="https://schemas.android.com/apk/res/android" |
4 |
xmlns:tools="http://schemas.android.com/tools" |
5 |
android:id="@+id/activity_main" |
6 |
android:orientation="vertical" |
7 |
android:layout_width="match_parent" |
8 |
android:layout_height="match_parent" |
9 |
android:paddingLeft="@dimen/activity_horizontal_margin" |
10 |
android:paddingRight="@dimen/activity_horizontal_margin" |
11 |
android:paddingTop="@dimen/activity_vertical_margin" |
12 |
android:paddingBottom="@dimen/activity_vertical_margin" |
13 |
android:gravity="center_horizontal|center_vertical" |
14 |
tools:context="com.chikeandroid.tutsplust_telephony.MainActivity"> |
15 |
|
16 |
<EditText
|
17 |
android:id="@+id/et_phone_no" |
18 |
android:hint="Enter Phone number" |
19 |
android:inputType="phone" |
20 |
android:layout_width="match_parent" |
21 |
android:layout_height="wrap_content"/> |
22 |
|
23 |
<Button
|
24 |
android:id="@+id/btn_dial" |
25 |
android:layout_gravity="center_horizontal" |
26 |
android:text="Dial" |
27 |
android:layout_width="wrap_content" |
28 |
android:layout_height="wrap_content"/> |
29 |
</LinearLayout>
|

Chỉnh sửa lớp MainActivity
Trong khối code ở bên dưới, chúng ta đang tạo ra một intent ACTION_DIAL để hiển thị trình quay số. Số điện thoại được phân tách từ lược đồ URI tel của chúng ta: tel:XXXXXXXX. Lưu ý rằng bạn không cần bất kỳ quyền nào để làm việc này:
1 |
import android.content.Intent; |
2 |
import android.net.Uri; |
3 |
import android.os.Bundle; |
4 |
import android.support.v7.app.AppCompatActivity; |
5 |
import android.text.TextUtils; |
6 |
import android.view.View; |
7 |
import android.widget.Button; |
8 |
import android.widget.EditText; |
9 |
import android.widget.Toast; |
10 |
|
11 |
public class MainActivity extends AppCompatActivity { |
12 |
|
13 |
@Override
|
14 |
protected void onCreate(Bundle savedInstanceState) { |
15 |
super.onCreate(savedInstanceState); |
16 |
setContentView(R.layout.activity_main); |
17 |
Button mDialButton = (Button) findViewById(R.id.btn_dial); |
18 |
final EditText mPhoneNoEt = (EditText) findViewById(R.id.et_phone_no); |
19 |
|
20 |
mDialButton.setOnClickListener(new View.OnClickListener() { |
21 |
@Override
|
22 |
public void onClick(View view) { |
23 |
String phoneNo = mPhoneNoEt.getText().toString(); |
24 |
if(!TextUtils.isEmpty(phoneNo)) { |
25 |
String dial = "tel:" + phoneNo; |
26 |
startActivity(new Intent(Intent.ACTION_DIAL, Uri.parse(dial))); |
27 |
}else { |
28 |
Toast.makeText(MainActivity.this, "Enter a phone number", Toast.LENGTH_SHORT).show(); |
29 |
}
|
30 |
}
|
31 |
});
|
32 |
}
|
33 |
}
|
Nếu bạn chạy ứng dụng và nhấp vào nút Dial, bạn sẽ được đưa đến ứng dụng quay số, và từ đó bạn có thể thực sự quay số. Bạn có thể thay đổi quá trình này để thật sự tạo cuộc gọi từ bên trong ứng dụng của bạn bằng cách đơn giản là thay đổi intent ACTION_DIAL thành ACTION_CALL. Tuy vậy, điều này sẽ đòi hỏi quyền android.permission.CALL_PHONE.

2. Giám sát các sự kiện gọi điện
Trong phần này, chúng ta sẽ tìm hiểu cách làm thế nào để theo dõi các sự kiện gọi điện trong hệ thống Android. Điện thoại có thể ở trong ba trạng thái:
- idle (khi nó không được sử dụng)
- ringing (khi có cuộc gọi đến)
- off-hook (khi trả lời cuộc gọi)
Thêm quyền
Chúng ta cần quyền READ_PHONE_STATE để có thể theo dõi trạng thái của điện thoại. Thêm nó vào AndroidManifest.xml:
1 |
<uses-permission android:name="android.permission.READ_PHONE_STATE"/> |
Tạo đối tượng PhoneStateListener
Chúng ta tạo một đối tượng của lớp PhoneStateListener, và sau đó override phương thức onCallStateChanged() của nó (trong IntelliJ rất dễ dàng để làm điều này với Control-O, và sau đó chọn hoặc tìm kiếm phương thức để override). Chúng ta sẽ xử lý các thay đổi đối với trạng thái cuộc gọi bằng cách hiển thị một Toast. Lưu ý rằng chúng ta cũng có thể truy cập đến số điện thoại khi phương thức này được kích hoạt:
1 |
// ...
|
2 |
PhoneStateListener mPhoneStateListener = new PhoneStateListener() { |
3 |
@Override
|
4 |
public void onCallStateChanged(int state, String incomingNumber) { |
5 |
super.onCallStateChanged(state, incomingNumber); |
6 |
|
7 |
switch (state) { |
8 |
case TelephonyManager.CALL_STATE_IDLE: |
9 |
Toast.makeText(MainActivity.this, "CALL_STATE_IDLE", Toast.LENGTH_SHORT).show(); |
10 |
break; |
11 |
case TelephonyManager.CALL_STATE_RINGING: |
12 |
Toast.makeText(MainActivity.this, "CALL_STATE_RINGING", Toast.LENGTH_SHORT).show(); |
13 |
break; |
14 |
case TelephonyManager.CALL_STATE_OFFHOOK: |
15 |
Toast.makeText(MainActivity.this, "CALL_STATE_OFFHOOK", Toast.LENGTH_SHORT).show(); |
16 |
break; |
17 |
}
|
18 |
}
|
19 |
};
|
20 |
// ...
|
Tùy thuộc vào nhu cầu của ứng dụng, bạn cũng có thể override một trong những phương thức sự kiện khác nhau: onCellInfoChanged(), onCallForwardingIndicatorChanged(), onCellLocationChanged() hoặc onSignalStrengthChanged().
Lắng nghe trạng thái cuộc gọi
Để bắt đầu lắng nghe trạng thái cuộc gọi, chúng ta cần lấy TelephonyManager từ dịch vụ hệ thống và khởi tạo nó trong onCreate().
1 |
// ...
|
2 |
private TelephonyManager mTelephonyManager; |
3 |
@Override
|
4 |
protected void onCreate(Bundle savedInstanceState) { |
5 |
// ...
|
6 |
mTelephonyManager = (TelephonyManager) getSystemService(getApplicationContext().TELEPHONY_SERVICE); |
7 |
}
|
Trong phương thức onResume(), chúng ta có thể bắt đầu lắng nghe bằng cách sử dụng phương thức listen() của TelephonyManager, truyền vào nó đối tượng PhoneStateListener và biến tĩnh LISTEN_CALL_STATE. Chúng ta dừng lắng nghe trong phương thức onStop() bằng cách truyền LISTEN_NONE như là đối số thứ hai vào listen().
1 |
// ...
|
2 |
@Override
|
3 |
protected void onResume() { |
4 |
super.onResume(); |
5 |
mTelephonyManager.listen(mPhoneStateListener, PhoneStateListener.LISTEN_CALL_STATE); |
6 |
}
|
7 |
@Override
|
8 |
protected void onStop() { |
9 |
super.onStop(); |
10 |
mTelephonyManager.listen(mPhoneStateListener, PhoneStateListener.LISTEN_NONE); |
11 |
}
|
12 |
// ...
|
Các tuỳ chọn lắng nghe cuộc gọi khác có thể là LISTEN_CELL_LOCATION, LISTEN_SIGNAL_STRENGTH, LISTEN_CALL_FORWARDING_INDICATOR và LISTEN_CELL_INFO.
Cuối cùng, chạy ứng dụng và hãy tạo một cuộc gọi đến.

Việc giám sát này sẽ chỉ hoạt động khi ứng dụng ở foreground. Để điều này hoạt động trong background (khi không chạy ứng dụng của chúng ta), chúng ta cần tạo ra một BroadcastReceiver để ngay cả khi ứng dụng không chạy, chúng ta vẫn có thể giám sát trạng thái cuộc gọi. Tùy thuộc vào các yêu cầu ứng dụng, điều đó có thể là một cách tốt hơn nhiều để lắng nghe các thay đổi trạng thái cuộc gọi. Tôi sẽ cho bạn thấy cách làm thế nào để làm điều này trong phần tiếp theo.
Lưu ý rằng chúng ta chỉ theo dõi các cuộc gọi đến. Để chúng ta theo dõi các cuộc gọi đi, chúng ta cần thêm quyền. Để theo dõi các cuộc gọi đi, hãy thêm dòng sau trong tập tin AndroidManifest.xml của bạn.
1 |
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"/> |
Cách sử dụng Emulator để thực hiện các cuộc gọi và tin nhắn SMS
Bạn có thể sử dụng emulator của bạn để mô phỏng cuộc gọi hoặc gửi một tin nhắn SMS, nhưng bạn sẽ cần phải thực hiện một chút thiết lập. Mở emulator của bạn, nhấp vào nút cuối cùng trên thanh điều hướng ở bên phải để mở hộp thoại mở rộng, và sau đó chọn nút điều khiển điện thoại.

3. Giám sát các sự kiện cuộc gọi trong Background
Tạo một BroadcastReceiver
Giống như trong phần trước, chúng ta cần lắng nghe sự kiện để theo dõi những thay đổi trạng thái của điện thoại. Sự khác biệt chính là lần này chúng ta sẽ thừa kế lớp cơ bản BroadcastReceiver để chúng ta có thể lắng nghe trạng thái cuộc gọi ngay cả khi ứng dụng không chạy. Hãy chắc chắn không đăng ký listener nhiều hơn một lần! Chúng ta kiểm tra điều này ở trên dòng 36.
1 |
import android.content.BroadcastReceiver; |
2 |
import android.content.Context; |
3 |
import android.content.Intent; |
4 |
import android.telephony.PhoneStateListener; |
5 |
import android.telephony.TelephonyManager; |
6 |
import android.widget.Toast; |
7 |
|
8 |
public class PhoneCallStateReceiver extends BroadcastReceiver { |
9 |
private TelephonyManager mTelephonyManager; |
10 |
public static boolean isListening = false; |
11 |
|
12 |
@Override
|
13 |
public void onReceive(final Context context, Intent intent) { |
14 |
|
15 |
mTelephonyManager = (TelephonyManager) context.getSystemService(context.TELEPHONY_SERVICE); |
16 |
|
17 |
PhoneStateListener mPhoneStateListener = new PhoneStateListener() { |
18 |
@Override
|
19 |
public void onCallStateChanged(int state, String incomingNumber) { |
20 |
super.onCallStateChanged(state, incomingNumber); |
21 |
|
22 |
switch (state) { |
23 |
case TelephonyManager.CALL_STATE_IDLE: |
24 |
Toast.makeText(context, "CALL_STATE_IDLE", Toast.LENGTH_SHORT).show(); |
25 |
break; |
26 |
case TelephonyManager.CALL_STATE_RINGING: |
27 |
Toast.makeText(context, "CALL_STATE_RINGING", Toast.LENGTH_SHORT).show(); |
28 |
break; |
29 |
case TelephonyManager.CALL_STATE_OFFHOOK: |
30 |
Toast.makeText(context, "CALL_STATE_OFFHOOK", Toast.LENGTH_SHORT).show(); |
31 |
break; |
32 |
}
|
33 |
}
|
34 |
};
|
35 |
|
36 |
if(!isListening) { |
37 |
mTelephonyManager.listen(mPhoneStateListener, PhoneStateListener.LISTEN_CALL_STATE); |
38 |
isListening = true; |
39 |
}
|
40 |
}
|
41 |
}
|
Sửa đổi AndroidManifest.xml
Một broadcast receiver chỉ hoạt động nếu nó đã được đăng ký. Chúng ta cần phải nói cho hệ thống Android về broadcast receiver của chúng ta bằng cách đăng ký nó trong tập tin AndroidManifest.xml bằng cách kết nối lớp PhoneCallStateReceiver của chúng ta đến <intent-filter> mô tả hệ thống broadcast mà chúng ta muốn nhận—trong trường hợp này là PHONE_STATE.
1 |
<receiver android:name=".PhoneCallStateReceiver"> |
2 |
<intent-filter>
|
3 |
<action android:name="android.intent.action.PHONE_STATE"/> |
4 |
</intent-filter>
|
5 |
</receiver>
|
Giám sát cuộc gọi đi
Đối với cuộc gọi đi, bạn cần phải bao gồm action intent NEW_OUTGOING_CALL <action android:name="android.intent.action.NEW_OUTGOING_CALL"></action> trong <intent-filter> của receiver trong AndroidManifest.xml.
Để có được số điện thoại gọi đi, bên trong phương thức onReceive(Context, Intent), chúng ta lấy số từ intent như là một extra. Để hạn chế bỏ lỡ cuộc gọi dự kiến, chúng ta có thể gọi setResultData() và truyền vào nó một đối số null. resultData được sử dụng như là con số thật sự để gọi.
1 |
@Override
|
2 |
public void onReceive(final Context context, Intent intent) { |
3 |
// for outgoing call
|
4 |
String outgoingPhoneNo = intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER).toString(); |
5 |
// prevent outgoing call
|
6 |
setResultData(null); |
7 |
}
|
Bạn có thể tìm hiểu thêm về broadcast and broadcast receiver trong hướng dẫn của chúng tôi ở đây trên Envato Tuts+:
4. Gởi các tin nhắn SMS
Bạn có hai lựa chọn chính cho việc gửi tin nhắn SMS: sử dụng ứng dụng SMS của thiết bị hoặc bỏ qua bằng cách gửi tin nhắn SMS trực tiếp từ ứng dụng của bạn. Chúng ta sẽ xem xét cả hai trường hợp, và bạn có thể quyết định cái nào là tốt hơn cho trường hợp sử dụng của bạn. Hãy bắt đầu gửi một tin nhắn SMS bằng cách sử dụng ứng dụng SMS của thiết bị.
Thiết lập Layout
Trước tiên, chúng ta cần phải thay đổi layout chính của chúng ta để có một trường EditText cho tin nhắn và một nút Send Message (gởi tin nhắn).
1 |
<!--/ ... /-->
|
2 |
<EditText
|
3 |
android:id="@+id/et_message" |
4 |
android:hint="Enter message" |
5 |
android:inputType="textCapSentences|textMultiLine" |
6 |
android:maxLength="2000" |
7 |
android:maxLines="12" |
8 |
android:layout_width="match_parent" |
9 |
android:layout_height="wrap_content"/> |
10 |
|
11 |
<Button
|
12 |
android:id="@+id/btn_send_message" |
13 |
android:layout_gravity="center_horizontal" |
14 |
android:text="Send Messange" |
15 |
android:layout_width="wrap_content" |
16 |
android:layout_height="wrap_content"/> |
17 |
<!--/ ... /-->
|
Chỉnh sửa MainActivity
Bên trong phương thức onCreate() trong lớp MainActivity, tạo ra một intent với ACTION_SENDTO như là đối số đầu tiên và một URI smsto:<phone number> như là đối số thứ hai. Tin nhắn văn bản sẽ là giá trị của extra sms_body:
1 |
// ...
|
2 |
Button sendMessageBtn = (Button) findViewById(R.id.btn_send_message); |
3 |
final EditText messagetEt = (EditText) findViewById(R.id.et_message); |
4 |
sendMessageBtn.setOnClickListener(new View.OnClickListener() { |
5 |
@Override
|
6 |
public void onClick(View view) { |
7 |
String message = messagetEt.getText().toString(); |
8 |
String phoneNo = mPhoneNoEt.getText().toString(); |
9 |
if(!TextUtils.isEmpty(message) && !TextUtils.isEmpty(phoneNo)) { |
10 |
Intent smsIntent = new Intent(Intent.ACTION_SENDTO, Uri.parse("smsto:" + phoneNo)); |
11 |
smsIntent.putExtra("sms_body", message); |
12 |
startActivity(smsIntent); |
13 |
}
|
14 |
}
|
15 |
});
|
16 |
// ...
|
Tại đây, ứng dụng SMS sẽ theo dõi trạng thái gửi tin nhắn.
Chạy ứng dụng
Khi tất cả các trường đã được nhập, nhấp vào nút Send SMS sẽ mở ứng dụng SMS của người dùng, hoặc sẽ cung cấp cho người dùng các tuỳ chọn để chọn một ứng dụng nếu chưa được chọn.

5. Gởi các tin nhắn SMS trực tiếp
Tiếp theo chúng ta hãy xem cách để gửi tin nhắn SMS trực tiếp từ ứng dụng của chúng ta thay vì sử dụng ứng dụng SMS.
Thêm quyền vào trong AndroidManifest.xml
Như thường lệ, chúng ta cần phải đăng ký quyền trong AndroidManifest.xml.
1 |
<uses-permission android:name="android.permission.SEND_SMS"/> |
Chỉnh sửa lớp MainActivity
Tiếp theo, đối với Android 6.0 (API Level 23) và cao hơn, chúng ta phải yêu cầu quyền SEND_SMS trong runtime.
Để tìm hiểu thêm về quyền trong Android runtime và chúng đã thay đổi như thế nào trong phiên bản 6.0, hãy kiểm tra hướng dẫn của chúng tôi ở đây trên Envato Tuts+:
Để gửi một tin nhắn SMS, chúng ta lấy một đối tượng SmsManager mặc định và sau đó gọi phương thức sendTextMessage() của nó, truyền vào số điện thoại như là đối số đầu tiên và tin nhắn như là đối số thứ hai:
1 |
// ...
|
2 |
final int SEND_SMS_PERMISSION_REQUEST_CODE = 111; |
3 |
private Button mSendMessageBtn; |
4 |
|
5 |
@Override
|
6 |
protected void onCreate(Bundle savedInstanceState) { |
7 |
// ...
|
8 |
mSendMessageBtn = (Button) findViewById(R.id.btn_send_message); |
9 |
final EditText messagetEt = (EditText) findViewById(R.id.et_message); |
10 |
|
11 |
mSendMessageBtn.setEnabled(false); |
12 |
if(checkPermission(Manifest.permission.SEND_SMS)) { |
13 |
mSendMessageBtn.setEnabled(true); |
14 |
}else { |
15 |
ActivityCompat.requestPermissions(this, new String[] {Manifest.permission.SEND_SMS}, |
16 |
SEND_SMS_PERMISSION_REQUEST_CODE); |
17 |
}
|
18 |
mSendMessageBtn.setOnClickListener(new View.OnClickListener() { |
19 |
@Override
|
20 |
public void onClick(View view) { |
21 |
String message = messagetEt.getText().toString(); |
22 |
String phoneNo = mPhoneNoEt.getText().toString(); |
23 |
if(!TextUtils.isEmpty(message) && !TextUtils.isEmpty(phoneNo)) { |
24 |
|
25 |
if(checkPermission(Manifest.permission.SEND_SMS)) { |
26 |
SmsManager smsManager = SmsManager.getDefault(); |
27 |
smsManager.sendTextMessage(phoneNo, null, message, null, null); |
28 |
}else { |
29 |
Toast.makeText(MainActivity.this, "Permission denied", Toast.LENGTH_SHORT).show(); |
30 |
}
|
31 |
}
|
32 |
}
|
33 |
});
|
34 |
}
|
35 |
|
36 |
private boolean checkPermission(String permission) { |
37 |
int checkPermission = ContextCompat.checkSelfPermission(this, permission); |
38 |
return (checkPermission == PackageManager.PERMISSION_GRANTED); |
39 |
}
|
40 |
|
41 |
@Override
|
42 |
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { |
43 |
switch (requestCode) { |
44 |
case SEND_SMS_PERMISSION_REQUEST_CODE: { |
45 |
if(grantResults.length > 0 && (grantResults[0] == PackageManager.PERMISSION_GRANTED)) { |
46 |
mSendMessageBtn.setEnabled(true); |
47 |
}
|
48 |
return; |
49 |
}
|
50 |
}
|
51 |
}
|
52 |
// ...
|
Để theo dõi trạng thái gởi tin nhắn, phương thức sendTextMessage() của SMSManager có hai tham số PendingIntent tuỳ chọn: sentIntent và deliveryIntent.
1 |
void sendTextMessage (String destinationAddress, |
2 |
String scAddress, |
3 |
String text, |
4 |
PendingIntent sentIntent, |
5 |
PendingIntent deliveryIntent) |
Nếu bạn muốn sử dụng sentIntent, theo dõi result code Activity.RESULT_OK khi thành công, hoặc một trong RESULT_ERROR_GENERIC_FAILURE, RESULT_ERROR_RADIO_OFF và RESULT_ERROR_NULL_PDU để xác định một lỗi.
6. Nhận một tin nhắn SMS
Để cho ứng dụng của bạn bắt đầu nhận tin nhắn SMS từ điện thoại của người dùng, tốt nhất là có một Broadcast Receiver được ký để nó có thể nhận được cảnh báo khi một SMS đến ngay cả khi ứng dụng của bạn không chạy ở Foreground.
Thêm quyền
Thêm quyền RECEIVE_SMS vào AndroidManifest.xml:
1 |
<uses-permission android:name="android.permission.RECEIVE_SMS"/> |
Tiếp theo, chúng ta cần phải kiểm tra xem ứng dụng có được phép nhận được tin nhắn SMS hay không tại runtime. Vì vậy, trong lớp MainActivity, kiểm tra quyền RECEIVE_SMS. Nếu nó không được tìm thấy, thì yêu cầu nó.
1 |
// ...
|
2 |
@Override
|
3 |
protected void onCreate(Bundle savedInstanceState) { |
4 |
// ...
|
5 |
if(!checkPermission(Manifest.permission.RECEIVE_SMS)) { |
6 |
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.RECEIVE_SMS}, 222); |
7 |
}
|
8 |
}
|
9 |
// ...
|
Tạo một Broadcast Receiver
Chúng ta đang lấy từng đối tượng của lớp SmsMessage bằng cách sử dụng phương thức createFromPdu(byte [] pdu), truyền vào nó một PDU (Protocal Data Unit). Chúng ta sau đó thêm nó vào mảng tin nhắn của chúng ta.
Để hỗ trợ API 23 và cao hơn, bạn nên bao gồm extra định dạng String (hoặc "3gpp" cho các tin nhắn GSM/UMTS/LTE trong định dạng 3GPP hoặc "3gpp2" cho các tin nhắn CDMA/LTE trong định dạng 3GPP2).
1 |
import android.content.BroadcastReceiver; |
2 |
import android.content.Context; |
3 |
import android.content.Intent; |
4 |
import android.os.Build; |
5 |
import android.os.Bundle; |
6 |
import android.telephony.SmsMessage; |
7 |
import android.widget.Toast; |
8 |
|
9 |
public class SMSReceiver extends BroadcastReceiver { |
10 |
|
11 |
@Override
|
12 |
public void onReceive(Context context, Intent intent) { |
13 |
Bundle bundle = intent.getExtras(); |
14 |
if(bundle != null) { |
15 |
Object[] pdus = (Object[]) bundle.get("pdus"); |
16 |
String format = bundle.getString("format"); |
17 |
|
18 |
final SmsMessage[] messages = new SmsMessage[pdus.length]; |
19 |
for(int i = 0; i < pdus.length; i++) { |
20 |
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { |
21 |
messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i], format); |
22 |
}else { |
23 |
messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i]); |
24 |
}
|
25 |
String senderPhoneNo = messages[i].getDisplayOriginatingAddress(); |
26 |
Toast.makeText(context, "Message " + messages[0].getMessageBody() + ", from " + senderPhoneNo, Toast.LENGTH_SHORT).show(); |
27 |
}
|
28 |
}
|
29 |
}
|
30 |
}
|
Bây giờ, chạy ứng dụng, đóng nó và gởi cho Emulator của bạn một tin nhắn SMS.
Tóm tắt
Trong hướng dẫn này, bạn đã được học về:
- thực hiện cuộc gọi từ ứng dụng của bạn
- theo dõi các sự kiện gọi điện
- gửi các tin nhắn SMS sử dụng ứng dụng SMS hoặc trực tiếp từ ứng dụng của riêng bạn
- nhận các tin nhắn SMS trong Background
Có rất nhiều thứ bạn có thể làm với các cuộc gọi và tin nhắn SMS trong Android. Truy cập vào tài liệu hướng dẫn Telephony API và SMSManager API của Android để tìm hiểu thêm.
Cùng lúc đó, hãy kiểm tra một số bài viết khác của chúng tôi về phát triển Android!









