diff --git a/libraries/include/arcore_c_api.h b/libraries/include/arcore_c_api.h index fdca18cad..11e62c2e1 100644 --- a/libraries/include/arcore_c_api.h +++ b/libraries/include/arcore_c_api.h @@ -779,9 +779,9 @@ AR_DEFINE_ENUM(ArCloudAnchorState){ /// error. The app should not attempt to recover from this error. AR_CLOUD_ANCHOR_STATE_ERROR_INTERNAL = -1, - /// The app cannot communicate with the ARCore Cloud because of an invalid - /// or unauthorized API key in the manifest, or because there was no API key - /// present in the manifest. + /// The app cannot communicate with the ARCore Cloud Anchor service because + /// of an invalid or unauthorized API key in the manifest, or because there + /// was no API key present in the manifest. AR_CLOUD_ANCHOR_STATE_ERROR_NOT_AUTHORIZED = -2, AR_CLOUD_ANCHOR_STATE_ERROR_SERVICE_UNAVAILABLE AR_DEPRECATED( @@ -790,7 +790,8 @@ AR_DEFINE_ENUM(ArCloudAnchorState){ /// The application has exhausted the request quota allotted to the given /// API key. The developer should request additional quota for the ARCore - /// Cloud for their API key from the Google Developers Console. + /// Cloud Anchor service for their API key from the Google Developers + /// Console. AR_CLOUD_ANCHOR_STATE_ERROR_RESOURCE_EXHAUSTED = -4, /// Hosting failed, because the server could not successfully process the @@ -798,8 +799,8 @@ AR_DEFINE_ENUM(ArCloudAnchorState){ /// device has gathered more data from the environment. AR_CLOUD_ANCHOR_STATE_ERROR_HOSTING_DATASET_PROCESSING_FAILED = -5, - /// Resolving failed, because the ARCore Cloud could not find the provided - /// cloud anchor ID. + /// Resolving failed, because the ARCore Cloud Anchor service could not find + /// the provided cloud anchor ID. AR_CLOUD_ANCHOR_STATE_ERROR_CLOUD_ID_NOT_FOUND = -6, AR_CLOUD_ANCHOR_STATE_ERROR_RESOLVING_LOCALIZATION_NO_MATCH AR_DEPRECATED( @@ -816,12 +817,12 @@ AR_DEFINE_ENUM(ArCloudAnchorState){ /// it. AR_CLOUD_ANCHOR_STATE_ERROR_RESOLVING_SDK_VERSION_TOO_NEW = -9, - /// The ARCore Cloud Anchor Service was unreachable. This can happen because - /// of a number of reasons. The device may is in airplane mode or does not - /// have a working internet connection. The request sent to the server could - /// have timed out with no response, there could be a bad network - /// connection, DNS unavailability, firewall issues, or anything that could - /// affect the device's ability to connect to the ARCore Cloud Anchor + /// The ARCore Cloud Anchor Service was unreachable. This can happen for + /// a number of reasons. The device might be in airplane mode or does not + /// have a working internet connection. The request sent to the server might + /// have timed out with no response, or there might be a bad network + /// connection, DNS unavailability, firewall issues, or anything else that + /// might affect the device's ability to connect to the ARCore Cloud Anchor /// service. AR_CLOUD_ANCHOR_STATE_ERROR_HOSTING_SERVICE_UNAVAILABLE = -10, }; @@ -1851,8 +1852,10 @@ void ArSession_getSupportedCameraConfigs(const ArSession *session, /// before calling resume(). Failure to do so will cause resume() to return /// AR_ERROR_ILLEGAL_STATE error. /// -/// Starting in ARCore 1.12, changing the active camera config will make -/// existing anchors and trackables fail to regain tracking. +/// Note: Starting in ARCore 1.12, changing the active camera config may cause +/// the tracking state on certain devices to become permanently PAUSED. For +/// consistent behavior across all supported devices, release any previously +/// created anchors and trackables when setting a new camera config. /// /// @param[in] session The ARCore session /// @param[in] camera_config The provided ArCameraConfig must be from a @@ -2029,6 +2032,12 @@ void ArCamera_getViewMatrix(const ArSession *session, /// anything other than #AR_TRACKING_STATE_TRACKING the pose should not be /// considered useful. Use ArCamera_getTrackingFailureReason() to determine the /// best recommendation to provide to the user to restore motion tracking. +/// +/// Note: Starting in ARCore 1.12, changing the active camera config using +/// {@link ArSession_setCameraConfig()} may cause the tracking state on certain +/// devices to become permanently PAUSED. For consistent behavior across all +/// supported devices, release any previously created anchors and trackables +/// when setting a new camera config. void ArCamera_getTrackingState(const ArSession *session, const ArCamera *camera, ArTrackingState *out_tracking_state); @@ -2092,7 +2101,7 @@ void ArCamera_getTextureIntrinsics(const ArSession *session, /// Releases a reference to the camera. This must match a call to /// ArFrame_acquireCamera(). /// -/// This method may safely be called with @c nullptr - it will do nothing. +/// This method may safely be called with @c NULL - it will do nothing. void ArCamera_release(ArCamera *camera); /// @} @@ -2283,7 +2292,8 @@ void ArFrame_transformCoordinates2d(const ArSession *session, /// @param[in] frame The current frame. /// @param[in] pixel_x Logical X position within the view, as from an /// Android UI event. -/// @param[in] pixel_y Logical X position within the view. +/// @param[in] pixel_y Logical Y position within the view, as from an +/// Android UI event. /// @param[inout] hit_result_list The list to fill. This list must have been /// previously allocated using ArHitResultList_create(). If the list has /// been previously used, it will first be cleared. @@ -2471,7 +2481,7 @@ void ArPointCloud_getTimestamp(const ArSession *session, /// Releases a reference to the point cloud. This must match a call to /// ArFrame_acquirePointCloud(). /// -/// This method may safely be called with @c nullptr - it will do nothing. +/// This method may safely be called with @c NULL - it will do nothing. void ArPointCloud_release(ArPointCloud *point_cloud); /// @} @@ -2496,7 +2506,7 @@ void ArImageMetadata_getNdkCameraMetadata( /// Releases a reference to the metadata. This must match a call to /// ArFrame_acquireImageMetadata(). /// -/// This method may safely be called with @c nullptr - it will do nothing. +/// This method may safely be called with @c NULL - it will do nothing. void ArImageMetadata_release(ArImageMetadata *metadata); /// Image formats produced by ARCore. @@ -2618,7 +2628,7 @@ void ArImage_getPlaneData(const ArSession *session, /// @deprecated in release 1.10.0. Please use the other ArImage_* functions to /// obtain image data. ARCore can produce a wide variety of images, not all of /// which can be represented using Android NDK AImage provided by this function. -/// In those cases, this method will return @c nullptr in out_ndk_image. +/// In those cases, this method will return @c NULL in out_ndk_image. void ArImage_getNdkImage(const ArImage *image, const AImage **out_ndk_image) AR_DEPRECATED( "deprecated in release 1.10.0. Please see function documentation"); @@ -2812,6 +2822,12 @@ void ArAnchor_getPose(const ArSession *session, ArPose *out_pose); /// Retrieves the current state of the pose of this anchor. +/// +/// Note: Starting in ARCore 1.12, changing the active camera config using +/// {@link ArSession_setCameraConfig()} may cause the tracking state on certain +/// devices to become permanently PAUSED. For consistent behavior across all +/// supported devices, release any previously created anchors and trackables +/// when setting a new camera config. void ArAnchor_getTrackingState(const ArSession *session, const ArAnchor *anchor, ArTrackingState *out_tracking_state); @@ -2824,7 +2840,7 @@ void ArAnchor_detach(ArSession *session, ArAnchor *anchor); /// Releases a reference to an anchor. To stop tracking for this anchor, call /// ArAnchor_detach() first. /// -/// This method may safely be called with @c nullptr - it will do nothing. +/// This method may safely be called with @c NULL - it will do nothing. void ArAnchor_release(ArAnchor *anchor); /// Acquires the cloud anchor ID of the anchor. The ID acquired is an ASCII @@ -2885,7 +2901,7 @@ void ArTrackableList_acquireItem(const ArSession *session, /// will necessarily stop tracking. The same trackable may still be included in /// from other calls, for example ArSession_getAllTrackables(). /// -/// This method may safely be called with @c nullptr - it will do nothing. +/// This method may safely be called with @c NULL - it will do nothing. void ArTrackable_release(ArTrackable *trackable); /// Retrieves the type of the trackable. See ::ArTrackableType for valid types. @@ -2895,6 +2911,12 @@ void ArTrackable_getType(const ArSession *session, /// Retrieves the current state of ARCore's knowledge of the pose of this /// trackable. +/// +/// Note: Starting in ARCore 1.12, changing the active camera config using +/// {@link ArSession_setCameraConfig()} may cause the tracking state on certain +/// devices to become permanently PAUSED. For consistent behavior across all +/// supported devices, release any previously created trackables when setting a +/// new camera config. void ArTrackable_getTrackingState(const ArSession *session, const ArTrackable *trackable, ArTrackingState *out_tracking_state); @@ -3057,9 +3079,10 @@ void ArPoint_getOrientationMode(const ArSession *session, /// @addtogroup augmented_image /// @{ -/// Returns the pose of the center of the detected image. The pose's +Y axis -/// will be a normal vector pointing out of the face of the image. The +X and +Z -/// axes represent right and up relative to the image. +/// Returns the pose of the center of the Augmented Image, in world coordinates. +/// The pose's transformed +Y axis will be the normal out of the plane. The +/// pose's transformed +X axis points from left to right on the image, and the +/// transformed +Z axis points from top to bottom on the image. /// /// If the tracking state is PAUSED/STOPPED, this returns the pose when the /// image state was last TRACKING, or the identity pose if the image state has @@ -3152,7 +3175,7 @@ void ArAugmentedImage_getTrackingMethod( /// (x, y, z) packing. /// @param[out] out_number_of_vertices The number of vertices in the mesh. The /// returned pointer will point to an array of size out_number_of_vertices * -/// 3 or @c nullptr if the size is 0. +/// 3 or @c NULL if the size is 0. void ArAugmentedFace_getMeshVertices(const ArSession *session, const ArAugmentedFace *face, const float **out_vertices, @@ -3176,7 +3199,7 @@ void ArAugmentedFace_getMeshVertices(const ArSession *session, /// (x, y, z) packing. /// @param[out] out_number_of_normals The number of normals in the mesh. The /// returned pointer will point to an array of size out_number_of_normals * -/// 3, or @c nullptr if the size is 0. +/// 3, or @c NULL if the size is 0. void ArAugmentedFace_getMeshNormals(const ArSession *session, const ArAugmentedFace *face, const float **out_normals, @@ -3200,8 +3223,7 @@ void ArAugmentedFace_getMeshNormals(const ArSession *session, /// coordinates in (u, v) packing. /// @param[out] out_number_of_texture_coordinates The number of texture /// coordinates in the mesh. The returned pointer will point to an array of -/// size out_number_of_texture_coordinates * 2, or @c nullptr if the size is -/// 0. +/// size out_number_of_texture_coordinates * 2, or @c NULL if the size is 0. void ArAugmentedFace_getMeshTextureCoordinates( const ArSession *session, const ArAugmentedFace *face, @@ -3229,7 +3251,7 @@ void ArAugmentedFace_getMeshTextureCoordinates( /// indices packed in consecutive triplets. /// @param[out] out_number_of_triangles The number of triangles in the mesh. The /// returned pointer will point to an array of size out_number_of_triangles -/// * 3, or @c nullptr if the size is 0. +/// * 3, or @c NULL if the size is 0. void ArAugmentedFace_getMeshTriangleIndices( const ArSession *session, const ArAugmentedFace *face, diff --git a/samples/augmented_image_c/app/build.gradle b/samples/augmented_image_c/app/build.gradle index 503d77521..f40d4fcb7 100644 --- a/samples/augmented_image_c/app/build.gradle +++ b/samples/augmented_image_c/app/build.gradle @@ -62,8 +62,8 @@ android { dependencies { // ARCore library - implementation 'com.google.ar:core:1.12.0' - natives 'com.google.ar:core:1.12.0' + implementation 'com.google.ar:core:1.13.0' + natives 'com.google.ar:core:1.13.0' implementation 'com.android.support:appcompat-v7:27.1.1' implementation 'com.android.support:design:27.1.1' diff --git a/samples/augmented_image_c/app/src/main/cpp/augmented_image_application.h b/samples/augmented_image_c/app/src/main/cpp/augmented_image_application.h index 9015c7653..4e98b3ce9 100644 --- a/samples/augmented_image_c/app/src/main/cpp/augmented_image_application.h +++ b/samples/augmented_image_c/app/src/main/cpp/augmented_image_application.h @@ -38,8 +38,7 @@ namespace augmented_image { class AugmentedImageApplication { public: // Constructor and deconstructor. - AugmentedImageApplication() = default; - AugmentedImageApplication(AAssetManager* asset_manager); + explicit AugmentedImageApplication(AAssetManager* asset_manager); ~AugmentedImageApplication(); // OnPause is called on the UI thread from the Activity's onPause method. diff --git a/samples/augmented_image_c/build.gradle b/samples/augmented_image_c/build.gradle index 6253bd0ed..382bee5be 100644 --- a/samples/augmented_image_c/build.gradle +++ b/samples/augmented_image_c/build.gradle @@ -6,7 +6,7 @@ buildscript { jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:3.4.1' + classpath 'com.android.tools.build:gradle:3.5.0' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files } diff --git a/samples/augmented_image_java/app/build.gradle b/samples/augmented_image_java/app/build.gradle index de1c4a497..4f84fad0b 100644 --- a/samples/augmented_image_java/app/build.gradle +++ b/samples/augmented_image_java/app/build.gradle @@ -35,7 +35,7 @@ android { dependencies { // ARCore library - implementation 'com.google.ar:core:1.12.0' + implementation 'com.google.ar:core:1.13.0' // Obj - a simple Wavefront OBJ file loader // https://github.com/javagl/Obj diff --git a/samples/augmented_image_java/app/src/main/java/com/google/ar/core/examples/java/augmentedimage/AugmentedImageActivity.java b/samples/augmented_image_java/app/src/main/java/com/google/ar/core/examples/java/augmentedimage/AugmentedImageActivity.java index 8f1ef191a..3fdb8818f 100644 --- a/samples/augmented_image_java/app/src/main/java/com/google/ar/core/examples/java/augmentedimage/AugmentedImageActivity.java +++ b/samples/augmented_image_java/app/src/main/java/com/google/ar/core/examples/java/augmentedimage/AugmentedImageActivity.java @@ -177,10 +177,7 @@ protected void onResume() { try { session.resume(); } catch (CameraNotAvailableException e) { - // In some cases (such as another camera app launching) the camera may be given to - // a different app instead. Handle this properly by showing a message and recreate the - // session at the next iteration. - messageSnackbarHelper.showError(this, "Camera not available. Please restart the app."); + messageSnackbarHelper.showError(this, "Camera not available. Try restarting the app."); session = null; return; } diff --git a/samples/augmented_image_java/build.gradle b/samples/augmented_image_java/build.gradle index 6253bd0ed..382bee5be 100644 --- a/samples/augmented_image_java/build.gradle +++ b/samples/augmented_image_java/build.gradle @@ -6,7 +6,7 @@ buildscript { jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:3.4.1' + classpath 'com.android.tools.build:gradle:3.5.0' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files } diff --git a/samples/cloud_anchor_java/app/build.gradle b/samples/cloud_anchor_java/app/build.gradle index f3d0126c6..de39e51cd 100644 --- a/samples/cloud_anchor_java/app/build.gradle +++ b/samples/cloud_anchor_java/app/build.gradle @@ -35,7 +35,7 @@ android { dependencies { // ARCore library - implementation 'com.google.ar:core:1.12.0' + implementation 'com.google.ar:core:1.13.0' // Obj - a simple Wavefront OBJ file loader // https://github.com/javagl/Obj diff --git a/samples/cloud_anchor_java/app/src/main/java/com/google/ar/core/examples/java/cloudanchor/CloudAnchorActivity.java b/samples/cloud_anchor_java/app/src/main/java/com/google/ar/core/examples/java/cloudanchor/CloudAnchorActivity.java index b206699d0..9a9f055de 100644 --- a/samples/cloud_anchor_java/app/src/main/java/com/google/ar/core/examples/java/cloudanchor/CloudAnchorActivity.java +++ b/samples/cloud_anchor_java/app/src/main/java/com/google/ar/core/examples/java/cloudanchor/CloudAnchorActivity.java @@ -246,9 +246,6 @@ private void createSession() { try { session.resume(); } catch (CameraNotAvailableException e) { - // In some cases (such as another camera app launching) the camera may be given to - // a different app instead. Handle this properly by showing a message and recreate the - // session at the next iteration. snackbarHelper.showError(this, getString(R.string.snackbar_camera_unavailable)); session = null; return; diff --git a/samples/cloud_anchor_java/app/src/main/res/values/strings.xml b/samples/cloud_anchor_java/app/src/main/res/values/strings.xml index 10ee6abd9..36f3e2d68 100644 --- a/samples/cloud_anchor_java/app/src/main/res/values/strings.xml +++ b/samples/cloud_anchor_java/app/src/main/res/values/strings.xml @@ -35,7 +35,7 @@ Please update ARCore. Please update the app with a newer version of the ARCore SDK. This device does not support ARCore. - Camera unavailable. Please restart the app. + Camera unavailable. Try restarting the app. The anchor ID was shared via Firebase. Dismiss There was a Firebase Error. Please check Logcat for more details. diff --git a/samples/computervision_c/app/build.gradle b/samples/computervision_c/app/build.gradle index 1e453cfe3..9a5ef9a4e 100644 --- a/samples/computervision_c/app/build.gradle +++ b/samples/computervision_c/app/build.gradle @@ -62,8 +62,8 @@ android { dependencies { // ARCore library - implementation 'com.google.ar:core:1.12.0' - natives 'com.google.ar:core:1.12.0' + implementation 'com.google.ar:core:1.13.0' + natives 'com.google.ar:core:1.13.0' implementation 'com.android.support:appcompat-v7:27.1.1' implementation 'com.android.support:design:27.1.1' diff --git a/samples/computervision_c/app/src/main/cpp/computer_vision_application.h b/samples/computervision_c/app/src/main/cpp/computer_vision_application.h index 1c0755f14..165d86e73 100644 --- a/samples/computervision_c/app/src/main/cpp/computer_vision_application.h +++ b/samples/computervision_c/app/src/main/cpp/computer_vision_application.h @@ -38,7 +38,7 @@ namespace computer_vision { class ComputerVisionApplication { public: // Constructor and deconstructor. - ComputerVisionApplication(AAssetManager* asset_manager); + explicit ComputerVisionApplication(AAssetManager* asset_manager); ~ComputerVisionApplication(); // OnPause is called on the UI thread from the Activity's onPause method. diff --git a/samples/computervision_c/build.gradle b/samples/computervision_c/build.gradle index 6253bd0ed..382bee5be 100644 --- a/samples/computervision_c/build.gradle +++ b/samples/computervision_c/build.gradle @@ -6,7 +6,7 @@ buildscript { jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:3.4.1' + classpath 'com.android.tools.build:gradle:3.5.0' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files } diff --git a/samples/computervision_java/app/build.gradle b/samples/computervision_java/app/build.gradle index e69bb511e..03b90e598 100644 --- a/samples/computervision_java/app/build.gradle +++ b/samples/computervision_java/app/build.gradle @@ -35,7 +35,7 @@ android { dependencies { // ARCore library - implementation 'com.google.ar:core:1.12.0' + implementation 'com.google.ar:core:1.13.0' // Obj - a simple Wavefront OBJ file loader // https://github.com/javagl/Obj diff --git a/samples/computervision_java/app/src/main/java/com/google/ar/core/examples/java/computervision/ComputerVisionActivity.java b/samples/computervision_java/app/src/main/java/com/google/ar/core/examples/java/computervision/ComputerVisionActivity.java index 40a3d2ebe..240a444ea 100644 --- a/samples/computervision_java/app/src/main/java/com/google/ar/core/examples/java/computervision/ComputerVisionActivity.java +++ b/samples/computervision_java/app/src/main/java/com/google/ar/core/examples/java/computervision/ComputerVisionActivity.java @@ -207,10 +207,7 @@ protected void onResume() { try { session.resume(); } catch (CameraNotAvailableException e) { - // In some cases (such as another camera app launching) the camera may be given to - // a different app instead. Handle this properly by showing a message and recreate the - // session at the next iteration. - messageSnackbarHelper.showError(this, "Camera not available. Please restart the app."); + messageSnackbarHelper.showError(this, "Camera not available. Try restarting the app."); session = null; return; } @@ -286,75 +283,74 @@ public void onDrawFrame(GL10 gl) { if (session == null) { return; } - // Notify ARCore session that the view size changed so that the perspective matrix and - // the video background can be properly adjusted. - cpuImageDisplayRotationHelper.updateSessionIfNeeded(session); - try { - session.setCameraTextureName(cpuImageRenderer.getTextureId()); - final Frame frame = session.update(); - final Camera camera = frame.getCamera(); - - // Keep the screen unlocked while tracking, but allow it to lock when tracking stops. - trackingStateHelper.updateKeepScreenOnFlag(camera.getTrackingState()); - - renderFrameTimeHelper.nextFrame(); - - switch (imageAcquisitionPath) { - case CPU_DIRECT_ACCESS: - renderProcessedImageCpuDirectAccess(frame); - break; - case GPU_DOWNLOAD: - renderProcessedImageGpuDownload(frame); - break; - } + // Synchronize here to avoid calling Session.update or Session.acquireCameraImage while paused. + synchronized (frameImageInUseLock) { + // Notify ARCore session that the view size changed so that the perspective matrix and + // the video background can be properly adjusted. + cpuImageDisplayRotationHelper.updateSessionIfNeeded(session); + + try { + session.setCameraTextureName(cpuImageRenderer.getTextureId()); + final Frame frame = session.update(); + final Camera camera = frame.getCamera(); + + // Keep the screen unlocked while tracking, but allow it to lock when tracking stops. + trackingStateHelper.updateKeepScreenOnFlag(camera.getTrackingState()); + + renderFrameTimeHelper.nextFrame(); - // Update the camera intrinsics' text. - runOnUiThread(() -> cameraIntrinsicsTextView.setText(getCameraIntrinsicsText(frame))); - } catch (Exception t) { - // Avoid crashing the application due to unhandled exceptions. - Log.e(TAG, "Exception on the OpenGL thread", t); + switch (imageAcquisitionPath) { + case CPU_DIRECT_ACCESS: + renderProcessedImageCpuDirectAccess(frame); + break; + case GPU_DOWNLOAD: + renderProcessedImageGpuDownload(frame); + break; + } + + // Update the camera intrinsics' text. + runOnUiThread(() -> cameraIntrinsicsTextView.setText(getCameraIntrinsicsText(frame))); + } catch (Exception t) { + // Avoid crashing the application due to unhandled exceptions. + Log.e(TAG, "Exception on the OpenGL thread", t); + } } } /* Demonstrates how to access a CPU image directly from ARCore. */ private void renderProcessedImageCpuDirectAccess(Frame frame) { - // Lock the image use to avoid pausing & resuming session when the image is in use. This is - // because switching resolutions requires all images to be released before session.resume() is - // called. - synchronized (frameImageInUseLock) { - try (Image image = frame.acquireCameraImage()) { - if (image.getFormat() != ImageFormat.YUV_420_888) { - throw new IllegalArgumentException( - "Expected image in YUV_420_888 format, got format " + image.getFormat()); - } - - ByteBuffer processedImageBytesGrayscale = null; - // Do not process the image with edge dectection algorithm if it is not being displayed. - if (isCVModeOn) { - processedImageBytesGrayscale = - edgeDetector.detect( - image.getWidth(), - image.getHeight(), - image.getPlanes()[0].getRowStride(), - image.getPlanes()[0].getBuffer()); - } + try (Image image = frame.acquireCameraImage()) { + if (image.getFormat() != ImageFormat.YUV_420_888) { + throw new IllegalArgumentException( + "Expected image in YUV_420_888 format, got format " + image.getFormat()); + } - cpuImageRenderer.drawWithCpuImage( - frame, - image.getWidth(), - image.getHeight(), - processedImageBytesGrayscale, - cpuImageDisplayRotationHelper.getViewportAspectRatio(), - cpuImageDisplayRotationHelper.getCameraToDisplayRotation()); - - // Measure frame time since last successful execution of drawWithCpuImage(). - cpuImageFrameTimeHelper.nextFrame(); - } catch (NotYetAvailableException e) { - // This exception will routinely happen during startup, and is expected. cpuImageRenderer - // will handle null image properly, and will just render the background. - cpuImageRenderer.drawWithoutCpuImage(); + ByteBuffer processedImageBytesGrayscale = null; + // Do not process the image with edge dectection algorithm if it is not being displayed. + if (isCVModeOn) { + processedImageBytesGrayscale = + edgeDetector.detect( + image.getWidth(), + image.getHeight(), + image.getPlanes()[0].getRowStride(), + image.getPlanes()[0].getBuffer()); } + + cpuImageRenderer.drawWithCpuImage( + frame, + image.getWidth(), + image.getHeight(), + processedImageBytesGrayscale, + cpuImageDisplayRotationHelper.getViewportAspectRatio(), + cpuImageDisplayRotationHelper.getCameraToDisplayRotation()); + + // Measure frame time since last successful execution of drawWithCpuImage(). + cpuImageFrameTimeHelper.nextFrame(); + } catch (NotYetAvailableException e) { + // This exception will routinely happen during startup, and is expected. cpuImageRenderer + // will handle null image properly, and will just render the background. + cpuImageRenderer.drawWithoutCpuImage(); } } @@ -439,10 +435,7 @@ private void onCameraConfigChanged(CameraConfig cameraConfig) { try { session.resume(); } catch (CameraNotAvailableException ex) { - // In a rare case (such as another camera app launching) the camera may be given to a - // different app and so may not be available to this app. Handle this properly by showing - // a message and recreate the session at the next iteration. - messageSnackbarHelper.showError(this, "Camera not available. Please restart the app."); + messageSnackbarHelper.showError(this, "Camera not available. Try restarting the app."); session = null; return; } diff --git a/samples/computervision_java/build.gradle b/samples/computervision_java/build.gradle index 6253bd0ed..382bee5be 100644 --- a/samples/computervision_java/build.gradle +++ b/samples/computervision_java/build.gradle @@ -6,7 +6,7 @@ buildscript { jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:3.4.1' + classpath 'com.android.tools.build:gradle:3.5.0' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files } diff --git a/samples/hello_ar_c/app/build.gradle b/samples/hello_ar_c/app/build.gradle index e63b9ae76..cdce80a3d 100644 --- a/samples/hello_ar_c/app/build.gradle +++ b/samples/hello_ar_c/app/build.gradle @@ -62,8 +62,8 @@ android { dependencies { // ARCore library - implementation 'com.google.ar:core:1.12.0' - natives 'com.google.ar:core:1.12.0' + implementation 'com.google.ar:core:1.13.0' + natives 'com.google.ar:core:1.13.0' implementation 'com.android.support:appcompat-v7:27.1.1' implementation 'com.android.support:design:27.1.1' diff --git a/samples/hello_ar_c/app/src/main/cpp/hello_ar_application.h b/samples/hello_ar_c/app/src/main/cpp/hello_ar_application.h index f083e1d6b..54a5c1fe3 100644 --- a/samples/hello_ar_c/app/src/main/cpp/hello_ar_application.h +++ b/samples/hello_ar_c/app/src/main/cpp/hello_ar_application.h @@ -40,8 +40,7 @@ namespace hello_ar { class HelloArApplication { public: // Constructor and deconstructor. - HelloArApplication() = default; - HelloArApplication(AAssetManager* asset_manager); + explicit HelloArApplication(AAssetManager* asset_manager); ~HelloArApplication(); // OnPause is called on the UI thread from the Activity's onPause method. diff --git a/samples/hello_ar_c/build.gradle b/samples/hello_ar_c/build.gradle index 6253bd0ed..382bee5be 100644 --- a/samples/hello_ar_c/build.gradle +++ b/samples/hello_ar_c/build.gradle @@ -6,7 +6,7 @@ buildscript { jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:3.4.1' + classpath 'com.android.tools.build:gradle:3.5.0' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files } diff --git a/samples/hello_ar_java/app/build.gradle b/samples/hello_ar_java/app/build.gradle index 62dd5e0a1..f99749fc2 100644 --- a/samples/hello_ar_java/app/build.gradle +++ b/samples/hello_ar_java/app/build.gradle @@ -37,7 +37,7 @@ android { dependencies { // ARCore library // Dependency version is rewritten at build time. - implementation 'com.google.ar:core:1.12.0' + implementation 'com.google.ar:core:1.13.0' // Obj - a simple Wavefront OBJ file loader // https://github.com/javagl/Obj diff --git a/samples/hello_ar_java/app/src/main/java/com/google/ar/core/examples/java/helloar/HelloArActivity.java b/samples/hello_ar_java/app/src/main/java/com/google/ar/core/examples/java/helloar/HelloArActivity.java index 14ae66dfd..305ac1d78 100644 --- a/samples/hello_ar_java/app/src/main/java/com/google/ar/core/examples/java/helloar/HelloArActivity.java +++ b/samples/hello_ar_java/app/src/main/java/com/google/ar/core/examples/java/helloar/HelloArActivity.java @@ -178,10 +178,7 @@ protected void onResume() { try { session.resume(); } catch (CameraNotAvailableException e) { - // In some cases (such as another camera app launching) the camera may be given to - // a different app instead. Handle this properly by showing a message and recreate the - // session at the next iteration. - messageSnackbarHelper.showError(this, "Camera not available. Please restart the app."); + messageSnackbarHelper.showError(this, "Camera not available. Try restarting the app."); session = null; return; } diff --git a/samples/hello_ar_java/build.gradle b/samples/hello_ar_java/build.gradle index 6253bd0ed..382bee5be 100644 --- a/samples/hello_ar_java/build.gradle +++ b/samples/hello_ar_java/build.gradle @@ -6,7 +6,7 @@ buildscript { jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:3.4.1' + classpath 'com.android.tools.build:gradle:3.5.0' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files } diff --git a/samples/shared_camera_java/app/build.gradle b/samples/shared_camera_java/app/build.gradle index 65af87d19..89194da37 100644 --- a/samples/shared_camera_java/app/build.gradle +++ b/samples/shared_camera_java/app/build.gradle @@ -37,7 +37,7 @@ android { dependencies { // ARCore library - implementation 'com.google.ar:core:1.12.0' + implementation 'com.google.ar:core:1.13.0' // Obj - a simple Wavefront OBJ file loader // https://github.com/javagl/Obj diff --git a/samples/shared_camera_java/build.gradle b/samples/shared_camera_java/build.gradle index 6253bd0ed..382bee5be 100644 --- a/samples/shared_camera_java/build.gradle +++ b/samples/shared_camera_java/build.gradle @@ -6,7 +6,7 @@ buildscript { jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:3.4.1' + classpath 'com.android.tools.build:gradle:3.5.0' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files }