Unlimited Plugins, WordPress themes, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. Android SDK
Code

Cách thực hiện các cuộc gọi và sử dụng SMS trong các ứng dụng Android

by
Difficulty:IntermediateLength:LongLanguages:

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.

Android Studio create a new Activity screenshot

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:

Emulator dial screen with phone number given

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:

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.

Emulator screen defualt phone dialer with the phone number

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:

  1. idle (khi nó không được sử dụng)
  2. ringing (khi có cuộc gọi đến)
  3. 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:

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:

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().

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().

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_INDICATORLISTEN_CELL_INFO.

Cuối cùng, chạy ứng dụng và hãy tạo một cuộc gọi đến.

Emulator incoming call states

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.

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.

Using emulator to make call and send SMS

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.

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.

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.

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).

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:

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.

Send SMS flow

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.

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:

Để 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: sentIntentdeliveryIntent.

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_OFFRESULT_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:

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ó.

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).

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.

Emulator showing a toast when it receives an SMS in the background

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 APISMSManager 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!

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.