2017-03-01 32 views
1

我正在開發一個android應用程序,我需要捕獲兩張圖片,一張帶前置攝像頭和另一張來自後置攝像頭。如何捕獲一個按鈕上的兩個圖片點擊 - 一個與正面和一個背面相機

下面給出了我用於此目的的代碼,當我僅用前置或後置攝像頭拍攝一張圖片時,此代碼工作正常,但當我拍攝兩張圖片(一個接一個)時,我得到java.lang.RuntimeException: Fail to connect to camera servicecamera = Camera.open(camIdx);呼叫。

我一直在尋找這個問題的解決方案,因爲兩天,但沒有解決它。在第一張照片被捕獲後,我再次檢查到release()camera,以便使相機免費爲第二張照片,但沒有任何工作。

我正在使用具有Android KitKat版本(API級別19)的測試的物理設備。

那麼請告訴我的代碼是什麼問題?還是有任何替代方法來完成我的工作?

代碼:

package com.example.appdeveloper.appname; 

import android.content.Context; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.graphics.Matrix; 
import android.hardware.Camera; 
import android.os.Environment; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.view.SurfaceView; 
import android.view.View; 
import android.widget.Button; 
import java.io.File; 
import java.io.FileOutputStream; 


public class MainActivity extends AppCompatActivity implements View.OnClickListener { 

    static Camera camera = null; 
    static int pic_number = 0; 

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

     Button b = (Button)findViewById(R.id.button); 
     b.setOnClickListener(this); 
    } 

    @Override 
    public void onClick(View v) { 
     takeSnapShots(this,Camera.CameraInfo.CAMERA_FACING_FRONT); 
     takeSnapShots(this,Camera.CameraInfo.CAMERA_FACING_BACK); 
    } 


    private void takeSnapShots(Context context, int face) { 

     SurfaceView surface = new SurfaceView(context); 
     Camera.CameraInfo cameraInfo = new Camera.CameraInfo(); 
     int cameraCount = Camera.getNumberOfCameras(); 

     for (int camIdx = 0; camIdx < cameraCount; camIdx++) { 
      Camera.getCameraInfo(camIdx, cameraInfo); 
      if (cameraInfo.facing == face) { 
       camera = Camera.open(camIdx); 
      } 
     } 

     try { 
      camera.setPreviewDisplay(surface.getHolder()); 
     } 
     catch (Exception e) { 
      e.printStackTrace(); 
     } 

     camera.startPreview(); 
     camera.takePicture(null,null,jpegCallback); 
    } 




    private static Camera.PictureCallback jpegCallback = new Camera.PictureCallback() { 

     public void onPictureTaken(byte[] data, Camera camera1) { 
      String path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES)+ File.separator+"picure"+(++pic_number)+".jpg"; 
      File pictureFile = new File(path); 

      if (pictureFile.exists()) 
       pictureFile.delete(); 

      try { 
       FileOutputStream outputStream = new FileOutputStream(pictureFile); 
       Bitmap realImage = BitmapFactory.decodeByteArray(data, 0, data.length); 
       Matrix mtx = new Matrix(); 
       mtx.setRotate(90); 
       realImage = Bitmap.createBitmap(realImage, 0, 0, realImage.getWidth(), realImage.getHeight(), mtx, true); 
       realImage.compress(Bitmap.CompressFormat.JPEG, 100, outputStream); 
       outputStream.close(); 
      } 
      catch (Exception e) { 
       e.printStackTrace(); 
      } 
      finally { 
       camera.stopPreview(); 
       camera.release(); 
       camera = null; 
      } 
     } 
    }; 




} 
+0

嘗試添加兩個表面 一般儘量做2次。定義相機對象的2個實例和2個表面視圖,依此類推。 –

+0

@EliasFazel我已經試過了。 – Salu

回答

0

你的問題可能是試圖打開第二相機不釋放第一。您在循環中呼叫Camera.open,而不先釋放。正確的流程是打開所需的相機,拍攝照片,確保相機已被釋放,然後打開另一相機。

+0

我已經放棄了相機。請看我的代碼。 – Salu

+0

請再次閱讀我的答案。我看到你發佈它的地方 - 但你試圖在一個循環中打開兩個攝像機,而不會釋放。只有拍攝照片後才能發佈。 – yakobom

相關問題