Triển khai tính năng chặn số điện thoại

Vì điện thoại là một kênh liên lạc mở – bất kỳ ai cũng có thể gọi điện hoặc nhắn tin đến bất kỳ số điện thoại nào bất cứ lúc nào – nên người dùng Android cần có khả năng dễ dàng chặn các cuộc gọi và tin nhắn không mong muốn.

Trước Android 7.0, người dùng Android phải dựa vào các ứng dụng đã tải xuống để hạn chế cuộc gọi và tin nhắn từ những số điện thoại gây phiền toái. Nhiều ứng dụng trong số đó không hoạt động như mong muốn hoặc mang lại trải nghiệm chưa lý tưởng vì không có API thích hợp để chặn cuộc gọi và tin nhắn.

Một số nhà sản xuất có thể cung cấp sẵn các giải pháp chặn của riêng họ, nhưng nếu người dùng chuyển đổi thiết bị, họ có thể mất hoàn toàn danh sách bị chặn do thiếu khả năng tương tác. Cuối cùng, ngay cả khi người dùng đang sử dụng các ứng dụng quay số và ứng dụng nhắn tin cung cấp chức năng như vậy, họ vẫn có thể phải thực hiện thao tác chặn trong từng ứng dụng để lệnh chặn có hiệu lực cho cả tính năng gọi và nhắn tin.

Tính năng

Bản phát hành Android 7.0 giới thiệu một trình cung cấp nội dung BlockedNumberProvider lưu trữ danh sách số điện thoại mà người dùng đã chỉ định không được liên hệ với họ qua phương thức giao tiếp qua điện thoại (lệnh gọi, SMS, MMS). Hệ thống sẽ tuân thủ các số trong danh sách chặn bằng cách hạn chế cuộc gọi và tin nhắn từ các số đó. Android 7.0 hiển thị danh sách số điện thoại bị chặn và cho phép người dùng thêm cũng như xoá số điện thoại.

Ngoài ra, tính năng chặn số điện thoại cho phép hệ thống và các ứng dụng có liên quan trên nền tảng này hoạt động cùng nhau để bảo vệ người dùng và đơn giản hoá trải nghiệm. Trình quay số mặc định, ứng dụng nhắn tin mặc định, ứng dụng đặc quyền của UICC và các ứng dụng có cùng chữ ký với hệ thống đều có thể trực tiếp đọc và ghi vào danh sách chặn. Vì các số bị chặn được lưu trữ trên hệ thống, nên bất kể người dùng sử dụng ứng dụng gọi điện hay nhắn tin nào, các số đó vẫn bị chặn. Cuối cùng, danh sách số điện thoại bị chặn có thể được khôi phục trên mọi thiết bị mới, bất kể nhà sản xuất.

  • Người dùng sẽ được đảm bảo có một tính năng chặn hoạt động ngay từ đầu và sẽ không mất danh sách chặn khi chuyển đổi ứng dụng hoặc mua điện thoại mới. Tất cả ứng dụng liên quan trên hệ thống đều có thể chia sẻ cùng một danh sách để mang đến cho người dùng trải nghiệm hợp lý nhất.
  • Nhà phát triển ứng dụng không cần phát triển cách riêng để quản lý danh sách chặn cũng như các cuộc gọi và tin nhắn đến. Họ chỉ cần sử dụng tính năng do nền tảng cung cấp.
  • Ứng dụng quay số / ứng dụng nhắn tin mà người dùng chọn làm ứng dụng mặc định có thể đọc và ghi vào nhà cung cấp. Các ứng dụng khác có thể chạy giao diện người dùng quản lý danh sách chặn bằng cách sử dụng createManageBlockedNumbersIntent()
  • Nhà sản xuất thiết bị gốc (OEM) có thể sử dụng tính năng do nền tảng cung cấp để cung cấp tính năng chặn ngay từ đầu. Các nhà sản xuất thiết bị gốc (OEM) có thể yên tâm rằng khi người dùng chuyển từ thiết bị của một OEM khác sang, họ sẽ có trải nghiệm làm quen tốt hơn vì danh sách chặn cũng sẽ được chuyển.
  • Nếu nhà mạng có ứng dụng quay số hoặc ứng dụng nhắn tin riêng, họ có thể sử dụng lại tính năng của nền tảng để cho phép người dùng duy trì danh sách chặn. Họ có thể yên tâm rằng danh sách chặn của người dùng có thể vẫn ở lại với người dùng, ngay cả khi họ mua thiết bị mới. Cuối cùng, tất cả ứng dụng đặc quyền của nhà mạng đều có thể đọc danh sách chặn. Vì vậy, nếu nhà mạng muốn cung cấp thêm một số tính năng chặn mạnh mẽ hơn cho người dùng dựa trên danh sách chặn, thì giờ đây, họ có thể thực hiện việc này bằng tính năng này.

Luồng dữ liệu

luồng dữ liệu về số điện thoại bị chặn

Hình 1. Chặn luồng dữ liệu số điện thoại

Ví dụ và nguồn

Dưới đây là các lệnh gọi mẫu sử dụng tính năng mới chặn số điện thoại:

Chạy trình quản lý số điện thoại bị chặn từ ứng dụng

Context.startActivity(telecomManager.createManageBlockedNumbersIntent(), null);

Truy vấn số bị chặn

