| <html devsite> |
| <head> |
| <title>Implementing Block Phone Numbers</title> |
| <meta name="project_path" value="/_project.yaml" /> |
| <meta name="book_path" value="/_book.yaml" /> |
| </head> |
| <body> |
| <!-- |
| Copyright 2017 The Android Open Source Project |
| |
| Licensed under the Apache License, Version 2.0 (the "License"); |
| you may not use this file except in compliance with the License. |
| You may obtain a copy of the License at |
| |
| http://www.apache.org/licenses/LICENSE-2.0 |
| |
| Unless required by applicable law or agreed to in writing, software |
| distributed under the License is distributed on an "AS IS" BASIS, |
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| See the License for the specific language governing permissions and |
| limitations under the License. |
| --> |
| |
| |
| |
| <p> |
| Because telephony is such an open communications channel - anyone may call or |
| text any number at any time - Android users need the ability to easily block |
| unwanted calls and texts. |
| </p> |
| |
| <p> |
| Before N, Android users had to rely on downloaded apps to restrict calls and |
| texts from bothersome phone numbers. Many of those apps either do not work as |
| desired or provide a less-than ideal experience because there are no proper APIs |
| for blocking calls and messages. |
| </p> |
| |
| <p> |
| Some manufacturers might ship their own blocking solutions out-of-the-box, but |
| if users switch devices, they may lose the blocked list completely due to lack |
| of interoperability. Finally, even if users are employing dialing apps and |
| messaging clients that provide such functionality, they likely still have to |
| perform the block action in each app for the block to take effect for both |
| calling and texting. |
| </p> |
| |
| <h2 id="features">Features</h2> |
| |
| <p> |
| The Android 7.0 release introduces a <code>BlockedNumberProvider</code> content |
| provider that stores a list of phone numbers the user has specified should not |
| be able to contact them via telephony communications (calls, SMS, MMS). The |
| system will respect the numbers in the blocked list by restricting calls and |
| texts from those numbers. Android 7.0 displays the list of blocked numbers and |
| allows the user to add and remove numbers. |
| </p> |
| |
| <p> |
| Further, the number-blocking feature enables the system and the relevant apps on |
| the platform to work together to help protect the user and to simplify the |
| experience. The default dialer, default messaging client, UICC-privileged app, |
| and apps with the same signature as the system can all directly read from and |
| write to the blocked list. Because the blocked numbers are stored on the system, |
| no matter what dialing or messaging apps the user employs, the numbers stay |
| blocked. Finally, the blocked numbers list may be restored on any new device, |
| regardless of the manufacturer. |
| </p> |
| |
| <ul> |
| <li>User will be guaranteed to have a blocking feature that works out-of-the-box |
| and will not lose their block list when they switch apps or get a new phone. All |
| relevant apps on the system can share the same list to provide the user with the |
| most streamlined experience. |
| <li>App developers do not need to develop their own way to manage a block list |
| and the calls and messages that come in. They can simply use the |
| platform-provided feature. |
| <li>Dialer / messenger apps that are selected as the default by the user can |
| read and write to the provider. Other apps can launch the block list management |
| user interface by using <code>createManageBlockedNumbersIntent()</code> |
| <li>OEMs can use platform provided feature to ship a blocking feature |
| out-of-the-box. OEMs can rest assured that when users switch from another OEM’s |
| device that they have a better onboarding experience because the block list will |
| be transferred as well. |
| <li>If carrier has their own dialer or messenger app, they can reuse platform |
| feature for allowing the user to maintain a block list. They can rest assured |
| that the user’s block list can stay with the users, even when they get a new |
| device. Finally, all carrier-privileged apps can read the block list, so if the |
| carrier wants to provide some additional more powerful blocking for the user |
| based on the block list, that is now possible with this feature.</li></ul> |
| |
| <h2 id="data-flow">Data flow</h2> |
| |
| <img src="/devices/tech/connect/images/block-numbers-flow.png" alt="block numbers data flow" id="block-numbers-flow" /> |
| <p class="img-caption"> |
| <strong>Figure 1.</strong> Block phone numbers data flow |
| </p> |
| |
| <h2 id="examples-and-source">Examples and source</h2> |
| |
| <p> |
| Here are example calls using the number-blocking new feature: |
| </p> |
| |
| <h3 id="launch-from-app">Launch blocked number manager from app</h3> |
| |
| <pre class="prettyprint"> |
| Context.startActivity(telecomManager.createManageBlockedNumbersIntent(), null); |
| </pre> |
| |
| <h3 id="query-blocked-numbers">Query blocked numbers</h3> |
| |
| <pre class="prettyprint"> |
| Cursor c = getContentResolver().query(BlockedNumbers.CONTENT_URI, |
| new String[]{BlockedNumbers.COLUMN_ID, |
| BlockedNumbers.COLUMN_ORIGINAL_NUMBER, |
| BlockedNumbers.COLUMN_E164_NUMBER}, null, null, null); |
| </pre> |
| |
| <h3 id="put-blocked-number">Put blocked number</h3> |
| |
| <pre class="prettyprint"> |
| ContentValues values = new ContentValues(); |
| values.put(BlockedNumbers.COLUMN_ORIGINAL_NUMBER, "1234567890"); |
| Uri uri = getContentResolver().insert(BlockedNumbers.CONTENT_URI, values); |
| </pre> |
| |
| <h3 id="delete-blocked-number">Delete blocked number</h3> |
| |
| <pre class="prettyprint"> |
| ContentValues values = new ContentValues(); |
| values.put(BlockedNumbers.COLUMN_ORIGINAL_NUMBER, "1234567890"); |
| Uri uri = getContentResolver().insert(BlockedNumbers.CONTENT_URI, values); |
| getContentResolver().delete(uri, null, null); |
| </pre> |
| |
| <h2 id="implementation">Implementation</h2> |
| |
| <p> |
| These are the high-level tasks that must be completed to put the number-blocking |
| feature to use: |
| </p> |
| |
| <ul> |
| <li>OEMs implement call/message-restriction features on their devices by using |
| <code>BlockedNumberProvider</code> |
| <li>If carrier has dialer or messenger application, implement call/message |
| restriction features by using <code>BlockedNumberProvider</code> |
| <li>Third-party dialer and messenger app vendors use |
| <code>BlockedNumberProvider</code> for their blocking features</li> |
| </ul> |
| |
| <h3 id="recommendations-for-oems">Recommendations for OEMs</h3> |
| |
| <p> |
| If the device had previously never shipped with any additional call/message |
| restriction features, use the number-blocking feature in the Android Open Source |
| Project (AOSP) on all such devices. It is recommended that reasonable entry |
| points for blocking are supported, such as blocking a number right from the call |
| log or within a message thread. |
| </p> |
| |
| <p> |
| If the device had previously shipped with call/message restriction features, |
| adapt the features so all <em>strict-match phone numbers</em> that are blocked |
| are stored in the <code>BlockedNumberProvider,</code> and that the behavior |
| around the provider satisfy the requirements for this feature outlined in the |
| Android Compatibility Definition Document (CDD). |
| </p> |
| |
| <p> |
| Any other advanced feature can be implemented via custom providers and custom UI |
| / controls, as long as the CDD requirements are satisfied with regards to |
| blocking strict-match phone numbers. It is recommended that those other features |
| be labeled as “advanced” features to avoid confusion with the basic |
| number-blocking feature. |
| </p> |
| |
| <h3 id="apis">APIs</h3> |
| |
| <p> |
| Here are the APIs in use: |
| </p> |
| <ul> |
| <li><code><a |
| href="http://developer.android.com/reference/android/telecom/TelecomManager.html">TelecomManager</a> |
| API</code> |
| <ul> |
| <li><code>Intent createManageBlockedNumbersIntent()</code> |
| </ul> |
| </li> |
| <li><code><a |
| href="http://developer.android.com/reference/android/telephony/CarrierConfigManager.html">Carrier |
| Config</a></code> |
| <ul> |
| <li><code>KEY_DURATION_BLOCKING_DISABLED_AFTER_EMERGENCY_INT</code> |
| </ul> |
| </li> |
| <li>Please refer to <code>BlockedNumberContract</code> |
| <ul> |
| <li>APIs provided by <code><a |
| href="https://developer.android.com/reference/android/provider/BlockedNumberContract.html">BlockedNumberContract</a></code></li> |
| <li><code>boolean isBlocked(Context context, String phoneNumber)</code></li> |
| <li><code>int unblock(Context context, String phoneNumber)</code></li> |
| <li><code>boolean canCurrentUserBlockNumbers(Context context)</code></li> |
| </ul> |
| </li> |
| </ul> |
| |
| <h3 id="user-interface">User interface</h3> |
| <p> |
| The BlockedNumbersActivity.java user interface provided in AOSP can be used as |
| is. Device implementers may also implement their own version of the UI, as long as it |
| satisfies related CDD requirements. |
| </p> |
| |
| <p> |
| Please note, the partner’s PC application for backup and restore may be needed |
| to implement restoration of the block list by using |
| <code>BlockedNumberProvider</code>. See the images below for the blocked |
| numbers interface supplied in AOSP. |
| </p> |
| |
| <img src="images/block-numbers-ui.png" alt="block numbers user interface" width="665" id="block-numbers-ui" /> |
| <p class="img-caption"> |
| <strong>Figure 2.</strong> Block phone numbers user interface |
| </p> |
| |
| <h2 id="validation">Validation</h2> |
| |
| <p> |
| Implementers can ensure their version of the feature works as intended by |
| running the following CTS tests: |
| </p> |
| |
| <pre class="devsite-click-to-copy"> |
| android.provider.cts.BlockedNumberContractTest |
| com.android.cts.numberblocking.hostside.NumberBlockingTest |
| android.telecom.cts.ExtendedInCallServiceTest#testIncomingCallFromBlockedNumber_IsRejected |
| android.telephony.cts.SmsManagerTest#testSmsBlocking |
| </pre> |
| |
| <p> |
| The <code>BlockedNumberProvider</code> can be manipulated using <code>adb</code> commands |
| after running <code>$ adb root</code>. For example: |
| </p> |
| <pre class="devsite-click-to-copy"> |
| <code class="devsite-terminal">adb root</code> |
| <code class="devsite-terminal">adb shell content query --uri content://com.android.blockednumber/blocked</code> |
| <code class="devsite-terminal">adb shell content insert --uri / content://com.android.blockednumber/blocked --bind / original_number:s:'6501002000'</code> |
| <code class="devsite-terminal">adb shell content delete --uri / content://com.android.blockednumber/blocked/1</code> |
| </pre> |
| |
| </body> |
| </html> |