2016-10-06 7 views
11

Я пытаюсь открыть оборудование камеры на SurfaceView. В макете я создал SurfaceView, и я открываю камеру, как показано в приведенном ниже коде. Когда я запускаю код, появляется тост в CameraAvailableCB и говорит «onCameraAvailable», но ничего не появляется в SurfaceView.Как показать предварительный просмотр камеры на SurfaceView?

Как показать отображение камеры на SurfaceView?

Код

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

    this.mBtnCapture = (Button) findViewById(R.id.actMain_btn_capture); 
    this.mSurfaceView = (SurfaceView) findViewById(R.id.actMain_surfaceView); 
    this.mSurfaceHolder = this.mSurfaceView.getHolder(); 
    this.mSurfaceHolder.addCallback(this); 
    this.mCameraManager = (CameraManager) this.getSystemService(Context.CAMERA_SERVICE); 

    try { 
     cameraIDsList = this.mCameraManager.getCameraIdList(); 

     for (String id : cameraIDsList) { 
      Log.v(TAG, "CameraID: " + id); 
     } 

    } catch (CameraAccessException e) { 
     e.printStackTrace(); 
    } 

    cameraStateCB = new CameraDevice.StateCallback() { 
     @Override 
     public void onOpened(CameraDevice camera) { 
      Toast.makeText(getApplicationContext(), "onOpened", Toast.LENGTH_SHORT).show(); 

      //requesting permission 
      int permissionCheck = ContextCompat.checkSelfPermission(activity, Manifest.permission.CAMERA); 
      if (permissionCheck != PackageManager.PERMISSION_GRANTED) { 

       if (ActivityCompat.shouldShowRequestPermissionRationale(activity, Manifest.permission.CAMERA)) { 

       } else { 
        ActivityCompat.requestPermissions(activity, new String[]{Manifest.permission.CAMERA}, MY_PERMISSIONS_REQUEST_CAMERA); 
        Toast.makeText(getApplicationContext(), "request permission", Toast.LENGTH_SHORT).show(); 
       } 

      } else { 
       Toast.makeText(getApplicationContext(), "PERMISSION_ALREADY_GRANTED", Toast.LENGTH_SHORT).show(); 
      } 

      //opening the camera 
      try { 
       mCameraManager.openCamera(cameraIDsList[1], cameraStateCB, new Handler()); 

      } catch (CameraAccessException e) { 
       e.printStackTrace(); 
      } 
     } 

     @Override 
     public void onDisconnected(CameraDevice camera) { 
      Toast.makeText(getApplicationContext(), "onDisconnected", Toast.LENGTH_SHORT).show(); 
     } 

     @Override 
     public void onError(CameraDevice camera, int error) { 
      Toast.makeText(getApplicationContext(), "onError", Toast.LENGTH_SHORT).show(); 
     } 
    }; 

    CameraManager.AvailabilityCallback cameraAvailableCB = new CameraManager.AvailabilityCallback() { 
     @Override 
     public void onCameraAvailable(String cameraId) { 
      super.onCameraAvailable(cameraId); 

      Toast.makeText(getApplicationContext(), "onCameraAvailable", Toast.LENGTH_SHORT).show(); 
     } 

     @Override 
     public void onCameraUnavailable(String cameraId) { 
      super.onCameraUnavailable(cameraId); 

      Toast.makeText(getApplicationContext(), "onCameraUnavailable", Toast.LENGTH_SHORT).show(); 
     } 
    }; 
    this.mCameraManager.registerAvailabilityCallback(cameraAvailableCB, new Handler()); 
} 



@Override 
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { 
    super.onRequestPermissionsResult(requestCode, permissions, grantResults); 

    switch (requestCode) { 
     case MY_PERMISSIONS_REQUEST_CAMERA: 
      if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) 
       // Open Camera 
       break; 
    } 
} 

@Override 
public void surfaceCreated(SurfaceHolder holder) { 
    Log.w(TAG, "surfaceCreated"); 
} 

