Google Barcode API,保存图片

时间:2017-11-06 14:32:34

标签: java android api barcode barcode-scanner

所以我一直在尝试根据Google制作的条形码API制作应用程序并添加一些调整。我是一名学生,还在学习,所以我不知道接下来该做什么,也许你可以指出我正确的方向。

目前我有

private boolean onTap(float rawX, float rawY) {
    mCameraSource.takePicture(null,null);

    // Find tap point in preview frame coordinates.
    int[] location = new int[2];
    mGraphicOverlay.getLocationOnScreen(location);
    float x = (rawX - location[0]) / mGraphicOverlay.getWidthScaleFactor();
    float y = (rawY - location[1]) / mGraphicOverlay.getHeightScaleFactor();

    // Find the barcode whose center is closest to the tapped point.
    Barcode best = null;
    float bestDistance = Float.MAX_VALUE;
    for (BarcodeGraphic graphic : mGraphicOverlay.getGraphics()) {
        Barcode barcode = graphic.getBarcode();
        if (barcode.getBoundingBox().contains((int) x, (int) y)) {
            // Exact hit, no need to keep looking.
            best = barcode;
            break;
        }
        float dx = x - barcode.getBoundingBox().centerX();
        float dy = y - barcode.getBoundingBox().centerY();
        float distance = (dx * dx) + (dy * dy);  // actually squared distance
        if (distance < bestDistance) {
            best = barcode;
            bestDistance = distance;
        }
    }

但是除了取出条形码之外,我还要保存整个图像,我尝试通过实现:mCameraSource.takePicture(null,null);

我该怎么办?

拍照方法:

public void takePicture(ShutterCallback shutter, PictureCallback jpeg) {
    synchronized (mCameraLock) {
        if (mCamera != null) {
            PictureStartCallback startCallback = new PictureStartCallback();
            startCallback.mDelegate = shutter;
            PictureDoneCallback doneCallback = new PictureDoneCallback();
            doneCallback.mDelegate = jpeg;
            mCamera.takePicture(startCallback, null, null, doneCallback);
        }
    }
}

1 个答案:

答案 0 :(得分:0)

正如the documentation中所述,takePicture方法有2个参数。两者都是a callback

回调是接口的实现,其中方法将在某个时刻被提供的方法调用。 通常在方法异步时使用回调,因为您不知道何时获得结果,并且您无法阻止当前的Thread等待结果(否则进行异步调用毫无意义)。

示例

你有一个界面:

public interface Callback{
   public void onResult(int value);
}

一种方法:

public void testMethod(Callback callback){
   // Do something
}

在某些时候,该方法将在回调上调用onResult

public void testMethod(Callback callback){
   // A lot of asynchronous calculation
   // ...

  callback.onResult(value);
}

所以当你调用方法时,你会这样做:

testMethod(new Callback(){
   @Override
   public void onResult(int value){
     // Do something with the result;
   }
});

或者您可以在变量中设置回调:

Callback cb = new Callback(){
 @Override
 public void onResult(int value){
     // Do something with the result;
   }
};

然后将其传递给方法:

testMethod(cb);

甚至创建一个实现接口的类(如果它是复杂的东西)。

我们的案例

所以基本上takePicture的第二个回调的方法是“JPEG图像数据”作为参数。因此,您需要做的就是实现回调以获取数据,然后您可以使用它们执行任何操作。例如,您可以存储它们,将它们发送到API ...

 mCameraSource.takePicture(null, new CameraSource.PictureCallback(){
   @Override
    public  void onPictureTaken (byte[] data){
       // Do something with the data (this is the JPEG image)
   }
});