2013-02-28 6 views
7

मैं एंड्रॉइड में कैमरा प्रोजेक्ट काम कर रहा हूं। मेरी समस्या कैमरा है setDisplayOrientation विधि काम नहीं कर रही है और सतह पर मेरा कैमरा पूर्वावलोकन हमेशा परिदृश्य है। मैं SurfaceView पर पोर्ट्रेट कैमरा पूर्वावलोकन की अपेक्षा करना चाहता हूं। मैं सैमसंग आकाशगंगा y (एंड्रॉयड 2.3.5) का उपयोग कर रहा हूँ और मेरी गतिविधि कूट नीचे:एंड्रॉइड कैमरा सेटडिस्प्लेऑरेंटेशन काम नहीं करता

import java.io.IOException; 

import android.app.Activity; 
import android.graphics.PixelFormat; 
import android.hardware.Camera; 
import android.os.Bundle; 
import android.view.SurfaceHolder; 
import android.view.SurfaceView; 
import android.view.View; 
import android.widget.Button; 

public class AndroidCamera extends Activity implements SurfaceHolder.Callback{ 

Camera camera; 
SurfaceView surfaceView; 
SurfaceHolder surfaceHolder; 
boolean previewing = false;; 

String stringPath = "/sdcard/samplevideo.3gp"; 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     Button buttonStartCameraPreview = (Button)findViewById(R.id.startcamerapreview); 
     Button buttonStopCameraPreview = (Button)findViewById(R.id.stopcamerapreview); 

     getWindow().setFormat(PixelFormat.UNKNOWN); 
     surfaceView = (SurfaceView)findViewById(R.id.surfaceview); 
     surfaceHolder = surfaceView.getHolder(); 
     surfaceHolder.addCallback(this); 
     surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 

     buttonStartCameraPreview.setOnClickListener(new Button.OnClickListener(){ 

    @Override 
    public void onClick(View v) { 
    // TODO Auto-generated method stub 
    if(!previewing){ 
    camera = Camera.open(); 
    if (camera != null){ 
     try { 
     camera.setDisplayOrientation(90); 
     camera.setPreviewDisplay(surfaceHolder); 
     camera.startPreview(); 
     previewing = true; 
     } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
     } 
    } 
    } 
    }}); 

     buttonStopCameraPreview.setOnClickListener(new Button.OnClickListener(){ 

    @Override 
    public void onClick(View v) { 
    // TODO Auto-generated method stub 
    if(camera != null && previewing){ 
    camera.stopPreview(); 
    camera.release(); 
    camera = null; 

    previewing = false; 
    } 
    }}); 

    } 



@Override 
public void surfaceChanged(SurfaceHolder holder, int format, int width, 
    int height) { 
    // TODO Auto-generated method stub 

} 

@Override 
public void surfaceCreated(SurfaceHolder holder) { 
    // TODO Auto-generated method stub 

} 

@Override 
public void surfaceDestroyed(SurfaceHolder holder) { 
    // TODO Auto-generated method stub 

} 
} 

मेरी समस्या से पता चला झटका आंकड़ा:

enter image description here

कोई एक किसी भी कोड या ट्यूटोरियल के साथ मदद कर सकते हैं लिंक और खर्च मूल्यवान अपना समय

+0

क्या यह अन्य फोन पर काम कर रहा है ??? या आपने केवल इस के साथ प्रयास किया है ?? – sheetal

+0

@sheetal मैंने केवल इस – Dinesh

उत्तर

4

अंत में मैं समाधान हो गया और कैमरा पूर्वावलोकन सतह दृश्य खोजने कोड निम्नलिखित:

import java.io.IOException; 
import java.util.List; 
import android.app.Activity; 
import android.content.Context; 
import android.content.res.Configuration; 
import android.hardware.Camera; 
import android.os.Build; 
import android.util.Log; 
import android.view.Display; 
import android.view.Surface; 
import android.view.SurfaceHolder; 
import android.view.SurfaceView; 

