ARCore के साथ शेयर किए गए कैमरे का ऐक्सेस

डेवलपर के लिए बनी इस गाइड में, आपके ऐप्लिकेशन में Android Camera2 एपीआई की मदद से, कैमरे को पूरी तरह से कंट्रोल करने की सुविधा चालू करने का तरीका बताया गया है. साथ ही, इसमें ARCore के साथ कैमरे का ऐक्सेस शेयर करने की सुविधा चालू करने का तरीका भी बताया गया है.

इस विषय में यह माना जाता है कि:

सैंपल ऐप्लिकेशन बनाना और उसे चलाना

Shared Camera Java सैंपल ऐप्लिकेशन बनाने और उसे चलाने पर, ARCore का एक सेशन बनता है. इसमें कैमरे का ऐक्सेस शेयर करने की सुविधा चालू होती है. यह ऐप्लिकेशन, एआर मोड में नहीं चलता. साथ ही, इसमें ARCore की सुविधा बंद होती है.

जब यह ऐप्लिकेशन, एआर मोड में नहीं चलता, तो कैमरे से दिखने वाली इमेज पर सेपिया इफ़ेक्ट दिखता है. एआर मोड पर स्विच करने पर, सेपिया इफ़ेक्ट बंद हो जाता है. ऐसा इसलिए होता है, क्योंकि ऐप्लिकेशन, बंद किए गए सेशन को फिर से शुरू करके, कैमरे को कंट्रोल करने की सुविधा ARCore को वापस दे देता है.

मोड बदलने के लिए, ऐप्लिकेशन में मौजूद एआर स्विच का इस्तेमाल किया जा सकता है. प्रीव्यू के दौरान, दोनों मोड में Camera2 से कैप्चर किए गए लगातार फ़्रेम की संख्या दिखती है.

Shared Camera Java सैंपल ऐप्लिकेशन बनाने और उसे चलाने के लिए:

  1. Android के लिए Google ARCore SDK डाउनलोड करें और इसे एक्सट्रैक्ट करें .

  2. samples/shared_camera_java प्रोजेक्ट खोलें.

  3. पक्का करें कि आपका Android डिवाइस, यूएसबी के ज़रिए डेवलपमेंट मशीन से कनेक्ट हो. ज़्यादा जानकारी के लिए, ARCore के साथ काम करने वाले डिवाइस देखें.

  4. Android Studio में, Run पर क्लिक करें.

  5. डिप्लॉयमेंट टारगेट के तौर पर अपना डिवाइस चुनें. इसके बाद, अपने डिवाइस पर सैंपल ऐप्लिकेशन लॉन्च करने के लिए, OK पर क्लिक करें.

  6. डिवाइस पर, पुष्टि करें कि आपको ऐप्लिकेशन को फ़ोटो लेने और वीडियो रिकॉर्ड करने की अनुमति देनी है.

  7. अगर आपसे ऐसा करने के लिए कहा जाता है, तो ARCore को अपडेट करें या उसका नया वर्शन इंस्टॉल करें.

  8. एआर मोड में नहीं चलने और एआर मोड के बीच स्विच करने के लिए, AR स्विच का इस्तेमाल करें.

किसी ऐप्लिकेशन में, ARCore के साथ कैमरे का ऐक्सेस शेयर करने की सुविधा चालू करने की खास जानकारी

अपने ऐप्लिकेशन में, ARCore के साथ कैमरे का ऐक्सेस शेयर करने की सुविधा चालू करने के लिए, यह तरीका अपनाएं. कोड के सभी स्निपेट, SharedCameraActivity.java में मौजूद shared_camera_java सैंपल में उपलब्ध हैं.

CAMERA की अनुमति का अनुरोध करना

डिवाइस के कैमरे का इस्तेमाल करने के लिए, उपयोगकर्ता को आपके ऐप्लिकेशन को अनुमति देनी होगी.CAMERA ARCore के सैंपल में CameraPermissionHelper, शामिल है. इससे आपके ऐप्लिकेशन के लिए सही अनुमति का अनुरोध करने में मदद मिलती है.

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 इंस्टॉल हो और अप-टू-डेट हो

ARCore का इस्तेमाल करने से पहले, यह पक्का करें कि यह इंस्टॉल हो और अप-टू-डेट हो. यहां दिया गया स्निपेट दिखाता है कि अगर डिवाइस पर ARCore पहले से इंस्टॉल नहीं है, तो उसे इंस्टॉल करने का अनुरोध कैसे किया जाए.

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
    }
  }
}

ARCore का ऐसा सेशन बनाना जिसमें कैमरे का ऐक्सेस शेयर करने की सुविधा चालू हो

इसके लिए, सेशन बनाना होगा. साथ ही, ARCore के शेयर किए गए कैमरे का रेफ़रंस और आईडी सेव करना होगा:

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

(ज़रूरी नहीं) ARCore को, पसंद के मुताबिक बनाए गए किसी भी सर्फ़ेस के बारे में बताना

