Android SDK
Добавьте AR Clip VPS в нативное Android-приложение. SDK определяет положение пользователя на ваших VPS-картах на устройствах с ARCore. В комплекте — фрагменты Sceneform и помощники для жизненного цикла.
Что нужно
- Android SDK 24 (Android 7.0) или новее
- Устройство с поддержкой ARCore
- Проект на Kotlin (примеры написаны на Kotlin)
Получите его на arclip.design или напишите на support@arclip.design.
Установка
-
Убедитесь, что проект получает артефакты из Maven Central:
allprojects {
repositories {
mavenCentral()
// other repositories...
}
} -
Добавьте зависимость в модуль приложения:
dependencies {
implementation "com.arstudio:wasvps-sdk:1.0.0"
} -
Синхронизируйте Gradle.
Настройка манифеста
Объявите требование ARCore. Если minSdk вашего приложения ниже 24, добавьте ещё и
переопределение uses-sdk, иначе сборка не пройдёт. Самому SDK всё равно нужен Android 7.0
(API 24) или новее.
<!-- Only if your app's minSdk is below 24 -->
<uses-sdk tools:overrideLibrary="com.arstudio.wasvps_sdk, com.google.ar.sceneform.sceneform, com.google.ar.sceneform.ux" />
<!-- Restrict to ARCore hardware (default). Set required=false to broaden install base. -->
<uses-feature
android:name="android.hardware.camera.ar"
android:required="true" />
Чтобы приложение было доступно в Play Store на большем числе устройств, задайте
android:required="false" и добавьте tools:replace="android:required", чтобы ваше значение
заменило значение из SDK:
<uses-feature
android:name="android.hardware.camera.ar"
android:required="false"
tools:replace="android:required" />
Быстрый старт с WASVPSArFragment
Добавьте готовый фрагмент в разметку:
<!-- res/layout/activity_main.xml -->
<androidx.fragment.app.FragmentContainerView
android:id="@+id/vFragmentContainer"
android:name="com.arstudio.wasvps_sdk.ui.WASVPSArFragment"
android:layout_width="match_parent"
android:layout_height="match_parent" />
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
supportFragmentManager.beginTransaction()
.replace(R.id.vFragmentContainer, WASVPSArFragment())
.commit()
}
}
Когда у вас есть ID локаций, получите сервис и запустите локализацию:
val fragment = supportFragmentManager
.findFragmentById(R.id.vFragmentContainer) as WASVPSArFragment
val config = WASVPSConfig.getIndoorConfig(listOf("your-location-id"))
val service = fragment.vpsService
service.setVpsConfig(config)
service.setVpsCallback(object : VpsCallback {
override fun onSuccess() = Unit
override fun onFail() = Unit
override fun onStateChange(state: State) = Unit
override fun onError(error: Throwable) {
Log.e("VPS", "Localization error", error)
}
})
service.startVpsService()
Когда AR нужно поставить на паузу, например в onPause, вызовите service.stopVpsService().
Свой фрагмент
Если у вас свой ArFragment или ArSceneView, создайте WASVPSService и управляйте им сами:
class CustomArFragment : ArFragment() {
private val vpsService = WASVPSService.newInstance()
override fun onAttach(context: Context) {
super.onAttach(context)
WASVPSSdk.init(context.applicationContext)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
vpsService.bindArSceneView(arSceneView)
vpsService.setVpsConfig(WASVPSConfig.getOutdoorConfig(listOf("location-id")))
}
override fun onResume() {
super.onResume()
vpsService.resume()
vpsService.startVpsService()
}
override fun onPause() {
vpsService.pause()
vpsService.stopVpsService()
super.onPause()
}
override fun onDestroyView() {
vpsService.destroy()
super.onDestroyView()
}
}
Размещение контента
Добавляйте ноды как дочерние к vpsService.worldNode. Когда VPS сработает, все дочерние ноды
встанут по найденной глобальной позиции.
val anchorNode = Node().apply {
setParent(vpsService.worldNode)
localPosition = Vector3(0f, 0f, -1f)
}
Решение проблем
- Проверьте, что на тестовом устройстве установлены свежие Google Play Services for AR.
- Если локализация так и не срабатывает, проверьте API-ключ, который вы передаёте SDK (через защищённую конфигурацию), и убедитесь, что ваши ID локаций существуют.
- Полный пример, включая запрос разрешений во время работы и интерфейс, — в модуле
/sampleв репозитории.