2013-05-27 20 views
31

SwitchCamera adında bir yöntemim var, tek bir geçişte bir düğmenin tıklanmasıyla kamerayı önden arkaya değiştirmeye çalışıyorum. Bu yöntemi çağırdığımda başvurum donuyor - Doğru bir şey yapmadığımı biliyorum. Bana yardım eden var mı?Android: Tuşa basıldığında kamerayı değiştir

Herhangi bir yardım çok takdir edilmektedir.

public void switchCamera(){ 
    int camNum = 0; 
    camNum = Camera.getNumberOfCameras(); 
    int camBackId = Camera.CameraInfo.CAMERA_FACING_BACK; 
    int camFrontId = Camera.CameraInfo.CAMERA_FACING_FRONT; 

    Camera.CameraInfo currentCamInfo = new Camera.CameraInfo(); 

    //if camera is running 
    if (camera != null){ 
     //and there is more than one camera 
     if (camNum > 1){ 
      //stop current camera 
      camera.stopPreview(); 
      camera.setPreviewCallback(null); 
      //camera.takePicture(null, null, PictureCallback); 
      camera.release(); 
      camera = null; 
      //stop surfaceHolder? 

      if (currentCamInfo.facing == Camera.CameraInfo.CAMERA_FACING_FRONT){ 
       //switch camera to back camera 
       camera=Camera.open(camBackId); 
      } 
      else{ 
       //switch camera to front camera 
       camera=Camera.open(camFrontId); 
      } 
      //switch camera back on 
      //specify surface? 
      try { 
       camera.setPreviewDisplay(surfaceHolder); 
       camera.setPreviewCallback((PreviewCallback) this); 
       camera.startPreview(); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 
    } 
} 
+1

oluşturmanız gerekir, önceki kameranın SurfacePreview yok etmeliyiz. com/questions/6599454/switch-back-front-camera-on-fly – Ben

+1

Dondurmadan önce bazı günlükleri logcat'a yapıştırabilir misiniz? – StarPinkER

cevap

59
Button otherCamera = (Button) findViewById(R.id.OtherCamera); 

otherCamera.setOnClickListener(new View.OnClickListener() { 
@Override 
public void onClick(View v) { 
if (inPreview) { 
    camera.stopPreview(); 
} 
//NB: if you don't release the current camera before switching, you app will crash 
camera.release(); 

//swap the id of the camera to be used 
if(currentCameraId == Camera.CameraInfo.CAMERA_FACING_BACK){ 
    currentCameraId = Camera.CameraInfo.CAMERA_FACING_FRONT; 
} 
else { 
    currentCameraId = Camera.CameraInfo.CAMERA_FACING_BACK; 
} 
camera = Camera.open(currentCameraId); 

setCameraDisplayOrientation(CameraActivity.this, currentCameraId, camera); 
try { 

    camera.setPreviewDisplay(previewHolder); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 
camera.startPreview(); 
} 

, aşağıdaki kodu kullanabilirsiniz. http: // stackoverflow

public static void setCameraDisplayOrientation(Activity activity, 
     int cameraId, android.hardware.Camera camera) { 
    android.hardware.Camera.CameraInfo info = 
      new android.hardware.Camera.CameraInfo(); 
    android.hardware.Camera.getCameraInfo(cameraId, info); 
    int rotation = activity.getWindowManager().getDefaultDisplay() 
      .getRotation(); 
    int degrees = 0; 
    switch (rotation) { 
     case Surface.ROTATION_0: degrees = 0; break; 
     case Surface.ROTATION_90: degrees = 90; break; 
     case Surface.ROTATION_180: degrees = 180; break; 
     case Surface.ROTATION_270: degrees = 270; break; 
    } 

    int result; 
    if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) { 
     result = (info.orientation + degrees) % 360; 
     result = (360 - result) % 360; // compensate the mirror 
    } else { // back-facing 
     result = (info.orientation - degrees + 360) % 360; 
    } 
    camera.setDisplayOrientation(result); 
} 
+0

yardım yanıtı ama bir soru ... Camera.CameraInfo.CAMERA_FACING_BACK/FRONT API level 9 gerektirir. Eski sürümlerde ne yaparız? – Anonymous

+0

Fotoğraf makinem resmim hala dikey modda döndürülemiyor. Peyzaj modunda, iyi çalışıyor. – AjayR

+0

Brilliant - Bu şık setCameraDisplayOrientation yöntemiyle bana çok zaman kazandırdı! – Ewald

-6

AsyncTask kullanmayı deneyin. Kod, UI iş parçacığını rahatsız etmeden ayrı bir iş parçacığında çalışır. Bu sitede AsyncTask'ın nasıl kullanıldığına dair birkaç örnek vardır. Eğer aynı yönde ekranı kamera görüntüsü gösterisi yapmak istiyorsanız

+3

Üzgünüm, ama bu UI iş parçacığı ile ilgisi yoktu. – shkschneider

3

Önce sonra bu yardımcı olabilir kameranın yeni bir nesne (Arka/Ön)

`//Code to destroy SurfacePreview 
mPreview.surfaceDestroyed(mPreview.getHolder()); 
mPreview.getHolder().removeCallback(mPreview); 
mPreview.destroyDrawingCache(); 
preview.removeView(mPreview); 
mCamera.stopPreview(); 
mCamera.stopPreview(); 
mCamera.setPreviewCallback(null); 
mCamera.release(); 

//Now create new camera object 
if (cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_BACK) { 
    mCamera = Camera.open(camIdx); 
    mPreview = new CameraPreview(CameraActivity.this, mCamera); 
    preview.addView(mPreview); 
    mCamera.setPreviewDisplay(mPreview.getHolder()); 
    mCamera.startPreview(); 
}`