2017-06-24 27 views
3

問題 私のコードを整理する際、ベストプラクティスと思われる別のクラスにAndroidカメラメソッドを移動したいと思います。一日中検索した後も、これを正確に行う方法を見つけるのはまだ苦労しています。主な問題は、実装方法の違いとカメラAPIからcamera2 APIへの移行が、私が複製できないオンラインで見つかったソリューションにつながることです。私はJavaの初心者ですので、Web上のさまざまな情報のために私が解決できない非常にルーキーなミスです。別のクラスをアクティビティに実装する

現在のコード 私の主な問題は、startCameraでSurfaceTexture texture = surfaceView.getSurfaceTexture();は()Cannot resolve method 'getSurfaceTexture()'を言うことであり、そのpreviewBuilder.addTarget(texture);addTarget (android.view.surface) in Builder cannot be applied to (android.graphics.SurfaceTexture)を文句を言います。

public class CameraView extends TextureView implements TextureView.SurfaceTextureListener{ 

    private Size previewsize; 
    private CameraDevice cameraDevice; 
    private CaptureRequest.Builder previewBuilder; 
    private CameraCaptureSession previewSession; 
    private final Context context; 
    public SurfaceView surfaceView; 
    public TextureView textureView; 

    public CameraView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     this.context = context; 
    } 

    public void onSurfaceTextureAvailable(SurfaceTexture texture, int width, int height) { 
     // Once the surface is created, simply open a handle to the camera hardware. 
     openCamera(); 
    } 

    public void onSurfaceTextureUpdated(SurfaceTexture texture) { 
    } 

    public void onSurfaceTextureSizeChanged(SurfaceTexture texture, int  width, int height) { 

     try { 
      //cameraDevice.setPreviewDisplay(holder); 

      //cameraDevice.startPreview(); 
     } catch (Exception e){ 
      e.printStackTrace(); 
     } 
    } 

    public boolean onSurfaceTextureDestroyed(SurfaceTexture texture) { 
     // stopPreview(); 
     cameraDevice.close(); 
     return true; 
    } 

    public void openCamera() 
    { 
     CameraManager manager = (CameraManager) context.getSystemService (Context.CAMERA_SERVICE); 
     try 
     { 
      String cameraId = manager.getCameraIdList()[0]; 
      CameraCharacteristics  characteristics=manager.getCameraCharacteristics(cameraId); 
      StreamConfigurationMap map = characteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP); 
      previewsize = map.getOutputSizes(SurfaceTexture.class)[0]; 
      try { 
       manager.openCamera(cameraId, stateCallback, null); 
      } catch (SecurityException e){ 
       e.printStackTrace(); 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

    private CameraDevice.StateCallback stateCallback = new CameraDevice.StateCallback() { 
     @Override 
     public void onOpened(CameraDevice camera) { 
      cameraDevice = camera; 
      startCamera(); 
     } 
     @Override 
     public void onClosed(CameraDevice camera) { 
      // nothing 
     } 
     @Override 
     public void onDisconnected(CameraDevice camera) { 
     } 
     @Override 
     public void onError(CameraDevice camera, int error) { 
     } 
    }; 

    void startCamera() 
    { 
     if (cameraDevice == null || previewsize==null) 
     { 
      return; 
     } 

     SurfaceTexture texture = surfaceView.getSurfaceTexture(); 
texture.setDefaultBufferSize(previewsize.getWidth(),previewsize.getHeight()); 

     Surface surface = new Surface(texture); 
     try 
     { 
      // add all the standard stuff to the previewBuilder 
      previewBuilder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW); 
     } catch (Exception e) {} 
     previewBuilder.addTarget(texture); 
     try 
     { 
      cameraDevice.createCaptureSession(Arrays.asList(surface), new CameraCaptureSession.StateCallback() { 
      @Override 
      public void onConfigured(CameraCaptureSession session) { 
       previewSession = session; 
       getChangedPreview(); 
      } 
      @Override 
      public void onConfigureFailed(CameraCaptureSession session{ 
      } 
     },null); 
     } catch (Exception e) {} 
    } 

    void getChangedPreview() 
    { 
     previewBuilder.set(CaptureRequest.CONTROL_AE_MODE, CameraMetadata.CONTROL_AE_MODE_ON); 

     HandlerThread thread = new HandlerThread("changed Preview"); 
     thread.start(); 
     Handler handler = new Handler(thread.getLooper()); 
     try 
     { 
      previewSession.setRepeatingRequest(previewBuilder.build(), null, handler); 
     }catch (Exception e){} 
    } 
} 

目標 は、私が代わりにそこに方法のトンを持っていることのビューを切り替えるにMainActivityクラスを制限したい清潔で理解しやすい私のコードを維持するために。次のオブジェクトをINVISIBLEからVISIBLEに切り替えることで、私のアプリでカメラビューを有効にしたいと思います。その他の提案は高く評価されます。

cameraView = (CameraView) findViewById(R.id.camera); 

MainActivity.javaはその後、次のようになります。

public class MainActivity extends AppCompatActivity { 

    private TextView mTextMessage; 
    private CameraView cameraView; 
    private MainSurfaceView mGLView; 
    private TextureView textureView; 

    private BottomNavigationView.OnNavigationItemSelectedListener mOnNavigationItemSelectedListener 
     = new BottomNavigationView.OnNavigationItemSelectedListener() { 

     @Override 
     public boolean onNavigationItemSelected(@NonNull MenuItem item) { 
      switch (item.getItemId()) { 
       case R.id.navigation_home: 
        mTextMessage.setText(R.string.title_home); 
        return true; 
       case R.id.navigation_dashboard: 
        mTextMessage.setText(R.string.title_dashboard); 
        return true; 
       case R.id.navigation_notifications: 
        mTextMessage.setText(R.string.title_notifications); 
        return true; 
      } 
      return false; 
     } 

    }; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     mTextMessage = (TextView) findViewById(R.id.message); 
     cameraView = (CameraView) findViewById(R.id.camera); 
     mGLView = (MainSurfaceView) findViewById(R.id.glSurfaceView); 
     BottomNavigationView navigation = (BottomNavigationView) findViewById(R.id.navigation); 
     navigation.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener); 

    } 
} 

