2

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

ドキュメントのメタデータの使用法は私にはわかりません。メタデータ パラメータを渡す正しい方法は何ですか? 誰かがこれを機能させましたか?

4

1 に答える 1

2

これは暗闇の中のショットかもしれませんが、README.md https://github.com/lwansbrough/react-native-cameraの最初の段落を読むと、次のように書かれています。

これらのドキュメントは、進行中の v1 リリース用です。最新かつ最高のものを使用したい場合で、重大な不安定性に対処できる場合は、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 フォンでテストしていると仮定して)、ネイティブ関数を検索しましたが、オプションcaptureを処理するものは文字通り何もありませんmetadata。これは悲しいことです。 . を検索してみてください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を参照してください。特定のものを指定する必要があるようで、それが何であるかに応じて、特定のデータ型が返されますが、残念ながら場所に関連するものはありません。target

于 2016-09-13T23:53:15.843 に答える