@Override 
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { 
    Log.w(TAG, "surfaceChanged"); 
} 

@Override 
public void surfaceDestroyed(SurfaceHolder holder) { 
    Log.w(TAG, "surfaceDestroyed"); 
} 
+0

Так, «onOpened» тост не появляется, тоже? –

+0

@AlexCohn несколько раз появляется – user2121

ответ

17

Чтобы показать предварительный просмотр с камеры с помощью Camera2 API вы должны сделать следующие шаги:

  1. получить разрешение на использование камеры устройства
  2. Использование CameraManager открытое подключение к камера
  3. Подготовлено Площадь для предварительного просмотра
  4. Используя открытый устройство камеры и желательные поверхности (она может включать в себя не только просмотр поверхности) создать CaptureSession
  5. После CaptureSession создан необходимо создать и настроить CaptureRequest и представить его CaptureSession

Нужно заметить, что подготовка поверхностей и открытие соединения с камерой - это независимые процессы, поэтому вам нужно быть уверенным, что они оба выполнены до создания CaptureSession.

Вот пример деятельности для отображения камеры предварительного просмотра на экране:

public class MainActivity extends AppCompatActivity implements SurfaceHolder.Callback, Handler.Callback { 
    static final String TAG = "CamTest"; 
    static final int MY_PERMISSIONS_REQUEST_CAMERA = 1242; 
    private static final int MSG_CAMERA_OPENED = 1; 
    private static final int MSG_SURFACE_READY = 2; 
    private final Handler mHandler = new Handler(this); 
    SurfaceView mSurfaceView; 
    SurfaceHolder mSurfaceHolder; 
    CameraManager mCameraManager; 
    String[] mCameraIDsList; 
    CameraDevice.StateCallback mCameraStateCB; 
    CameraDevice mCameraDevice; 
    CameraCaptureSession mCaptureSession; 
    boolean mSurfaceCreated = true; 
    boolean mIsCameraConfigured = false; 
    private Surface mCameraSurface = null; 

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

     this.mSurfaceView = (SurfaceView) findViewById(R.id.SurfaceViewPreview); 
     this.mSurfaceHolder = this.mSurfaceView.getHolder(); 
     this.mSurfaceHolder.addCallback(this); 
     this.mCameraManager = (CameraManager) this.getSystemService(Context.CAMERA_SERVICE); 

     try { 
      mCameraIDsList = this.mCameraManager.getCameraIdList(); 
      for (String id : mCameraIDsList) { 
       Log.v(TAG, "CameraID: " + id); 
      } 
     } catch (CameraAccessException e) { 
      e.printStackTrace(); 
     } 

