2011-11-24 28 views
3

这个摄像机程序显示水平预览,而我们正在看垂直像它显示90'angle,也没有存储到我的SD卡..任何身体帮助我如何改变我的表面角度,以及它将如何变成SD卡?我的相机预览它显示错误的显示,我需要存储此卡入SD卡如何?

1.my预览类:

import java.io.FileNotFoundException; 
import java.io.FileOutputStream; 
import java.io.IOException; 

import android.content.Context; 
import android.graphics.Canvas; 
import android.graphics.Color; 
import android.graphics.Paint; 
import android.hardware.Camera; 
import android.hardware.Camera.PreviewCallback; 
import android.util.Log; 
import android.view.SurfaceHolder; 
import android.view.SurfaceView; 
class Preview extends SurfaceView implements SurfaceHolder.Callback { 
    private static final String TAG = "Preview"; 
    SurfaceHolder mHolder; 
    public Camera camera; 
    Preview(Context context) { 
     super(context); 
     mHolder = getHolder(); 
     mHolder.addCallback(this); 
     mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
    } 

    public void surfaceCreated(SurfaceHolder holder) { 
     camera = Camera.open(); 
     try { 
      camera.setPreviewDisplay(holder); 


      camera.setPreviewCallback(new PreviewCallback() { 

       public void onPreviewFrame(byte[] data, Camera arg1) { 
        FileOutputStream outStream = null; 
        try { 
         outStream = new FileOutputStream(String.format("/sdcard/%d.jpg", System.currentTimeMillis())); 
         outStream.write(data); 
         outStream.close(); 
         Log.d(TAG, "onPreviewFrame - wrote bytes: " + data.length); 
        } catch (FileNotFoundException e) { 
         e.printStackTrace(); 
        } catch (IOException e) { 
         e.printStackTrace(); 
        } finally { 
        } 
         Preview.this.invalidate(); 
       } 
      }); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

    public void surfaceDestroyed(SurfaceHolder holder) { 
     camera.stopPreview(); 
     camera = null; 
    } 
     Camera.Parameters parameters = camera.getParameters(); 
     parameters.setPreviewSize(w, h); 
     camera.setParameters(parameters); 
     camera.startPreview(); 
    } 

    @Override 
    public void draw(Canvas canvas) { 
      super.draw(canvas); 
      Paint p= new Paint(Color.RED); 
      Log.d(TAG,"draw"); 
      canvas.drawText("PREVIEW", canvas.getWidth()/2, canvas.getHeight()/2, p); 
    } 
} 

2.MYCameraDemo类

import java.io.FileNotFoundException; 
import java.io.FileOutputStream; 
import java.io.IOException; 

import android.app.Activity; 
import android.hardware.Camera; 
import android.hardware.Camera.PictureCallback; 
import android.hardware.Camera.ShutterCallback; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.FrameLayout; 
public class CameraDemo extends Activity { 
    private static final String TAG = "CameraDemo"; 
    Camera camera; 
    Preview preview; 
    Button buttonClick; 

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

     preview = new Preview(this); 
     ((FrameLayout) findViewById(R.id.preview)).addView(preview); 

     buttonClick = (Button) findViewById(R.id.buttonClick); 
     buttonClick.setOnClickListener(new OnClickListener() { 
      public void onClick(View v) { 
       preview.camera.takePicture(shutterCallback, rawCallback, jpegCallback); 
      } 
     }); 

     Log.d(TAG, "onCreate'd"); 
    } 
    ShutterCallback shutterCallback = new ShutterCallback() { 
     public void onShutter() { 
      Log.d(TAG, "onShutter'd"); 
     } 
    }; 

    /** Handles data for raw picture */ 
    PictureCallback rawCallback = new PictureCallback() { 
     public void onPictureTaken(byte[] data, Camera camera) { 
      Log.d(TAG, "onPictureTaken - raw"); 
     } 
    }; 

    PictureCallback jpegCallback = new PictureCallback() { 
     public void onPictureTaken(byte[] data, Camera camera) { 
      FileOutputStream outStream = null; 
      try { 
         outStream = CameraDemo.this.openFileOutput(String.format("%d.jpg", System.currentTimeMillis()), 0); 

       outStream = new FileOutputStream(String.format("/sdcard/%d.jpg", System.currentTimeMillis())); 
       outStream.write(data); 
       outStream.close(); 
       Log.d(TAG, "onPictureTaken - wrote bytes: " + data.length); 
      } catch (FileNotFoundException e) { 
       e.printStackTrace(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } finally { 
      } 
      Log.d(TAG, "onPictureTaken - jpeg"); 
     } 
    }; 
} 
+0

在终于......你是什么做.....我也面临同样的问题.....? – Kalpesh

回答

1

也许这个链接可以帮助你。

http://adblogcat.com/a-camera-preview-with-a-bounding-box-like-google-goggles/

这里是onSurfaceChange方法,其设置右边取向

public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { 
    //Log.i(TAG, "Preview: surfaceChanged() - size now " + w + "x" + h); 
    // Now that the size is known, set up the camera parameters and begin 
    // the preview. 
    try { 
     mParameters = mCamera.getParameters(); 
     mParameters.set("orientation","landscape"); 
     for (Integer i : mParameters.getSupportedPreviewFormats()) { 
      //Log.i(TAG, "supported preview format: " + i); 
     } 

     List<Size> sizes = mParameters.getSupportedPreviewSizes(); 
     for (Size size : sizes) { 
      //Log.i(TAG, "supported preview size: " + size.width + "x" + size.height); 
     } 
     mCamera.setParameters(mParameters); // apply the changes 
    } catch (Exception e) { 
     // older phone - doesn't support these calls 
    } 

    //updateBufferSize(); // then use them to calculate 

    Size p = mCamera.getParameters().getPreviewSize(); 
    //Log.i(TAG, "Preview: checking it was set: " + p.width + "x" + p.height); // DEBUG 
    mCamera.startPreview(); 
} 

public Parameters getCameraParameters(){ 
    return mCamera.getParameters(); 
} 

的制品设置参数为横向。我看到你的代码中没有这个。

另外,保存图像我看到了两种方法:

private boolean savePhoto(Bitmap bm) { 
FileOutputStream image = null; 
try { 
    image = new FileOutputStream(mLocation); 
} catch (FileNotFoundException e) { 
    e.printStackTrace(); 
} 
bm.compress(CompressFormat.JPEG, 100, image); 
if (bm != null) { 
    int h = bm.getHeight(); 
    int w = bm.getWidth(); 
    //Log.i(TAG, "savePhoto(): Bitmap WxH is " + w + "x" + h); 
} else { 
    //Log.i(TAG, "savePhoto(): Bitmap is null.."); 
    return false; 
} 
return true; 

}

public Bitmap getPic(int x, int y, int width, int height) { 
System.gc(); 
Bitmap b = null; 
Size s = mParameters.getPreviewSize(); 

YuvImage yuvimage = new YuvImage(mBuffer, ImageFormat.NV21, s.width, s.height, null); 
ByteArrayOutputStream outStream = new ByteArrayOutputStream(); 
yuvimage.compressToJpeg(new Rect(x, y, width, height), 100, outStream); // make JPG 
b = BitmapFactory.decodeByteArray(outStream.toByteArray(), 0, outStream.size()); 
if (b != null) { 
    //Log.i(TAG, "getPic() WxH:" + b.getWidth() + "x" + b.getHeight()); 
} else { 
    //Log.i(TAG, "getPic(): Bitmap is null.."); 
} 
yuvimage = null; 
outStream = null; 
System.gc(); 
return b; 

}

而你需要使用Android 2.2

相关问题