2016-10-06 3 views
11

Ich versuche, die Kamera-Hardware auf einem SurfaceView zu öffnen. Im Layout habe ich ein SurfaceView erstellt und ich öffne die Kamera wie im folgenden Code gezeigt. Wenn ich den Code ausführe, erscheint der Toast in der CameraAvailableCB und sagt "onCameraAvailable", aber auf der SurfaceView wird nichts angezeigt.Wie zeigt man die Kameravorschau auf einem SurfaceView?

Wie zeige ich das Kamera-Display auf dem SurfaceView an?

-Code

@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

Also „onOpened“ Toast erscheint nicht auch? –

+0

@AlexCohn einige Male scheint es – user2121

Antwort

17

Vorschau von der Kamera zeigen Camera2 API verwenden, sollten Sie die folgenden Schritte ausführen:

  1. Get Erlaubnis Kameravorrichtung
  2. Mit CameraManager offener Verbindung zu einem verwenden Kamera
  3. Haben Oberfläche für die Vorschau vorbereitet
  4. Mit geöffneter Kameravorrichtung und die gewünschten Oberflächen (es kann nicht nur Vorschau Oberfläche enthält) erstellen CaptureSession
  5. Nach CaptureSession erstellt Sie erstellen müssen und konfigurieren CaptureRequest und legen ihn CaptureSession

, dass die Vorbereitung Oberflächen zu bemerken, benötigen und die Verbindung zur Kamera zu öffnen sind unabhängige Prozesse. Sie müssen also sicher sein, dass beide vor dem Erstellen von CaptureSession abgeschlossen sind.

Hier ist das Beispiel der Aktivität Kamera-Vorschau auf dem Bildschirm angezeigt werden:

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

ich werde es am Wochenende..thanks – user2121

+0

@ user2121 haben Sie Ihr Problem lösen? –

+0

ich habe es noch nicht aus Zeitmangel getestet .. ich werde informieren, sobald ich fertig bin .. danke – user2121

Verwandte Themen