android - 如何使用 React-Native-Camera 捕获获取元数据?

标签 android react-native react-native-camera

我不知道如何使用 react-native-camera 获取捕获图像的元数据捕获方法。

我假设它是这样的:

this.camera.capture({metadata: true})
  .then((data) => console.log(data))
  .catch(error => alert("error: " + error));

但它只返回路径,所以:

this.camera.capture({metadata: 'location'})
  .then((data) => console.log(data))
  .catch(error => alert("error: " + error));

我不清楚文档元数据的用法。 传递元数据参数的正确方法是什么? 有人让它工作吗?

最佳答案

这可能是盲目的尝试,但如果您阅读了 README.md 的第一段 https://github.com/lwansbrough/react-native-camera它说:

These docs are for the work in progress v1 release. If you want to use the latest and greatest and can deal with significant instability you can install with npm install --save lwansbrough/react-native-camera.

该库的 NPM 版本是 0.3.8:https://www.npmjs.com/package/react-native-camera .

编辑:

所以我去安装了 0.3.8 版本的库,然后进入 node_modules 查看 Java 代码(假设您正在 Android 手机上测试它)并搜索 native capture 函数,实际上没有任何东西可以处理 metadata 选项,这很遗憾。尝试搜索元数据,您将找不到任何内容:

@ReactMethod
public void capture(final ReadableMap options, final Promise promise) {
    int orientation = options.hasKey("orientation") ? options.getInt("orientation") : RCTCamera.getInstance().getOrientation();
    if (orientation == RCT_CAMERA_ORIENTATION_AUTO) {
        _sensorOrientationChecker.onResume();
        _sensorOrientationChecker.registerOrientationListener(new RCTSensorOrientationListener() {
            @Override
            public void orientationEvent() {
                int deviceOrientation = _sensorOrientationChecker.getOrientation();
                _sensorOrientationChecker.unregisterOrientationListener();
                _sensorOrientationChecker.onPause();
                captureWithOrientation(options, promise, deviceOrientation);
            }
        });
    } else {
        captureWithOrientation(options, promise, orientation);
    }
}

private void captureWithOrientation(final ReadableMap options, final Promise promise, int deviceOrientation) {
    Camera camera = RCTCamera.getInstance().acquireCameraInstance(options.getInt("type"));
    if (null == camera) {
        promise.reject("No camera found.");
        return;
    }

    if (options.getInt("mode") == RCT_CAMERA_CAPTURE_MODE_VIDEO) {
        record(options, promise);
        return;
    }

    RCTCamera.getInstance().setCaptureQuality(options.getInt("type"), options.getString("quality"));

    if (options.hasKey("playSoundOnCapture") && options.getBoolean("playSoundOnCapture")) {
        MediaActionSound sound = new MediaActionSound();
        sound.play(MediaActionSound.SHUTTER_CLICK);
    }

    if (options.hasKey("quality")) {
        RCTCamera.getInstance().setCaptureQuality(options.getInt("type"), options.getString("quality"));
    }

    final Boolean shouldMirror = options.hasKey("mirrorImage") && options.getBoolean("mirrorImage");

    RCTCamera.getInstance().adjustCameraRotationToDeviceOrientation(options.getInt("type"), deviceOrientation);
    camera.takePicture(null, null, new Camera.PictureCallback() {
        @Override
        public void onPictureTaken(byte[] data, Camera camera) {

            if (shouldMirror) {
                data = mirrorImage(data);
                if (data == null) {
                    promise.reject("Error mirroring image");
                }
            }

            camera.stopPreview();
            camera.startPreview();
            WritableMap response = new WritableNativeMap();
            switch (options.getInt("target")) {
                case RCT_CAMERA_CAPTURE_TARGET_MEMORY:
                    String encoded = Base64.encodeToString(data, Base64.DEFAULT);
                    response.putString("data", encoded);
                    promise.resolve(response);
                    break;
                case RCT_CAMERA_CAPTURE_TARGET_CAMERA_ROLL: {
                    File cameraRollFile = getOutputCameraRollFile(MEDIA_TYPE_IMAGE);
                    if (cameraRollFile == null) {
                        promise.reject("Error creating media file.");
                        return;
                    }

                    Throwable error = writeDataToFile(data, cameraRollFile);
                    if (error != null) {
                        promise.reject(error);
                        return;
                    }

                    addToMediaStore(cameraRollFile.getAbsolutePath());
                    response.putString("path", Uri.fromFile(cameraRollFile).toString());
                    promise.resolve(response);
                    break;
                }
                case RCT_CAMERA_CAPTURE_TARGET_DISK: {
                    File pictureFile = getOutputMediaFile(MEDIA_TYPE_IMAGE);
                    if (pictureFile == null) {
                        promise.reject("Error creating media file.");
                        return;
                    }

                    Throwable error = writeDataToFile(data, pictureFile);
                    if (error != null) {
                        promise.reject(error);
                        return;
                    }

                    addToMediaStore(pictureFile.getAbsolutePath());
                    response.putString("path", Uri.fromFile(pictureFile).toString());
                    promise.resolve(response);
                    break;
                }
                case RCT_CAMERA_CAPTURE_TARGET_TEMP: {
                    File tempFile = getTempMediaFile(MEDIA_TYPE_IMAGE);
                    if (tempFile == null) {
                        promise.reject("Error creating media file.");
                        return;
                    }

                    Throwable error = writeDataToFile(data, tempFile);
                    if (error != null) {
                        promise.reject(error);
                    }

                    response.putString("path", Uri.fromFile(tempFile).toString());
                    promise.resolve(response);
                    break;
                }
            }
        }
    });
}

但是,我查看了 iOS 端,发现它们确实在那里处理 metadata 对象。

编辑:

此外,master 分支仍然不处理metadata 选项。请参阅here 。似乎您必须指定一个特定的目标,并且根据目标是什么,它将返回您特定的数据类型,但不幸的是与位置无关。

关于android - 如何使用 React-Native-Camera 捕获获取元数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39465560/

相关文章:

java - Android 获取 facebook 电子邮件地址

javascript - 如何防止重新渲染未更改的组件?

javascript - react native 相机,onBarCodeRead 不起作用

react-native - 如何使用expo React Native相机拍照?

android - 仅在运行测试时出现 DexIndexOverflowException

Android Studio Flutter 无法编译到 iOS

javascript - 如何以 redux-form 更改一个字段值基于另一个字段值?

reactjs - (0, _reactNavigation.withOrientation) 不是函数错误

javascript - 如何让条码扫描仪从数据库中检查条码编号?

javascript - 如何在不重新发明轮子的情况下为Android编写自己的浏览器?