В Android 16 представлен модуль определения местоположения, который обеспечивает унифицированный и стандартизированный интерфейс для точного определения местоположения между устройствами. Вы можете использовать эту поверхность API для измерения расстояния и положения одноранговых устройств без необходимости индивидуальной обработки каждой технологии измерения дальности.
Модуль ранжирования поддерживает следующие технологии:
- Сверхширокополосный
- Озвучивание Bluetooth-канала
- Wi-Fi NAN РТТ
- Диапазон RSSI Bluetooth
Диапазон возможностей и доступности
Класс RangingManager
предоставляет приложениям информацию о технологиях ранжирования, поддерживаемых локальным устройством, а также о доступности и возможностях каждой технологии. Приложения могут зарегистрироваться для Callback
, чтобы получать обновления о любых изменениях в доступности или возможностях любых поддерживаемых технологий.
Роли устройства
Устройство, участвующее в сеансе ранжирования, должно быть либо инициатором , либо ответчиком . Устройство-инициатор начинает сеанс ранжирования с одним или несколькими устройствами-ответчиками. Устройство-ответчик одновременно отвечает на запросы ранжирования только от одного инициатора. Вы можете указать роль для данного устройства в сеансе ранжирования с помощью класса RangingPreference
.
Ранжирование типов сеансов
При запуске сеанса ранжирования между устройствами часто необходимо установить внеполосную передачу данных (OOB) для обмена параметрами сеанса.
Модуль ранжирования может обрабатывать переговоры OOB за вас, но он также поддерживает пользовательские реализации OOB.