public class CameraPreview extends SurfaceView implements SurfaceHolder.Callback { 
    private SurfaceHolder mHolder; 
    private Camera mCamera; 

    private static boolean DEBUGGING = true; 
    private static final String LOG_TAG = "CameraPreviewSample"; 
    private static final String CAMERA_PARAM_ORIENTATION = "orientation"; 
    private static final String CAMERA_PARAM_LANDSCAPE = "landscape"; 
    private static final String CAMERA_PARAM_PORTRAIT = "portrait"; 
    protected Activity mActivity; 

    protected List<Camera.Size> mPreviewSizeList; 
    protected List<Camera.Size> mPictureSizeList; 
    protected Camera.Size mPreviewSize; 
    protected Camera.Size mPictureSize; 


    public CameraPreview(Context context, Camera camera) { 
     super(context); 

     mActivity=(Activity)context; 
     mCamera = camera; 

     // Install a SurfaceHolder.Callback so we get notified when the 
     // underlying surface is created and destroyed. 
     mHolder = getHolder(); 
     mHolder.addCallback(this); 
     // deprecated setting, but required on Android versions prior to 3.0 
     mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 


    } 

    public void surfaceCreated(SurfaceHolder holder) { 
     // The Surface has been created, now tell the camera where to draw the preview. 
     try { 
      mCamera.setPreviewDisplay(holder); 
      mCamera.startPreview(); 
     } catch (IOException e) { 
      Log.d("CameraView", "Error setting camera preview: " + e.getMessage()); 
     } 
    } 

    public void surfaceDestroyed(SurfaceHolder holder) { 
     // empty. Take care of releasing the Camera preview in your activity. 
    } 

    public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { 
     // If your preview can change or rotate, take care of those events here. 
     // Make sure to stop the preview before resizing or reformatting it. 

     if (mHolder.getSurface() == null){ 
      // preview surface does not exist 
      return; 
     } 

     // stop preview before making changes 
     try { 
      // mCamera.stopPreview(); 
     } catch (Exception e){ 
      // ignore: tried to stop a non-existent preview 
     } 

     // set preview size and make any resize, rotate or 
     // reformatting changes here 

     // start preview with new settings 
     try { 
      Camera.Parameters cameraParams = mCamera.getParameters(); 
      boolean portrait = isPortrait(); 
      configureCameraParameters(cameraParams, portrait); 

      mCamera.setPreviewDisplay(mHolder); 
      mCamera.startPreview(); 

     } catch (Exception e){ 
      Log.d("CameraView", "Error starting camera preview: " + e.getMessage()); 
     } 
    } 

    public void onPause() { 
     mCamera.release(); 
     mCamera = null; 
    } 


    protected void configureCameraParameters(Camera.Parameters cameraParams, boolean portrait) { 
     if (Build.VERSION.SDK_INT < Build.VERSION_CODES.FROYO) { // for 2.1 and before 
      if (portrait) { 
       cameraParams.set(CAMERA_PARAM_ORIENTATION, CAMERA_PARAM_PORTRAIT); 
      } else { 
       cameraParams.set(CAMERA_PARAM_ORIENTATION, CAMERA_PARAM_LANDSCAPE); 
      } 
     } else { // for 2.2 and later 
      int angle; 
      Display display = mActivity.getWindowManager().getDefaultDisplay(); 
      switch (display.getRotation()) { 
       case Surface.ROTATION_0: // This is display orientation 
        angle = 90; // This is camera orientation 
        break; 
       case Surface.ROTATION_90: 
        angle = 0; 
        break; 
       case Surface.ROTATION_180: 
        angle = 270; 
        break; 
       case Surface.ROTATION_270: 
        angle = 180; 
        break; 
       default: 
        angle = 90; 
        break; 
      } 
      Log.v(LOG_TAG, "angle: " + angle); 
      mCamera.setDisplayOrientation(angle); 
     } 

     cameraParams.setPreviewSize(mPreviewSize.width, mPreviewSize.height); 
     cameraParams.setPictureSize(mPictureSize.width, mPictureSize.height); 
     if (DEBUGGING) { 
      Log.v(LOG_TAG, "Preview Actual Size - w: " + mPreviewSize.width + ", h: " + mPreviewSize.height); 
      Log.v(LOG_TAG, "Picture Actual Size - w: " + mPictureSize.width + ", h: " + mPictureSize.height); 
     } 

     mCamera.setParameters(cameraParams); 
    } 