Cursor c = getContentResolver().query(BlockedNumbers.CONTENT_URI,
         new String[]{BlockedNumbers.COLUMN_ID,
         BlockedNumbers.COLUMN_ORIGINAL_NUMBER,
         BlockedNumbers.COLUMN_E164_NUMBER}, null, null, null);

Đặt số bị chặn

ContentValues values = new ContentValues();
values.put(BlockedNumbers.COLUMN_ORIGINAL_NUMBER, "1234567890");
Uri uri = getContentResolver().insert(BlockedNumbers.CONTENT_URI, values);

Xoá số bị chặn

ContentValues values = new ContentValues();
values.put(BlockedNumbers.COLUMN_ORIGINAL_NUMBER, "1234567890");
Uri uri = getContentResolver().insert(BlockedNumbers.CONTENT_URI, values);
getContentResolver().delete(uri, null, null);

Triển khai

Sau đây là các nhiệm vụ cấp cao phải hoàn thành để sử dụng tính năng chặn số điện thoại:

  • Nhà sản xuất thiết bị gốc triển khai các tính năng hạn chế cuộc gọi/tin nhắn trên thiết bị của họ bằng cách sử dụng BlockedNumberProvider
  • Nếu nhà mạng có ứng dụng quay số hoặc ứng dụng nhắn tin, hãy triển khai các tính năng hạn chế cuộc gọi/tin nhắn bằng cách sử dụng BlockedNumberProvider
  • Các nhà cung cấp ứng dụng trình quay số và ứng dụng nhắn tin bên thứ ba sử dụng BlockedNumberProvider cho các tính năng chặn

Đề xuất dành cho nhà sản xuất thiết bị gốc (OEM)

Nếu trước đây thiết bị chưa bao giờ được vận chuyển kèm theo bất kỳ tính năng hạn chế cuộc gọi/tin nhắn nào khác, hãy sử dụng tính năng chặn số trong Dự án nguồn mở Android (AOSP) trên tất cả các thiết bị như vậy. Bạn nên hỗ trợ các điểm truy cập hợp lý để chặn, chẳng hạn như chặn một số ngay từ nhật ký cuộc gọi hoặc trong một chuỗi tin nhắn.

Nếu trước đây thiết bị đã được vận chuyển với các tính năng hạn chế cuộc gọi/tin nhắn, hãy điều chỉnh các tính năng đó để tất cả số điện thoại khớp nghiêm ngặt bị chặn được lưu trữ trong BlockedNumberProvider, và hành vi xung quanh nhà cung cấp đáp ứng các yêu cầu đối với tính năng này được nêu trong Tài liệu định nghĩa về khả năng tương thích của Android (CDD).

Bạn có thể triển khai bất kỳ tính năng nâng cao nào khác thông qua trình cung cấp tuỳ chỉnh và giao diện người dùng/các chế độ điều khiển tuỳ chỉnh, miễn là đáp ứng các yêu cầu của CDD liên quan đến việc chặn số điện thoại khớp nghiêm ngặt. Bạn nên gắn nhãn các tính năng khác đó là tính năng "nâng cao" để tránh nhầm lẫn với tính năng chặn số cơ bản.

API

Sau đây là các API đang được sử dụng:

  • TelecomManager API
    • Intent createManageBlockedNumbersIntent()
  • Carrier Config
    • KEY_DURATION_BLOCKING_DISABLED_AFTER_EMERGENCY_INT
  • Vui lòng tham khảo BlockedNumberContract
    • API do BlockedNumberContract cung cấp
    • boolean isBlocked(Context context, String phoneNumber)
    • int unblock(Context context, String phoneNumber)
    • boolean canCurrentUserBlockNumbers(Context context)

Giao diện người dùng

Bạn có thể sử dụng giao diện người dùng BlockedNumbersActivity.java được cung cấp trong AOSP. Nhà triển khai thiết bị cũng có thể triển khai phiên bản giao diện người dùng của riêng họ, miễn là phiên bản đó đáp ứng các yêu cầu liên quan của CDD.

Xin lưu ý rằng có thể bạn cần ứng dụng sao lưu và khôi phục của đối tác trên máy tính để triển khai khôi phục danh sách chặn bằng cách sử dụng BlockedNumberProvider. Hãy xem hình ảnh bên dưới để biết giao diện số điện thoại bị chặn được cung cấp trong AOSP.

giao diện người dùng chặn số

Hình 2. Giao diện người dùng Chặn số điện thoại

Xác nhận kết quả

Người triển khai có thể đảm bảo phiên bản tính năng của họ hoạt động như dự kiến bằng cách chạy các kiểm thử CTS sau:

android.provider.cts.BlockedNumberContractTest
com.android.cts.numberblocking.hostside.NumberBlockingTest
android.telecom.cts.ExtendedInCallServiceTest#testIncomingCallFromBlockedNumber_IsRejected
android.telephony.cts.SmsManagerTest#testSmsBlocking

Bạn có thể thao tác với BlockedNumberProvider bằng các lệnh adb sau khi chạy $ adb root. Ví dụ:

adb root
adb shell content query --uri content://com.android.blockednumber/blocked
adb shell content insert --uri / content://com.android.blockednumber/blocked --bind / original_number:s:'6501002000'
adb shell content delete --uri / content://com.android.blockednumber/blocked/1