Android 16, cihazlar arasında hassas mesafe ölçümü için birleşik ve standartlaştırılmış bir arayüz sağlayan Mesafe Ölçümü modülünü kullanıma sunar. Her bir mesafe ölçme teknolojisini ayrı ayrı ele almak zorunda kalmadan eş cihazların mesafesini ve konumunu ölçmek için bu API yüzeyini kullanabilirsiniz.
Aralık modülü aşağıdaki teknolojileri destekler:
- Ultra geniş bant
- Bluetooth kanalında ses çaldırma
- Kablosuz NAN RTT
- Bluetooth RSSI menzil ölçümü
Aralık belirleme özellikleri ve müsaitlik durumu
RangingManager
sınıfı, uygulamalara yerel cihaz tarafından desteklenen menzil belirleme teknolojileri ve her bir teknolojinin kullanılabilirliği ve özellikleri hakkında bilgi sağlar. Uygulamalar, desteklenen teknolojilerin kullanılabilirliği veya özellikleriyle ilgili değişikliklerle ilgili güncellemeler almak için Callback
'e kaydolabilir.
Cihaz rolleri
Bir menzil belirleme oturumuna katılan cihaz başlatıcı veya yanıtlayıcı olmalıdır. Başlatıcı cihaz, bir veya daha fazla yanıtlayıcı cihazla menzil bulma oturumunu başlatır. Yanıt veren cihaz, aynı anda yalnızca bir başlatıcıdan gelen menzil belirleme isteklerine yanıt verir. RangingPreference
sınıfını kullanarak belirli bir cihazın menzil belirleme oturumundaki rolünü belirtebilirsiniz.
Aralıklı oturum türleri
Cihazlar arasında bir menzil belirleme oturumu başlatırken genellikle oturum parametrelerini paylaşmak için bant dışı (OOB) veri aktarımı oluşturmak gerekir.
Aralık modülü, OOB pazarlıklarını sizin için halledebilir ancak özel OOB uygulamalarını da destekler.

Varsayılan OOB uygulaması
Bu oturum türünde (RANGING_SESSION_OOB
), menzil bulma modülü, menzil bulma oturumu başlatmak için OOB pazarlıklarını yönetir. Uygulama tarafından sağlanan menzil tercihlerine göre uygun parametreleri seçer ve her iki cihazın da desteklediğine göre uygun teknolojileri kullanır. Bu oturum türü standart bir OOB specification
kullanır.
Aralık belirleme modülü yalnızca eş cihazla etkileşim kurmak için kullanılacak OOB veri biçimini ve sırasını tanımlar. Eş cihaz keşfi veya bağlantı kurma işlemlerini gerçekleştirmez.
Özel OOB uygulaması
Bu oturum türünde (RANGING_SESSION_RAW
), uygulama, menzil modülünün OOB akışını atlar ve kendi OOB pazarlığını ve parametrelerini yönetir.
Bu nedenle, uygulamanın eş cihazın hangi teknolojileri desteklediğini belirlemesi, menzil parametreleri için pazarlık yapması ve menzil oturumunu başlatması gerekir.
Aralık tercihleri
Bir menzil belirleme oturumu için istenen parametreleri belirtmek üzere bir RangingPreference
nesnesi kullanın. Bu destek, şunları içerir:
- Cihaz rolü. Bu, cihazın başlatıcı mı yoksa yanıtlayıcı mı olacağını gösterir.
- Menzil belirleme yapılandırması.
RangingConfig
nesnesi, menzil belirleme oturumu türünü ve menzil belirleme oturumu başlatmak için gereken diğer parametreleri belirtir. - Oturum yapılandırması.
SessionConfig
nesnesi, ölçüm sınırı, sensör füzyonu, coğrafi çit yapılandırması gibi menzil belirleme oturumunda uygulanacak parametreleri belirtir.
Menzil izini
Mesafe Ölçümü modülü, mevcut ve gelecekteki tüm mesafe ölçümü teknolojilerine erişmek için yeni bir birleşik izin (android.permission.RANGING
) gerektirir. Bu izin NEARBY_DEVICES_PERMISSIONS
listesindedir.
<uses-permission android:name="android.permission.RANGING" />
Kısıtlamalar ve sınırlamalar
Aralık belirleme modülü, aşağıdakiler dahil olmak üzere çeşitli nedenlerle aralığı kısıtlayabilir:
- Üçüncü taraf uygulamalarının ultra geniş bant ile arka planda menzil ölçümü yapmasına yalnızca desteklenen cihazlarda izin verilir. Diğer teknolojilerle arka planda menzil tespitine izin verilmez.
- Cihaz başına maksimum eşzamanlı menzil bulma oturumu sayısına ulaşıldığında menzil bulma işlemine izin verilmez.
- Aralık belirleme, pil, performans veya bellek gibi sistem sağlığı sorunları nedeniyle kısıtlanabilir.
Aralık modülünde aşağıdaki bilinen sınırlamalar da vardır:
- Aralık belirleme modülü, ultra geniş bant için yalnızca eş cihazlara aralık belirleme verilerinin yayınlanmasını destekler. Diğer teknolojilerde ise menzil modülü yalnızca başlatıcı cihaza menzil verilerini iletir.
- Aralık modülü, yalnızca ham aralık modunda ve yalnızca ultra geniş bant için cihazların dinamik olarak eklenmesini destekler.
- Aralık belirleme modülü, varsayılan OOB uygulamaları için bire çok ultra geniş bant oturumunu desteklemez. Birden fazla cihaz kimliği gönderirseniz modül, ultra geniş bandı destekleyen her eş cihaz için bire bir oturum oluşturur.
Menzil belirleme oturumu gerçekleştirme
Ölçüm modülünü kullanarak bir ölçüm oturumu yapmak için aşağıdaki adımları uygulayın:
- Tüm cihazların Android 16 veya sonraki bir sürümde çalıştığından emin olun.
- Uygulama manifest dosyasında
android.permission.RANGING
iznini isteyin. - Mesafe ölçme teknolojilerinin kapasitelerini ve kullanılabilirliğini değerlendirin.
- Aralık belirleme işlemleri için eş cihaz bulun.
- Aralıklı oturum türleri bölümünde açıklanan oturum türlerinden birini kullanarak bant dışı bir değişim için bağlantı kurun.
- Aralık belirleme işlemini başlatın ve sürekli olarak aralık belirleme verileri alın.
- Ölçüm oturumunu sonlandırın.
Aşağıdaki kod örneğinde bu adımlar hem başlatıcı rolü hem de yanıtlayıcı rolü için gösterilmektedir.
Kotlin
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()
}
}
Java
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();
}
}
Örnek uygulama
Aralık modülünün nasıl kullanılacağına dair uçtan uca bir örnek için AOSP'deki örnek uygulamaya bakın. Bu örnek uygulama, menzil modülü tarafından desteklenen tüm menzil teknolojilerinin yanı sıra desteklenen her iki oturum türü için akışlar içerir.