Bu geliştirici kılavuzu, uygulamanızda geçiş yapma özelliğini etkinleştirme adımlarında size yol gösterir tek bir kontrol düğmesiyle sorunsuz şekilde kamera Android Camera2 API'si ve kamera erişimini ARCore ile paylaşma.
Bu konudaki tahminlere göre:
ARCore Hızlı Başlangıç'ını tamamlamış olmanız gerekir
Proje yönetimi hakkında Android Camera2 API'si (Android'e özel Camera2 örneğini inceleyin bakın)
Örnek uygulamayı derleyip çalıştırma
Shared Camera Java örnek uygulamasını derleyip çalıştırdığınızda Paylaşılan kamera erişimini destekleyen ARCore oturumu. Uygulama, artırılmış gerçeklik (AR) olmayan modda başlıyor ARCore duraklatılmış halde.
Uygulama artırılmış gerçeklik (AR) olmayan modda çalışırken kamera gözlüğü sepya rengi görüntüler etkisi. AR moduna geçilirken uygulama olarak sepya efekti kapanır duraklatılan oturumu devam ettirerek kamera kontrolünü ARCore'a geri gönderir.
Modları değiştirmek için uygulamadaki AR anahtarını kullanabilirsiniz. Önizleme sırasında her iki mod da Kamera2 tarafından çekilen kesintisiz karelerin sayısını görüntüler.
Paylaşılan Kamera Java örnek uygulamasını geliştirmek ve çalıştırmak için:
Şunu indirin ve çıkarın: Android için Google ARCore SDK'sı.
Şunu açın:
samples/shared_camera_java
projesi.Android cihazınızın geliştirme makinesine bağlı olduğundan emin olun USB ile. ARCore Desteklenen cihazlar sayfasına bakın inceleyebilirsiniz.
Android Studio'da Run
simgesini tıklayın.
Dağıtım hedefi olarak cihazınızı seçin veOK örnek bir uygulama açın.
Cihazda, uygulamanın resim çekmesine ve fotoğraf çekmesine izin vermek kullanabilirsiniz.
İstenirse ARCore'u güncelleyin veya yükleyin.
Artırılmış gerçeklik (AR) olmayan ve artırılmış gerçeklik (AR) modları arasında geçiş yapmak için AR anahtarını kullanın.
Uygulamaların ARCore ile kamera erişimini paylaşmasını etkinleştirmeye genel bakış
Uygulamanızda ARCore ile paylaşılan kamera erişimini uygulamak için aşağıdaki adımları uygulayın.
Tüm kod snippet'leri
SharedCameraActivity.java
shared_camera_java
içinde
örneklem.
CAMERA
izni iste
Kullanıcı, cihazın kamerasını kullanmak için
uygulamanıza CAMERA
iznini vermelidir.
ARCore örnekleri CameraPermissionHelper
,
Bu ayar, uygulamanız için doğru izni istemenizi sağlayan yardımcı programlar sağlar.
Java
protected void onResume() {
// Request the camera permission, if necessary.
if (!CameraPermissionHelper.hasCameraPermission(this)) {
CameraPermissionHelper.requestCameraPermission(this);
}
}
Kotlin
override fun onResume() {
// Request the camera permission, if necessary.
if (!CameraPermissionHelper.hasCameraPermission(this)) {
CameraPermissionHelper.requestCameraPermission(this)
}
}
ARCore'un yüklü ve güncel olduğundan emin olun
ARCore'un kullanılabilmesi için yüklü ve güncel olması gerekir. Aşağıdaki snippet, cihaza önceden yüklenmemişse ARCore uygulamasının nasıl yükleneceğini gösterir.
Java
boolean isARCoreSupportedAndUpToDate() {
// Make sure that ARCore is installed and supported on this device.
ArCoreApk.Availability availability = ArCoreApk.getInstance().checkAvailability(this);
switch (availability) {
case SUPPORTED_INSTALLED:
return true;
case SUPPORTED_APK_TOO_OLD:
case SUPPORTED_NOT_INSTALLED:
// Requests an ARCore installation or updates ARCore if needed.
ArCoreApk.InstallStatus installStatus = ArCoreApk.getInstance().requestInstall(this, userRequestedInstall);
switch (installStatus) {
case INSTALL_REQUESTED:
return false;
case INSTALLED:
return true;
}
return false;
default:
// Handle the error. For example, show the user a snackbar that tells them
// ARCore is not supported on their device.
return false;
}
}
Kotlin
// Determine ARCore installation status.
// Requests an ARCore installation or updates ARCore if needed.
fun isARCoreSupportedAndUpToDate(): Boolean {
when (ArCoreApk.getInstance().checkAvailability(this)) {
Availability.SUPPORTED_INSTALLED -> return true
Availability.SUPPORTED_APK_TOO_OLD,
Availability.SUPPORTED_NOT_INSTALLED -> {
when(ArCoreApk.getInstance().requestInstall(this, userRequestedInstall)) {
InstallStatus.INSTALLED -> return true
else -> return false
}
}
else -> {
// Handle the error. For example, show the user a snackbar that tells them
// ARCore is not supported on their device.
return false
}
}
}
Kamera paylaşımını destekleyen bir ARCore oturumu oluşturun
Bu işlem, oturum oluşturmayı ve ARCore referansını ve kimliğini depolamayı içerir. paylaşılan kamera:
Java
// Create an ARCore session that supports camera sharing.
sharedSession = new Session(this, EnumSet.of(Session.Feature.SHARED_CAMERA))
// Store the ARCore shared camera reference.
sharedCamera = sharedSession.getSharedCamera();
// Store the ID of the camera that ARCore uses.
cameraId = sharedSession.getCameraConfig().getCameraId();
Kotlin
// Create an ARCore session that supports camera sharing.
sharedSession = Session(this, EnumSet.of(Session.Feature.SHARED_CAMERA))
// Store the ARCore shared camera reference.
sharedCamera = sharedSession.sharedCamera
// Store the ID of the camera that ARCore uses.
cameraId = sharedSession.cameraConfig.cameraId
(İsteğe bağlı) ARCore'u özel yüzeyler hakkında bilgilendirin
Ek özel yüzeylerin istenmesi, olanak tanır. İyi performans gösterdiğinden emin olmak için, kullanacak.
ARCore, varsayılan olarak iki akış isteğinde bulunur:
- 1x YUV CPU akışı, şu anda her zaman
640x480
.
. ARCore, hareket izleme için bu akışı kullanır. - 1x GPU akışı (genellikle
1920x1080
)Session#getCameraConfig()
kullan mevcut GPU akış çözünürlüğünü belirleyin.
Desteklenen cihazlarda GPU akışının çözünürlüğünü değiştirmek için
getSupportedCameraConfigs()
ve
setCameraConfig()
.
Genel bir gösterge olarak, aşağıdakileri bekleyebilirsiniz:
Cihazın türü | Eş zamanlı yayınlar desteklenir |
---|---|
İleri teknoloji telefonlar |
|
Orta seviye telefonlar |
|
CPU resim okuyucu yüzeyi gibi özel yüzeyleri kullanmak için ilgili yüzeyleri
listelenen Google Haritalar
(örneğin bir ImageReader
).
Java
sharedCamera.setAppSurfaces(this.cameraId, Arrays.asList(imageReader.getSurface()));
Kotlin
sharedCamera.setAppSurfaces(this.cameraId, listOf(imageReader.surface))
Kamerayı aç
ARCore ile sarmalanmış geri çağırma kullanarak kamerayı açın:
Java
// Wrap the callback in a shared camera callback.
CameraDevice.StateCallback wrappedCallback =
sharedCamera.createARDeviceStateCallback(cameraDeviceCallback, backgroundHandler);
// Store a reference to the camera system service.
cameraManager = (CameraManager) this.getSystemService(Context.CAMERA_SERVICE);
// Open the camera device using the ARCore wrapped callback.
cameraManager.openCamera(cameraId, wrappedCallback, backgroundHandler);
Kotlin
// Wrap the callback in a shared camera callback.
val wrappedCallback = sharedCamera.createARDeviceStateCallback(cameraDeviceCallback, backgroundHandler)
// Store a reference to the camera system service.
val cameraManager = this.getSystemService(Context.CAMERA_SERVICE) as CameraManager
// Open the camera device using the ARCore wrapped callback.
cameraManager.openCamera(cameraId, wrappedCallback, backgroundHandler)
Kamera cihaz durumu geri çağırmasını kullan
Kamera cihaz durumu geri çağırma deposunda, kamera cihazına yapılan bir referans ve yeni bir yakalama oturumu başlatın.
Java
public void onOpened(@NonNull CameraDevice cameraDevice) {
Log.d(TAG, "Camera device ID " + cameraDevice.getId() + " opened.");
SharedCameraActivity.this.cameraDevice = cameraDevice;
createCameraPreviewSession();
}
Kotlin
fun onOpened(cameraDevice: CameraDevice) {
Log.d(TAG, "Camera device ID " + cameraDevice.id + " opened.")
this.cameraDevice = cameraDevice
createCameraPreviewSession()
}
Yeni yakalama oturumu oluştur
Yeni bir yakalama isteği oluşturun. TEMPLATE_RECORD
kullanın
yakalama isteğinin ARCore ile uyumlu olduğundan emin olmak ve
çalışma zamanında artırılmış gerçeklik (AR) olmayan ve artırılmış gerçeklik (AR) modu arasında geçiş yapma.
Java
void createCameraPreviewSession() {
try {
// Create an ARCore-compatible capture request using `TEMPLATE_RECORD`.
previewCaptureRequestBuilder =
cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_RECORD);
// Build a list of surfaces, starting with ARCore provided surfaces.
List<Surface> surfaceList = sharedCamera.getArCoreSurfaces();
// (Optional) Add a CPU image reader surface.
surfaceList.add(cpuImageReader.getSurface());
// The list should now contain three surfaces:
// 0. sharedCamera.getSurfaceTexture()
// 1. …
// 2. cpuImageReader.getSurface()
// Add ARCore surfaces and CPU image surface targets.
for (Surface surface : surfaceList) {
previewCaptureRequestBuilder.addTarget(surface);
}
// Wrap our callback in a shared camera callback.
CameraCaptureSession.StateCallback wrappedCallback =
sharedCamera.createARSessionStateCallback(cameraSessionStateCallback, backgroundHandler);
// Create a camera capture session for camera preview using an ARCore wrapped callback.
cameraDevice.createCaptureSession(surfaceList, wrappedCallback, backgroundHandler);
} catch (CameraAccessException e) {
Log.e(TAG, "CameraAccessException", e);
}
}
Kotlin
fun createCameraPreviewSession() {
try {
// Create an ARCore-compatible capture request using `TEMPLATE_RECORD`.
previewCaptureRequestBuilder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_RECORD)
// Build a list of surfaces, starting with ARCore provided surfaces.
val surfaceList: MutableList<Surface> = sharedCamera.arCoreSurfaces
// (Optional) Add a CPU image reader surface.
surfaceList.add(cpuImageReader.getSurface())
// The list should now contain three surfaces:
// 0. sharedCamera.getSurfaceTexture()
// 1. …
// 2. cpuImageReader.getSurface()
// Add ARCore surfaces and CPU image surface targets.
for (surface in surfaceList) {
previewCaptureRequestBuilder.addTarget(surface)
}
// Wrap the callback in a shared camera callback.
val wrappedCallback = sharedCamera.createARSessionStateCallback(cameraSessionStateCallback, backgroundHandler)
// Create a camera capture session for camera preview using an ARCore wrapped callback.
cameraDevice.createCaptureSession(surfaceList, wrappedCallback, backgroundHandler)
} catch (e: CameraAccessException) {
Log.e(TAG, "CameraAccessException", e)
}
}
Artırılmış gerçeklik (AR) veya artırılmış gerçeklik (AR) olmayan modda başlat
Çerçeveleri yakalamaya başlamak için captureSession.setRepeatingRequest()
komutunu çağırın
kamera kaydı oturumu onConfigured()
durum geri çağırması.
AR modunda başlamak için onActive()
geri çağırması kapsamında ARCore oturumunu devam ettirin.
Java
// Repeating camera capture session state callback.
CameraCaptureSession.StateCallback cameraSessionStateCallback =
new CameraCaptureSession.StateCallback() {
// Called when ARCore first configures the camera capture session after
// initializing the app, and again each time the activity resumes.
@Override
public void onConfigured(@NonNull CameraCaptureSession session) {
captureSession = session;
setRepeatingCaptureRequest();
}
@Override
public void onActive(@NonNull CameraCaptureSession session) {
if (arMode && !arcoreActive) {
resumeARCore();
}
}
};
// A repeating camera capture session capture callback.
CameraCaptureSession.CaptureCallback cameraCaptureCallback =
new CameraCaptureSession.CaptureCallback() {
@Override
public void onCaptureCompleted(…) {
shouldUpdateSurfaceTexture.set(true);
}
};
void setRepeatingCaptureRequest() {
captureSession.setRepeatingRequest(
previewCaptureRequestBuilder.build(), cameraCaptureCallback, backgroundHandler);
}
void resumeARCore() {
// Resume ARCore.
sharedSession.resume();
arcoreActive = true;
// Set the capture session callback while in AR mode.
sharedCamera.setCaptureCallback(cameraCaptureCallback, backgroundHandler);
}
Kotlin
val cameraSessionStateCallback = object : CameraCaptureSession.StateCallback() {
// Called when ARCore first configures the camera capture session after
// initializing the app, and again each time the activity resumes.
override fun onConfigured(session: CameraCaptureSession) {
captureSession = session
setRepeatingCaptureRequest()
}
override fun onActive(session: CameraCaptureSession) {
if (arMode && !arcoreActive) {
resumeARCore()
}
}
}
val cameraCaptureCallback = object : CameraCaptureSession.CaptureCallback() {
override fun onCaptureCompleted(
session: CameraCaptureSession,
request: CaptureRequest,
result: TotalCaptureResult
) {
shouldUpdateSurfaceTexture.set(true);
}
}
fun setRepeatingCaptureRequest() {
captureSession.setRepeatingRequest(
previewCaptureRequestBuilder.build(), cameraCaptureCallback, backgroundHandler
)
}
fun resumeARCore() {
// Resume ARCore.
sharedSession.resume()
arcoreActive = true
// Set the capture session callback while in AR mode.
sharedCamera.setCaptureCallback(cameraCaptureCallback, backgroundHandler)
}
Çalışma zamanında artırılmış gerçeklik (AR) olmayan veya AR (AR) modları arasında sorunsuz bir şekilde geçiş yapın
Artırılmış gerçeklik (AR) olmayan moddan AR moduna geçmek ve duraklatılmış bir ARCore oturumunu devam ettirmek için:
Java
// Resume the ARCore session.
resumeARCore();
Kotlin
// Resume the ARCore session.
resumeARCore()
AR modundan AR olmayan moda geçmek için:
Java
// Pause ARCore.
sharedSession.pause();
// Create the Camera2 repeating capture request.
setRepeatingCaptureRequest();
Kotlin
// Pause ARCore.
sharedSession.pause()
// Create the Camera2 repeating capture request.
setRepeatingCaptureRequest()