पसंद के मुताबिक बनाए गए ज़्यादा सर्फ़ेस का अनुरोध करने से, डिवाइस पर परफ़ॉर्मेंस की मांग बढ़ जाती है. यह पक्का करने के लिए कि आपका ऐप्लिकेशन अच्छी परफ़ॉर्मेंस दे, उन डिवाइसों पर इसकी जांच करें जिनका इस्तेमाल आपके उपयोगकर्ता करेंगे.

ARCore, डिफ़ॉल्ट रूप से दो स्ट्रीम का अनुरोध करेगा:

  1. 1x YUV सीपीयू स्ट्रीम, जो फ़िलहाल हमेशा 640x480 होती है.
    ARCore, मोशन ट्रैकिंग के लिए इस स्ट्रीम का इस्तेमाल करता है.
  2. एक 1x जीपीयू स्ट्रीम, जो आम तौर पर 1920x1080
    मौजूदा जीपीयू स्ट्रीम का रिज़ॉल्यूशन जानने के लिए, Session#getCameraConfig() का इस्तेमाल करें.

ARCore के साथ काम करने वाले डिवाइसों पर, जीपीयू स्ट्रीम का रिज़ॉल्यूशन बदला जा सकता है. इसके लिए, getSupportedCameraConfigs() और setCameraConfig() का इस्तेमाल करें.

एक सामान्य इंडिकेटर के तौर पर, आपको यह जानकारी मिल सकती है:

डिवाइस का टाइप एक साथ कितनी स्ट्रीम इस्तेमाल की जा सकती हैं
बेहतर फ़ोन
  • 2x YUV सीपीयू स्ट्रीम, जैसे कि 640x480 और 1920x1080
  • 1x जीपीयू स्ट्रीम, जैसे कि 1920x1080
  • 1x कभी-कभी हाई रिज़ॉल्यूशन वाली इमेज (JPEG), जैसे कि 12MP
मिड-टियर फ़ोन
  • 2x YUV सीपीयू स्ट्रीम, जैसे कि 640x480 और 1920x1080
  • 1x जीपीयू स्ट्रीम, जैसे कि 1920x1080
–या–
  • 1x YUV सीपीयू स्ट्रीम, जैसे कि 640x480 –या– 1920x1080
  • 1x जीपीयू स्ट्रीम, जैसे कि 1920x1080
  • 1x कभी-कभी हाई रिज़ॉल्यूशन वाली इमेज (JPEG), जैसे कि 12MP

पसंद के मुताबिक बनाए गए सर्फ़ेस का इस्तेमाल करने के लिए, जैसे कि सीपीयू इमेज रीडर सर्फ़ेस, पक्का करें कि आपने इसे उन सर्फ़ेस की सूची में जोड़ा हो जिन्हें अपडेट करना है (उदाहरण के लिए, एक ImageReader).

Java

sharedCamera.">setAppSurfaces(this.cameraId, Arrays.asList(imageReader.getSurface()));

Kotlin

sharedCamera.">setAppSurfaces(this.cameraId, listOf(imageReader.surface))

कैमरा चालू करना

ARCore-रैप्ड कॉलबैक का इस्तेमाल करके, कैमरा चालू करें:

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)

कैमरा डिवाइस के स्टेट कॉलबैक का इस्तेमाल करना

कैमरा डिवाइस के स्टेट कॉलबैक में, कैमरा डिवाइस का रेफ़रंस सेव करें और नया कैप्चर सेशन शुरू करें.

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()
}

नया कैप्चर सेशन बनाना

नया कैप्चर अनुरोध बनाएं. TEMPLATE_RECORD का इस्तेमाल करें, ताकि यह पक्का किया जा सके कि कैप्चर अनुरोध, ARCore के साथ काम करता हो. साथ ही, रनटाइम के दौरान, एआर मोड में नहीं चलने और एआर मोड के बीच आसानी से स्विच किया जा सके.

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)
  }
}

एआर मोड में नहीं चलने या एआर मोड में शुरू करना

फ़्रेम कैप्चर करना शुरू करने के लिए, captureSession.setRepeatingRequest() कैमरा कैप्चर सेशन onConfigured() स्टेट कॉलबैक से कॉल करें. एआर मोड में शुरू करने के लिए, onActive() कॉलबैक में ARCore सेशन को फिर से शुरू करें.

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)
}

रनटाइम के दौरान, एआर मोड में नहीं चलने या एआर मोड के बीच आसानी से स्विच करना

एआर मोड में नहीं चलने से एआर मोड पर स्विच करने और बंद किए गए ARCore सेशन को फिर से शुरू करने के लिए:

Java

// Resume the ARCore session.
resumeARCore();

Kotlin

// Resume the ARCore session.
resumeARCore()

एआर मोड से एआर मोड में नहीं चलने पर स्विच करने के लिए:

Java

// Pause ARCore.
sharedSession.pause();

// Create the Camera2 repeating capture request.
setRepeatingCaptureRequest();

Kotlin

// Pause ARCore.
sharedSession.pause()

// Create the Camera2 repeating capture request.
setRepeatingCaptureRequest()