2016-07-22 6 views
0

私はカメラ出力を表示するためにSurfaceViewとギャラリーから画像を選択するImageButtonを作成したQRデコーダアプリで作業しています。 Google Playサービスを使用して、カメラを使用してQRをスキャンするために表面ビューを使用する必要があるQRコードをデコードしています。しかしそれはそれ自身に焦点を当てていません。 以下は同じコードです。サーフェスビューにオートフォーカスを追加するには?

import android.content.Intent; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.net.Uri; 
import android.os.Bundle; 
import android.provider.MediaStore; 
import android.support.v7.app.AppCompatActivity; 
import android.util.Log; 
import android.util.SparseArray; 
import android.view.SurfaceHolder; 
import android.view.SurfaceView; 
import android.view.View; 
import android.widget.ImageButton; 
import android.widget.Toast; 

import com.google.android.gms.vision.CameraSource; 
import com.google.android.gms.vision.Detector; 
import com.google.android.gms.vision.Frame; 
import com.google.android.gms.vision.barcode.Barcode; 
import com.google.android.gms.vision.barcode.BarcodeDetector; 

public class Scanner extends AppCompatActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_scanner); 

     final SurfaceView cameraView = (SurfaceView) findViewById(R.id.camera_view); 
     BarcodeDetector barcodeDectector = new BarcodeDetector.Builder(this).setBarcodeFormats(Barcode.QR_CODE).build(); 
     final CameraSource cameraSource = new CameraSource.Builder(this,barcodeDectector).setRequestedPreviewSize(1920,1080).build(); 
     cameraView.getHolder().addCallback(new SurfaceHolder.Callback() { 
      @Override 
      public void surfaceCreated(SurfaceHolder surfaceHolder) { 
       try { 
        cameraSource.start(cameraView.getHolder()); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 

      @Override 
      public void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i1, int i2) { 

      } 

      @Override 
      public void surfaceDestroyed(SurfaceHolder surfaceHolder) { 
       cameraSource.stop(); 
      } 
     }); 
     barcodeDectector.setProcessor(new Detector.Processor<Barcode>() { 
      @Override 
      public void release() { 

      } 

      @Override 
      public void receiveDetections(Detector.Detections<Barcode> detections) { 
       final SparseArray<Barcode> barcodes = detections.getDetectedItems(); 

       //QRcode found hence move to intent action. 
       if(barcodes.size() != 0){ 
        Intent i = new Intent(Scanner.this,Verify.class); 
        i.putExtra("xml",barcodes.valueAt(0).displayValue); 
        startActivity(i); 
       } 
      } 
     }); 

     ImageButton scanImage = (ImageButton) findViewById(R.id.scanImage); 
     scanImage.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       //button action to be added 
      }  

     }); 

    } 
} 

activity_scanner.xmlは次のとおりです。

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:paddingBottom="@dimen/activity_vertical_margin" 
    android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin""> 

    <SurfaceView 
     android:layout_width="match_parent" 
     android:layout_height="400dip" 
     android:layout_weight="70" 
     android:id="@+id/camera_view" 
     android:layout_alignParentLeft="true" 
     /> 

    <ImageButton 
     android:layout_width="wrap_content" 
     android:layout_height="match_parent" 
     android:id="@+id/scanImage" 
     android:layout_below="@+id/camera_view" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentStart="true" 
     android:src="@drawable/ic_image_black_48dp" 
     android:layout_alignRight="@+id/camera_view" 
     android:layout_alignEnd="@+id/camera_view" /> 

</RelativeLayout> 
+0

はSurfaceViewを拡張するクラスを作成してみてください。コンストラクタで 'setFocusable(true)'を使います。 –

+0

class CameraView extends SurfaceView { public CameraView(コンテキストコンテキスト){ スーパー(コンテキスト); setFocusable(true); } } final CameraView cameraView =(CameraView)findViewById(R.id.camera_view); –

+0

このようなことを意味しますか?今は鋳造上の問題をもたらします –

答えて

1

は次のように表面図を拡大してみて、setFocusable(true)

public class CameraView extends SurfaceView implements SurfaceHolder.Callback { 

    public CameraView(Context context) { 
     super(context); 
     getHolder().addCallback(this); 
     setFocusable(true); 
    } 

    @Override 
    public void surfaceCreated(SurfaceHolder holder) { 

    } 

    @Override 
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { 

    } 

    @Override 
    public void surfaceDestroyed(SurfaceHolder holder) { 

    } 
} 

EDIT 1: 次にレイアウトで、あなたがこのようなこのクラスを使用することができ、

<?xml version="1.0" encoding="utf-8"?> 

<RelativeLayout xmlns:android="http://s...content-available-to-author-only...d.com/apk/res/android" 
    xmlns:tools="http://s...content-available-to-author-only...d.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:paddingBottom="@dimen/activity_vertical_margin" 
    android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin"> 

<com.abhayjatindoshi.encryptorcode.qrlogin.javaclass.CameraView 
    android:layout_width="match_parent" 
    android:layout_height="400dip" 
    android:layout_weight="70" 
    android:id="@+id/camera_view" 
    android:layout_alignParentLeft="true" 
    /> 

<ImageButton 
    android:layout_width="wrap_content" 
    android:layout_height="match_parent" 
    android:id="@+id/scanImage" 
    android:layout_below="@+id/camera_view" 
    android:layout_alignParentLeft="true" 
    android:layout_alignParentStart="true" 
    android:src="@drawable/ic_image_black_48dp" 
    android:layout_alignRight="@+id/camera_view" 
    android:layout_alignEnd="@+id/camera_view" /> 

</RelativeLayout> 

上記のような使用レイアウト。

+0

CameraViewはユーザークラスであり、見つからないため、 呼び出しをインポートします –

+0

xmlでは、 ''を使う必要があります。 'yourClassPackage'はCameraViewクラスが存在するパッケージです。 –

+0

http://ideone.com/nwknTgは3行目のエラーを示しています –

1

はこれを試してみてください。

cameraView.requestFocus(); 
+0

はAndroid 4.2.2では正常に動作しますが、Android 6.0では正しく動作しません –

1
cameraView.setFocusableInTouchMode(true); 
cameraView.setFocusable(true); 
cameraView.requestFocus(); 
+0

はAndroid 4.2.2では正常に動作しますが、Android 6.0では正しく動作しません –

0

上記は私の「フォーカス」の問題は解決しませんでしたが、私は私を助けたクロス他の解決策を来る:

private void setCamFocusMode(){ 
if(null == mCamera) { 
    return; 
} 

/* Set Auto focus */ 
Parameters parameters = mCamera.getParameters(); 
List<String> focusModes = parameters.getSupportedFocusModes(); 
if(focusModes.contains(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE)){ 
    parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE); 
} else 
if(focusModes.contains(Camera.Parameters.FOCUS_MODE_AUTO)){ 
    parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO); 
} 

mCamera.setParameters(parameters); 
} 

はoryginallyここに掲載: https://stackoverflow.com/a/27092999/6225516

関連する問題