2012-12-15 6 views
0

이제는 카메라 앱을 개발하고 있습니다. 내 요구 사항은 내 앱을 처음 열면 표면 뷰가 표시되고 한 버튼 만 누르면 전면 카메라 표면으로 전환됩니다. 보기 및 단추를 두 번째로 다시 누르면이 코드를 작성하기 위해 다시 카메라로 전환됩니다.안드로이드에서 앞 카메라 미리보기를 여는 방법?

 import android.app.Activity; 
     import android.app.AlertDialog; 
     import android.content.Context; 
     import android.hardware.Camera; 
     import android.hardware.Camera.CameraInfo; 
     import android.hardware.Camera.Size; 
     import android.os.Bundle; 
     import android.util.Log; 
     import android.view.Menu; 
     import android.view.MenuInflater; 
     import android.view.MenuItem; 
     import android.view.SurfaceHolder; 
     import android.view.SurfaceView; 
     import android.view.View; 
     import android.view.ViewGroup; 
     import android.view.Window; 
     import android.view.WindowManager; 

     import java.io.IOException; 
     import java.util.List; 

     import com.example.R; 

     public class MainActivity extends Activity { 
      private Preview mPreview; 
       Camera mCamera; 
       int numberOfCameras; 
       int cameraCurrentlyLocked; 

       // The first rear facing camera 
       int defaultCameraId; 

      protected void onCreate(Bundle savedInstanceState) 
       { 
       super.onCreate(savedInstanceState); 
       // Hide the window title. 
       requestWindowFeature(Window.FEATURE_NO_TITLE); 
       getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); 

       // Create a RelativeLayout container that will hold a SurfaceView, 
       // and set it as the content of our activity. 
       mPreview = new Preview(this); 
       setContentView(mPreview); 

       // Find the total number of cameras available 
       numberOfCameras = Camera.getNumberOfCameras(); 

       // Find the ID of the default camera 
       CameraInfo cameraInfo = new CameraInfo(); 
        for (int i = 0; i < numberOfCameras; i++) 
        { 
         Camera.getCameraInfo(i, cameraInfo); 
         if (cameraInfo.facing == CameraInfo.CAMERA_FACING_BACK) 
         { 
          defaultCameraId = i; 
         } 
        } 
      } 

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

       // Open the default i.e. the first rear facing camera. 
       mCamera = Camera.open(); 
       cameraCurrentlyLocked = defaultCameraId; 
       mPreview.setCamera(mCamera); 
      } 

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

       // Because the Camera object is a shared resource, it's very 
       // important to release it when the activity is paused. 
       if (mCamera != null) { 
        mPreview.setCamera(null); 
        mCamera.release(); 
        mCamera = null; 
       } 
      } 

      @Override 
      public boolean onCreateOptionsMenu(Menu menu) { 

       // Inflate our menu which can gather user input for switching camera 
       MenuInflater inflater = getMenuInflater(); 
       inflater.inflate(R.menu.camera_menu, menu); 
       return true; 
      } 

      @Override 
      public boolean onOptionsItemSelected(MenuItem item) { 
       // Handle item selection 
       switch (item.getItemId()) { 
       case R.id.switch_cam: 
        // check for availability of multiple cameras 
        if (numberOfCameras == 1) { 
         AlertDialog.Builder builder = new AlertDialog.Builder(this); 
         builder.setMessage("camera_alert") 
           .setNeutralButton("Close", null); 
         AlertDialog alert = builder.create(); 
         alert.show(); 
         return true; 
        } 

        // OK, we have multiple cameras. 
        // Release this camera -> cameraCurrentlyLocked 
        if (mCamera != null) { 
         mCamera.stopPreview(); 
         mPreview.setCamera(null); 
         mCamera.release(); 
         mCamera = null; 
        } 

        // Acquire the next camera and request Preview to reconfigure 
        // parameters. 
        mCamera = Camera 
          .open((cameraCurrentlyLocked + 1) % numberOfCameras); 
        cameraCurrentlyLocked = (cameraCurrentlyLocked + 1) 
          % numberOfCameras; 
        mPreview.switchCamera(mCamera); 

        // Start the preview 
        mCamera.startPreview(); 
        return true; 
       default: 
        return super.onOptionsItemSelected(item); 
       } 
      } 

      class Preview extends ViewGroup implements SurfaceHolder.Callback { 
       private final String TAG = "Preview"; 

       SurfaceView mSurfaceView; 
       SurfaceHolder mHolder; 
       Size mPreviewSize; 
       List<Size> mSupportedPreviewSizes; 
       Camera mCamera; 

       Preview(Context context) { 
        super(context); 

        mSurfaceView = new SurfaceView(context); 
        addView(mSurfaceView); 

        // Install a SurfaceHolder.Callback so we get notified when the 
        // underlying surface is created and destroyed. 
        mHolder = mSurfaceView.getHolder(); 
        mHolder.addCallback(this); 
        mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
       } 

       public void setCamera(Camera camera) { 
        mCamera = camera; 
        if (mCamera != null) { 
         mSupportedPreviewSizes = mCamera.getParameters().getSupportedPreviewSizes(); 
         requestLayout(); 
        } 
       } 

       public void switchCamera(Camera camera) { 
        setCamera(camera); 
        try { 
         camera.setPreviewDisplay(mHolder); 
        } catch (IOException exception) { 
         Log.e(TAG, "IOException caused by setPreviewDisplay()", exception); 
        } 
        Camera.Parameters parameters = camera.getParameters(); 
        parameters.setPreviewSize(mPreviewSize.width, mPreviewSize.height); 
        requestLayout(); 

        camera.setParameters(parameters); 
       } 

       @Override 
       protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
        // We purposely disregard child measurements because act as a 
        // wrapper to a SurfaceView that centers the camera preview instead 
        // of stretching it. 
        final int width = resolveSize(getSuggestedMinimumWidth(), widthMeasureSpec); 
        final int height = resolveSize(getSuggestedMinimumHeight(), heightMeasureSpec); 
        setMeasuredDimension(width, height); 

        if (mSupportedPreviewSizes != null) { 
         mPreviewSize = getOptimalPreviewSize(mSupportedPreviewSizes, width, height); 
        } 
       } 

       @Override 
       protected void onLayout(boolean changed, int l, int t, int r, int b) { 
        if (changed && getChildCount() > 0) { 
         final View child = getChildAt(0); 

         final int width = r - l; 
         final int height = b - t; 

         int previewWidth = width; 
         int previewHeight = height; 
         if (mPreviewSize != null) { 
          previewWidth = mPreviewSize.width; 
          previewHeight = mPreviewSize.height; 
         } 

         // Center the child SurfaceView within the parent. 
         if (width * previewHeight > height * previewWidth) { 
          final int scaledChildWidth = previewWidth * height/previewHeight; 
          child.layout((width - scaledChildWidth)/2, 0, 
            (width + scaledChildWidth)/2, height); 
         } else { 
          final int scaledChildHeight = previewHeight * width/previewWidth; 
          child.layout(0, (height - scaledChildHeight)/2, 
            width, (height + scaledChildHeight)/2); 
         } 
        } 
       } 

       public void surfaceCreated(SurfaceHolder holder) { 
        // The Surface has been created, acquire the camera and tell it where 
        // to draw. 
        try { 
         if (mCamera != null) { 
          mCamera.setPreviewDisplay(holder); 
         } 
        } catch (IOException exception) { 
         Log.e(TAG, "IOException caused by setPreviewDisplay()", exception); 
        } 
       } 

       public void surfaceDestroyed(SurfaceHolder holder) { 
        // Surface will be destroyed when we return, so stop the preview. 
        if (mCamera != null) { 
         mCamera.stopPreview(); 
        } 
       } 


       private Size getOptimalPreviewSize(List<Size> sizes, int w, int h) { 
        final double ASPECT_TOLERANCE = 0.1; 
        double targetRatio = (double) w/h; 
        if (sizes == null) return null; 

        Size optimalSize = null; 
        double minDiff = Double.MAX_VALUE; 

        int targetHeight = h; 

        // Try to find an size match aspect ratio and size 
        for (Size size : sizes) { 
         double ratio = (double) size.width/size.height; 
         if (Math.abs(ratio - targetRatio) > ASPECT_TOLERANCE) continue; 
         if (Math.abs(size.height - targetHeight) < minDiff) { 
          optimalSize = size; 
          minDiff = Math.abs(size.height - targetHeight); 
         } 
        } 

        // Cannot find the one match the aspect ratio, ignore the requirement 
        if (optimalSize == null) { 
         minDiff = Double.MAX_VALUE; 
         for (Size size : sizes) { 
          if (Math.abs(size.height - targetHeight) < minDiff) { 
           optimalSize = size; 
           minDiff = Math.abs(size.height - targetHeight); 
          } 
         } 
        } 
        return optimalSize; 
       } 

       public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { 
        // Now that the size is known, set up the camera parameters and begin 
        // the preview. 
        Camera.Parameters parameters = mCamera.getParameters(); 
        parameters.setPreviewSize(mPreviewSize.width, mPreviewSize.height); 
        requestLayout(); 

        mCamera.setParameters(parameters); 
        mCamera.startPreview(); 
       } 

      } 
     } 

     and my menu.xml 
     <?xml version="1.0" encoding="utf-8"?> 
     <menu xmlns:android="http://schemas.android.com/apk/res/android"> 
      <item android:id="@+id/switch_cam" 
        android:title="@string/switch_cam" /> 
     </menu> 

     when i write this code i get error 

     menu cannot be resolved or is not a field and 
     switch_cam cannot be resolved or is not a field 
     pleae help me 