Реализация OOB по умолчанию
В этом типе сеанса ( RANGING_SESSION_OOB
) модуль ранжирования обрабатывает OOB-согласования для запуска сеанса ранжирования. Он выбирает подходящие параметры на основе предпочтений диапазона, предоставляемых приложением, и использует соответствующие технологии в зависимости от того, что поддерживают оба устройства. Этот тип сеанса использует стандартизированную OOB specification
.
Модуль ранжирования определяет только формат и последовательность данных OOB, которые будут использоваться для взаимодействия с одноранговым устройством. Он не обрабатывает обнаружение одноранговых устройств или установление соединения.
Пользовательская реализация OOB
В этом типе сеанса ( RANGING_SESSION_RAW
) приложение обходит поток OOB модуля Ranging и обрабатывает свои собственные согласования и параметры OOB. Это означает, что приложение во многом определяет, какие технологии поддерживает одноранговое устройство, согласовывает параметры ранжирования и начинает сеанс ранжирования.
Ранжирование предпочтений
Используйте объект RangingPreference
, чтобы указать нужные параметры для сеанса ранжирования. Сюда входит следующее:
- Роль устройства. Это указывает, будет ли устройство инициатором или ответчиком.
- Конфигурация ранжирования. Объект
RangingConfig
определяет тип сеанса ранжирования и другие параметры, необходимые для запуска сеанса ранжирования. - Конфигурация сеанса. Объект
SessionConfig
определяет параметры, которые должны применяться в сеансе определения диапазона, такие как предел измерения, объединение датчиков, конфигурация геозоны и т. д.
Разрешение на дальность
Модулю определения дальности требуется новое единое разрешение ( android.permission.RANGING
) для доступа ко всем текущим и будущим технологиям определения дальности. Это разрешение находится в списке NEARBY_DEVICES_PERMISSIONS
.
<uses-permission android:name="android.permission.RANGING" />
Ограничения и ограничения
Модуль ранжирования может ограничивать диапазон по нескольким причинам, включая следующие:
- Сторонним приложениям разрешено работать в фоновом режиме только со сверхширокополосной связью и только на поддерживаемых устройствах . Работа в фоновом режиме с другими технологиями не допускается.
- Ранжирование не допускается, если достигнуто максимальное количество одновременных сеансов ранжирования на устройстве.
- Диапазон может быть ограничен из-за проблем со здоровьем системы, таких как батарея, производительность или память.
Модуль Ranging также имеет следующие известные ограничения:
- Модуль ранжирования поддерживает доставку данных ранжирования на одноранговые устройства только для сверхширокополосной связи. Для других технологий модуль определения дальности доставляет данные о дальности только на устройство-инициатор.
- Модуль ранжирования поддерживает динамическое добавление устройств только в режиме необработанного ранжирования и только для сверхширокополосной связи.
- Модуль Ranging не поддерживает сверхширокополосные сеансы «один ко многим» для реализаций OOB по умолчанию . Если вы передаете несколько дескрипторов устройств, модуль создает сеанс «один к одному» для каждого однорангового устройства, поддерживающего сверхширокополосную связь.
Провести сеанс ранжирования
Чтобы провести сеанс ранжирования с использованием модуля Ранжирование, выполните следующие действия:
- Убедитесь, что все устройства работают на Android 16 или более поздней версии.
- Запросите разрешение
android.permission.RANGING
в манифесте приложения. - Оцените возможности и доступность технологий дальности.
- Откройте для себя одноранговое устройство для определения диапазона операций.
- Установите соединение для внеполосного обмена, используя любой из типов сеанса, описанный в разделе Ранжирование типов сеансов .
- Инициировать определение дальности и постоянно получать данные о дальности.
- Завершить сеанс измерения дальности.
В следующем примере кода показаны эти шаги как для роли инициатора, так и для роли ответчика.
Котлин
class RangingApp {
// Starts a ranging session on the initiator side.
fun startRangingInitiator(
context: Context,
deviceHandle: DeviceHandle,
executor: Executor,
callback: RangingSessionCallback
) {
// Get the RangingManager which is the entry point for ranging module.
val manager = context.getSystemService(RangingManager::class.java)
// Create a new RangingSession using the provided executor and callback.
val session = manager.createRangingSession(executor, callback)
// Create an OobInitiatorRangingConfig, which specifies the ranging parameters for
// the initiator role.
val config = OobInitiatorRangingConfig.Builder()
.setFastestRangingInterval(Duration.ofMillis(100))
.setSlowestRangingInterval(Duration.ofMillis(5000))
.setRangingMode(RANGING_MODE_AUTO)
.setSecurityLevel(SECURITY_LEVEL_BASIC)
.addDeviceHandle(deviceHandle)
.build()
// Create a RangingPreference, which specifies the role (initiator) and
// configuration for the ranging session.
val preference =
RangingPreference.Builder(DEVICE_ROLE_INITIATOR, config).build()
// Start ranging session.
session.start(preference)
// If successful, the ranging data will be sent through callback#onResults
// Stop ranging session
session.stop()
}
// Starts a ranging session on the responder side.
fun startRangingResponder(
context: Context,
deviceHandle: DeviceHandle,
executor: Executor,
callback: RangingSessionCallback
) {
// Get the RangingManager which is the entry point for ranging module.
val manager = context.getSystemService(RangingManager::class.java)
// Create a new RangingSession using the provided executor and callback.
val session = manager.createRangingSession(executor, callback)
// Create an OobResponderRangingConfig, which specifies the ranging parameters for
// the responder role.
val config = OobResponderRangingConfig.Builder(deviceHandle).build()
// Create a RangingPreference, which specifies the role (responder) and
// configuration for the ranging session.
val preference =
RangingPreference.Builder(DEVICE_ROLE_RESPONDER, config).build()
// Start the ranging session.
session.start(preference)
// Stop the ranging session
session.stop()
}
}
Ява
public class RangingApp {
// Starts a ranging session on the initiator side.
void startRangingInitiator(Context context, DeviceHandle deviceHandle, Executor executor, RangingSessionCallback callback) {
// Get the RangingManager which is the entry point for ranging module.
RangingManager manager = context.getSystemService(RangingManager.class);
// Create a new RangingSession using the provided executor and callback.
RangingSession session = manager.createRangingSession(executor, callback);
// Create an OobInitiatorRangingConfig, which specifies the ranging parameters for
// the initiator role.
OobInitiatorRangingConfig config = new OobInitiatorRangingConfig.Builder()
.setFastestRangingInterval(Duration.ofMillis(100))
.setSlowestRangingInterval(Duration.ofMillis(5000))
.setRangingMode(RANGING_MODE_AUTO)
.setSecurityLevel(SECURITY_LEVEL_BASIC)
.addDeviceHandle(deviceHandle)
.build();
// Create a RangingPreference, which specifies the role (initiator) and
// configuration for the ranging session.
RangingPreference preference =
new RangingPreference.Builder(DEVICE_ROLE_INITIATOR, config).build();
// Start ranging session.
session.start(preference);
// If successful, the ranging data will be sent through callback#onResults
// Stop ranging session
session.stop();
}
// Starts a ranging session on the responder side.
void startRangingResponder(Context context, DeviceHandle deviceHandle, Executor executor, RangingSessionCallback callback) {
// Get the RangingManager which is the entry point for ranging module.
RangingManager manager = context.getSystemService(RangingManager.class);
// Create a new RangingSession using the provided executor and callback.
RangingSession session = manager.createRangingSession(executor, callback);
// Create an OobResponderRangingConfig, which specifies the ranging parameters for
// the responder role.
OobResponderRangingConfig config = new OobResponderRangingConfig.Builder( deviceHandle).build();
// Create a RangingPreference, which specifies the role (responder) and
// configuration for the ranging session.
RangingPreference preference =
new RangingPreference.Builder(DEVICE_ROLE_RESPONDER, config).build();
// Start the ranging session.
session.start(preference);
// Stop the ranging session
session.stop();
}
}
Пример приложения
Полный пример использования модуля ранжирования см. в примере приложения в AOSP. Этот пример приложения охватывает все технологии ранжирования, поддерживаемые модулем ранжирования, и включает потоки для обоих поддерживаемых типов сеансов.