2017-11-06 15 views
0

Googleは、Googleが作成したバーコードAPIに基づいてアプリケーションを作成し、いくつか調整を加えようとしています。私は学生で、まだ学んでいるので、次に何をすべきかについての手がかりはありません。正しい方向に向けることができます。Google Barcode 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);

私は何をしますか?

Takepicture方法:

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); 
     } 
    } 
} 
+0

最初に:なぜ画像を保存しますか? 2番目: 'takePicture()'へのコールバックを提供してどこに保存するかを定義する必要があると思います。 – Eselfar

+0

私は実際に画像を保存したくありませんが、テスト目的でした。私はBase64でエンコードされた画像を取るAPIを作った。だから私が実際にやりたいのは、Base64で画像をエンコードし、それを私のAPIに送ることです。私はアンドロイドの新人だから、コールバックを提供することが何を意味するのか正確には分からない。 –

答えて

0

としてはtakePicture方法は、2つのパラメータを有するthe documentationで説明。どちらもa callbackです。

コールバックはインターフェイスが実装されており、メソッドが提供されたメソッドによってどこかで呼び出されます。 メソッドが非同期で、結果をいつ取得するかわからない場合は、コールバックを使用します。現在のスレッドをブロックして結果を待つことはできません(そうでなければ、非同期呼び出しを行うのは無意味です)。

(注)インターフェイスがあります。ある時点で、メソッドがコールバック

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

    callback.onResult(value); 
} 
onResultを呼び出します

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

public interface Callback{ 
    public void onResult(int 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); 

また、インタフェースを実装するクラスを作成することもできます(complexeの場合)。

私たちの場合

そこで、基本的takePictureの2番目のコールバックは、パラメータとして「JPEG画像データ」を持つメソッドを持っています。だから、コールバックを実装してデータを取得し、それを使って何でもできるようにするだけです。たとえば、それらを保存してAPIに送信することができます。

+0

お返事ありがとうございました。今すぐ試してみましょう。たぶん愚かな質問ですが、あなたはどこにも定義していないので、それはonPictureTakenを実行する必要があることをどのように知っていますか? –

+0

あなたはそれを定義しなければなりません。基本的にtakePictureメソッドのどこかに、あなたがコールバックを提供したことをチェックするコードがあります。そうであれば 'onPictureTaken'が呼び出されます。そうでなければ何も起こりません。この呼び出しは非同期であることを忘れないでください。これは、 'onPictureTaken'が呼び出されるときに' onTap'メソッドが実行されたことを意味します。 – Eselfar

+0

質問にtakePictureメソッドを追加します –