+0

문제는 무엇입니까? 그것은 추락합니까? 오류가 있습니까? –

답변

0
if(valueofcam.equalsIgnoreCase("front")){ 
      // Find the ID of the default camera 
      CameraInfo cameraInfo = new CameraInfo(); 
       for (int i = 0; i < numberOfCameras; i++) { 
        Camera.getCameraInfo(i, cameraInfo); 
        if (cameraInfo.facing == CameraInfo.CAMERA_FACING_FRONT) { 
         defaultCameraId = i; 
//      Toast.makeText(getApplicationContext(), "front", Toast.LENGTH_LONG).show(); 
        } 
        else if (cameraInfo.facing == CameraInfo.CAMERA_FACING_BACK) { 
         defaultCameraId = i; 
//      Toast.makeText(getApplicationContext(), ""+defaultCameraId, Toast.LENGTH_LONG).show(); 
        } 
       } 
    } 

    camera = Camera.open(defaultCameraId); 
+0

예 89 라인 번호 inflater.inflate (R.menu.camera_menu, menu)에서 컴파일 타임 오류가 발생하고 97 번 라인도 해석 할 수 없거나 필드가 아님 –

+0

스위치에 대한 의견이 있으면 주어진 응답을 주셔서 감사합니다 전면 및 후면 카메라를 도와주세요 –

+0

전면 또는 후면 카메라와 값을 비교하고 후면 카메라의 id = 0 및 전면 카메라의 1을 선택하는 사용자로부터 가치를 얻으십시오 – appukrb

관련 문제