Thực hiện chặn số điện thoại

Bở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 hoặc nhắn tin tới bất kỳ số nào vào bất kỳ lúc nào - 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 N, 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 phiền toái. Nhiều ứng dụng trong số đó không hoạt động như mong muốn hoặc cung cấp trải nghiệm kém 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 hành động chặn trong mỗi ứng dụng để việc chặn có hiệu lực cho cả việc gọi điện và nhắn tin.

Đặc trưng

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

Hơn nữa, tính năng chặn số cho phép hệ thống và các ứng dụng liên quan trên nền tảng phối hợp với nhau để giúp bảo vệ người dùng và đơn giản hóa trải nghiệm. Trình quay số mặc định, ứng dụng nhắn tin mặc định, ứng dụng có đặc quyền 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 bị 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 quay số hoặc nhắn tin nào, các số đó vẫn bị chặn. Cuối cùng, danh sách số bị chặn có thể được khôi phục trên bất kỳ thiết bị mới nào, bất kể nhà sản xuất.

  • Người dùng sẽ được đảm bảo có tính năng chặn hoạt động ngay lập tức và sẽ không bị mất danh sách chặn khi họ chuyển đổi ứng dụng hoặc mua điện thoại mới. Tất cả các ứng dụng có liên quan trên hệ thống có thể chia sẻ cùng một danh sách để cung cấp cho người dùng trải nghiệm hợp lý nhất.
  • Các nhà phát triển ứng dụng không cần phải phát triển cách riêng của họ để 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.
  • Các ứng dụng quay số / nhắn tin được người dùng chọn làm mặc định có thể đọc và ghi cho nhà cung cấp. Các ứng dụng khác có thể khởi 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()
  • 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 lập tức. Các OEM có thể yên tâm rằng khi người dùng chuyển từ thiết bị của OEM khác, họ sẽ có trải nghiệm tích hợp tốt hơn vì danh sách chặn cũng sẽ được chuyển.
  • Nếu nhà cung cấp dịch vụ có ứng dụng quay số hoặc nhắn tin riêng, họ có thể sử dụng lại tính năng 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 vẫn có thể ở 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ả các ứng dụng do nhà cung cấp đặc quyền đều có thể đọc danh sách chặn, vì vậy nếu nhà cung cấp dịch vụ 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ì tính năng này hiện có thể thực hiện được.

Dòng dữ liệu

luồng dữ liệu số khối

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 cuộc gọi ví dụ sử dụng tính năng chặn số mới:

Khởi chạy trình quản lý số 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);

Xóa 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);

Thực hiện

Đây là những nhiệm vụ cấp cao phải được hoàn thành để đưa tính năng chặn số vào sử dụng:

  • OEM 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à cung cấp dịch vụ có ứng dụng quay số hoặc 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 nhắn tin và quay số bên thứ ba sử dụng BlockedNumberProvider cho các tính năng chặn của họ

Khuyến nghị dành cho OEM

Nếu thiết bị trước đây chưa bao giờ được cung cấp bất kỳ tính năng hạn chế cuộc gọi/tin nhắn bổ sung nào, hãy sử dụng tính năng chặn số trong Dự án mã nguồn mở Android (AOSP) trên tất cả các thiết bị đó. Chúng tôi khuyên bạn nên hỗ trợ các điểm nhậ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 chuỗi tin nhắn.

Nếu thiết bị trước đó đã được cung cấp 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 này để tất cả các số điện thoại khớp chặt bị chặn sẽ đượ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 Khả năng tương thích của Android Tài liệu Định nghĩa (CDD).

Bất kỳ tính năng nâng cao nào khác đều có thể được triển khai thông qua nhà cung cấp tùy chỉnh và giao diện người dùng/điều khiển tùy chỉnh, miễn là đáp ứng các yêu cầu của CDD về việc chặn các số điện thoại khớp nghiêm ngặt. Chúng tôi khuyên 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

Dưới đâ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 được cung cấp bởi BlockedNumberContract
    • boolean isBlocked(Context context, String phoneNumber)
    • int unblock(Context context, String phoneNumber)
    • boolean canCurrentUserBlockNumbers(Context context)

Giao diện người dùng

Có thể sử dụng giao diện người dùng BlockedNumbersActivity.java được cung cấp trong AOSP. Người triển khai thiết bị cũng có thể triển khai phiên bản UI 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 ý, có thể cần ứng dụng PC của đối tác để sao lưu và khôi phục để triển khai khôi phục danh sách chặn bằng cách sử dụng BlockedNumberProvider . Xem hình ảnh bên dưới để biết giao diện số 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

Thẩm định

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ự định bằng cách chạy các thử nghiệm CTS sau:

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

BlockedNumberProvider có thể được điều khiển bằng 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