あなたの助けを歓迎です! startCameraで

+0

あなたが作りたいことについてもう少し詳しく説明できますか、MainActivityの関連コードを表示できますか? –

答えて

0

SurfaceTexture texture = surfaceView.getSurfaceTexture();()Cannot resolve method 'getSurfaceTexture()'

はあなたがsurfaceViewのメソッドgetSurfaceTextureを呼び出すと言います。 surfaceViewはSurfaceViewです。ドキュメントを見てみましょう: https://developer.android.com/reference/android/view/SurfaceView.html 明らかに、SurfaceViewには "getSurfaceTexture()"というメソッドはありません。しかし、Googleで「getSurfaceTexture()Android」を検索すると、メソッドがTextureViewクラスに属することがわかります。あなたのクラスCameraViewは "textureView"と呼ばれるフィールドを持っていますので、望むならそのフィールドのメソッドを呼び出すことができます。さらに、CameraViewクラスはTextureView自体です(そのようにしますか?)ので、クラス自体で呼び出す場合は、getSurfaceTexture()を呼び出すこともできます。 https://developer.android.com/reference/android/hardware/camera2/CaptureRequest.Builder.html どうやらCaptureRequest.builder(previewBuilderのタイプは)addTargetと呼ばれる方法がありますが、その方法は、表面のみを受け付けます!

previewBuilder.addTarget(texture);addTarget (android.view.surface) in Builder cannot be applied to (android.graphics.SurfaceTexture). だが、再びドキュメントを見てみましょう文句あなたはテクスチャを渡しています。あなたはおそらく変更したいtexturesurface

+0

Joost、あなたの答えに感謝します。 SDKの2番目の苦情のために表面にテクスチャを変更すると、私が以前に見つけたように問題が修正されますが、これは問題とは関係ありません。最初の問題では、これを 'SurfaceTexture texture = TextureView.getSurfaceTexture();'に変更すると '非静的メソッド' getSurfaceTexture()になります。静的コンテキストからエラーを参照することはできません。エラーも発生しません。フォローアップをお願いしますか? My CameraViewはWebリサーチに基づいて、はい、テクスチャビューにする必要があります。目標は、私のMainActivityでビューを呼び出すことだけです。 – j73951

+0

TextureView型のオブジェクト(クラスではない)のgetSurfaceTextureを呼び出すことで、最初の問題を解決できます。フィールドtextureViewで呼び出す場合は、 'textureView.getSurfaceTexture()'を使用できます。 CameraView自体で呼びたい場合は、「getSurfaceTexture()」または「this.getSurfaceTexture()」を使用することができます。 –

+0

説明をありがとう! getSurfaceTexture()を使用して動作させましたが、画面にカメラの入力はまだありませんが、さらに確認して他のユーザーのために更新されたコードの概要を提供します。再度、感謝します:) – j73951

関連する問題