     mCameraStateCB = new CameraDevice.StateCallback() { 
      @Override 
      public void onOpened(CameraDevice camera) { 
       Toast.makeText(getApplicationContext(), "onOpened", Toast.LENGTH_SHORT).show(); 

       mCameraDevice = camera; 
       mHandler.sendEmptyMessage(MSG_CAMERA_OPENED); 
      } 

      @Override 
      public void onDisconnected(CameraDevice camera) { 
       Toast.makeText(getApplicationContext(), "onDisconnected", Toast.LENGTH_SHORT).show(); 
      } 

      @Override 
      public void onError(CameraDevice camera, int error) { 
       Toast.makeText(getApplicationContext(), "onError", Toast.LENGTH_SHORT).show(); 
      } 
     }; 
    } 

    @Override 
    protected void onStart() { 
     super.onStart(); 

     //requesting permission 
     int permissionCheck = ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA); 
     if (permissionCheck != PackageManager.PERMISSION_GRANTED) { 
      if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.CAMERA)) { 

      } else { 
       ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, MY_PERMISSIONS_REQUEST_CAMERA); 
       Toast.makeText(getApplicationContext(), "request permission", Toast.LENGTH_SHORT).show(); 
      } 
     } else { 
      Toast.makeText(getApplicationContext(), "PERMISSION_ALREADY_GRANTED", Toast.LENGTH_SHORT).show(); 
      try { 
       mCameraManager.openCamera(mCameraIDsList[1], mCameraStateCB, new Handler()); 
      } catch (CameraAccessException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 

    @Override 
    protected void onStop() { 
     super.onStop(); 
     try { 
      if (mCaptureSession != null) { 
       mCaptureSession.stopRepeating(); 
       mCaptureSession.close(); 
       mCaptureSession = null; 
      } 

      mIsCameraConfigured = false; 
     } catch (final CameraAccessException e) { 
      // Doesn't matter, cloising device anyway 
      e.printStackTrace(); 
     } catch (final IllegalStateException e2) { 
      // Doesn't matter, cloising device anyway 
      e2.printStackTrace(); 
     } finally { 
      if (mCameraDevice != null) { 
       mCameraDevice.close(); 
       mCameraDevice = null; 
       mCaptureSession = null; 
      } 
     } 
    } 

    @Override 
    public boolean handleMessage(Message msg) { 
     switch (msg.what) { 
      case MSG_CAMERA_OPENED: 
      case MSG_SURFACE_READY: 
       // if both surface is created and camera device is opened 
       // - ready to set up preview and other things 
       if (mSurfaceCreated && (mCameraDevice != null) 
         && !mIsCameraConfigured) { 
        configureCamera(); 
       } 
       break; 
     } 

     return true; 
    } 

    private void configureCamera() { 
     // prepare list of surfaces to be used in capture requests 
     List<Surface> sfl = new ArrayList<Surface>(); 

     sfl.add(mCameraSurface); // surface for viewfinder preview 

     // configure camera with all the surfaces to be ever used 
     try { 
      mCameraDevice.createCaptureSession(sfl, 
        new CaptureSessionListener(), null); 
     } catch (CameraAccessException e) { 
      e.printStackTrace(); 
     } 

     mIsCameraConfigured = true; 
    } 


    @Override 
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { 
     super.onRequestPermissionsResult(requestCode, permissions, grantResults); 

     switch (requestCode) { 
      case MY_PERMISSIONS_REQUEST_CAMERA: 
       if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED) 
        try { 
         mCameraManager.openCamera(mCameraIDsList[1], mCameraStateCB, new Handler()); 
        } catch (CameraAccessException e) { 
         e.printStackTrace(); 
        } 
       break; 
     } 
    } 

    @Override 
    public void surfaceCreated(SurfaceHolder holder) { 
     mCameraSurface = holder.getSurface(); 
    } 

    @Override 
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { 
     mCameraSurface = holder.getSurface(); 
     mSurfaceCreated = true; 
     mHandler.sendEmptyMessage(MSG_SURFACE_READY); 
    } 

    @Override 
    public void surfaceDestroyed(SurfaceHolder holder) { 
     mSurfaceCreated = false; 
    } 

    private class CaptureSessionListener extends 
      CameraCaptureSession.StateCallback { 
     @Override 
     public void onConfigureFailed(final CameraCaptureSession session) { 
      Log.d(TAG, "CaptureSessionConfigure failed"); 
     } 

     @Override 
     public void onConfigured(final CameraCaptureSession session) { 
      Log.d(TAG, "CaptureSessionConfigure onConfigured"); 
      mCaptureSession = session; 

      try { 
       CaptureRequest.Builder previewRequestBuilder = mCameraDevice 
         .createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW); 
       previewRequestBuilder.addTarget(mCameraSurface); 
       mCaptureSession.setRepeatingRequest(previewRequestBuilder.build(), 
         null, null); 
      } catch (CameraAccessException e) { 
       Log.d(TAG, "setting up preview failed"); 
       e.printStackTrace(); 
      } 
     } 
    } 
} 
+0

Я провешу его в выходные .. спасибо – user2121

+0

@ user2121 Вы решили свою проблему? –

+0

Я еще не протестировал его из-за нехватки времени. Я сообщу, как только я закончил ..thanks – user2121

 Смежные вопросы

  • Нет связанных вопросов^_^