    public boolean isPortrait() { 
     return (mActivity.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT); 
    } 
} 

यह न्यूनतम एसडीके 2.3 या उसके बाद

+2

setpreviewsize विधि में mPreviewSize.width पर इसकी फेंक शून्य त्रुटि त्रुटि .. – Riser

+0

शून्य सूचक त्रुटि। – hybrid

2

यदि आप पूर्वावलोकन उत्पादन को घुमाने के लिए चाहते हैं, यह कोशिश के लिए धन्यवाद:

public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) 
    {    
     if (isPreviewRunning) 
     { 
      mCamera.stopPreview(); 
     } 

     Parameters parameters = mCamera.getParameters(); 
     Display display = ((WindowManager)getSystemService(WINDOW_SERVICE)).getDefaultDisplay(); 

     if(display.getRotation() == Surface.ROTATION_0) 
     { 
      parameters.setPreviewSize(height, width);       
      mCamera.setDisplayOrientation(90); 
     } 

     if(display.getRotation() == Surface.ROTATION_90) 
     { 
      parameters.setPreviewSize(width, height);       
     } 

     if(display.getRotation() == Surface.ROTATION_180) 
     { 
      parameters.setPreviewSize(height, width);    
     } 

     if(display.getRotation() == Surface.ROTATION_270) 
     { 
      parameters.setPreviewSize(width, height); 
      mCamera.setDisplayOrientation(180); 
     } 

     mCamera.setParameters(parameters); 
     previewCamera();      
    } 
+0

के साथ प्रयास किया है, इस कोड में मैंने पहले ही यह कोशिश नहीं की है कि यह काम नहीं कर रहा है :( – Dinesh

0

निम्नतर API स्तरों के लिए आप इस्तेमाल कर सकते हैं:

private void setCameraDisplayOrientationAPI8(){ 
     //Sets the camera right Orientation. 
     //Special void for API 8 build. 
     //This void should be called before calling camera.setParameters(cameraParameters). 
     if (activeActivity.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) 
     { 
      camera.setDisplayOrientation(90); 
     } 
     if (activeActivity.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) 
     {        
      camera.setDisplayOrientation(180); 
     } 
    } 

और सिर्फ अपने surfaceChanged समारोह पर setCameraDisplayOrientationAPI8(); कहते हैं।

प्लस:

private void setCameraDisplayOrientation() { 
     //Sets the camera right Orientation. 
     //IMPORTANT!! This code is available only for API Level 9 build or greater. 
     if (mApiLvl<9){ 
      Log.d(TAG, "setCameraDisplayOrientation ERROR: This code is available only for API Level 9 build or greater."); 
      return; 
     } 
     android.hardware.Camera.CameraInfo info = 
       new android.hardware.Camera.CameraInfo(); 
     android.hardware.Camera.getCameraInfo(cameraIndex, info); 
     int rotation = activeActivity.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); 
    } 

आशा है कि यह मदद करता है।

1
इसके अलावा

की जरूरत है, तो देखें कि "स्क्रीन स्वत: घुमाएं" विकल्प है फोन सेटिंग्स में चेक किया गया (सेटिंग्स> डिस्ले या स्क्रीन - एंड्रॉइड संस्करण पर निर्भर करता है)।

मुझे यह समझने तक काफी समय लगा। यदि यह चेक नहीं किया गया है, तो ऐप में कैमरे का अभिविन्यास अनदेखा किया जा सकता है।

संबंधित मुद्दे