拍照可以调用系统的相机进行拍照,拍完保存到相应的SD卡目录。最近要用到拍照这个功能,首先试了下调用相机拍照,保存到相应目录,然后用imageview显示的时候感觉,很模糊。可能是图片被压缩的太狠了。所以自己使用Camera写了一个拍照的功能,拍出来的还挺清晰的,不过文件有点大一张图片差不多1.7M。如果想拍高清图可以使用下面的代码。
代码很简单,我就不做过多解释了。
- package com.example.testsimple;
- import java.io.File;
- import java.io.FileOutputStream;
- import java.io.IOException;
- import java.util.Date;
- import android.os.AsyncTask;
- import android.os.Bundle;
- import android.os.Environment;
- import android.app.Activity;
- import android.content.Intent;
- import android.graphics.Bitmap;
- import android.graphics.BitmapFactory;
- import android.graphics.PixelFormat;
- import android.hardware.Camera;
- import android.text.format.DateFormat;
- import android.util.Log;
- import android.view.KeyEvent;
- import android.view.Menu;
- import android.view.SurfaceHolder;
- import android.view.SurfaceView;
- import android.view.View;
- import android.view.View.OnClickListener;
- import android.widget.Button;
- import android.widget.ImageView;
- public class MainActivity extends Activity {
- private SurfaceView surfaceView;
- private SurfaceHolder surfaceHolder;
- private Camera camera;
- private File picture;
- private Button btnSave;
- private final static String TAG = "CameraActivity";
- private ImageView open_picIcon;
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- /* Intent intent=new Intent(MainActivity.this,MyCameraActivity.class);
- startActivity(intent);
- finish();*/
- setupViews();
- }
- private void setupViews(){
- surfaceView = (SurfaceView) findViewById(R.id.camera_preview); // Camera interface to instantiate components
- surfaceHolder = surfaceView.getHolder(); // Camera interface to instantiate components
- surfaceHolder.addCallback(surfaceCallback); // Add a callback for the SurfaceHolder
- surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
- btnSave = (Button) findViewById(R.id.save_pic);
- open_picIcon=(ImageView) findViewById(R.id.open_picIcon);
- btnSave.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- surfaceView.setVisibility(View.VISIBLE);
- open_picIcon.setVisibility(View.GONE);
- takePic();
- }
- });
- }
- @Override
- public boolean onKeyDown(int keyCode, KeyEvent event) {
- if (keyCode == KeyEvent.KEYCODE_CAMERA
- || keyCode == KeyEvent.KEYCODE_SEARCH) {
- takePic();
- return true;
- }
- return super.onKeyDown(keyCode, event);
- }
- private void takePic() {
- camera.stopPreview();// stop the preview
- camera.takePicture(null, null, pictureCallback); // picture
- }
- // Photo call back
- Camera.PictureCallback pictureCallback = new Camera.PictureCallback() {
- //@Override
- public void onPictureTaken(byte[] data, Camera camera) {
- new SavePictureTask().execute(data);
- camera.startPreview();
- }
- };
- // save pic
- class SavePictureTask extends AsyncTask<byte[], String, String> {
- @Override
- protected String doInBackground(byte[]... params) {
- String fname = DateFormat.format("yyyyMMddhhmmss", new Date()).toString()+".jpg";
- Log.i(TAG, "fname="+fname+";dir="+Environment.getExternalStorageDirectory());
- //picture = new File(Environment.getExternalStorageDirectory(),fname);// create file
- picture = new File(Environment.getExternalStorageDirectory()+"/images/"+fname);
- File file= picture.getParentFile();
- if(!file.exists())
- file.mkdir();
- try {
- FileOutputStream fos = new FileOutputStream(picture.getPath()); // Get file output stream
- fos.write(params[0]); // Written to the file
- fos.close();
- } catch (Exception e) {
- e.printStackTrace();
- }
- return null;
- }
- @Override
- protected void onPostExecute(String result) {
- // TODO Auto-generated method stub
- super.onPostExecute(result);
- Bitmap bitmap=getDiskBitmap(picture.getPath());
- surfaceView.setVisibility(View.GONE);
- open_picIcon.setVisibility(View.VISIBLE);
- open_picIcon.setImageBitmap(bitmap);
- }
- }
- private Bitmap getDiskBitmap(String pathString)
- {
- Bitmap bitmap = null;
- try
- {
- File file = new File(pathString);
- if(file.exists())
- {
- bitmap = BitmapFactory.decodeFile(pathString);
- }
- } catch (Exception e)
- {
- // TODO: handle exception
- }
- return bitmap;
- }
- // SurfaceHodler Callback handle to open the camera, off camera and photo size changes
- SurfaceHolder.Callback surfaceCallback = new SurfaceHolder.Callback() {
- public void surfaceCreated(SurfaceHolder holder) {
- Log.i(TAG, "surfaceCallback====");
- camera = Camera.open(); // Turn on the camera
- try {
- camera.setPreviewDisplay(holder); // Set Preview
- } catch (IOException e) {
- camera.release();// release camera
- camera = null;
- }
- }
- public void surfaceChanged(SurfaceHolder holder, int format, int width,
- int height) {
- Log.i(TAG,"====surfaceChanged");
- Camera.Parameters parameters = camera.getParameters(); // Camera parameters to obtain
- parameters.setPictureFormat(PixelFormat.JPEG);// Setting Picture Format
- // parameters.set("rotation", 180); // Arbitrary rotation
- camera.setDisplayOrientation(0);
- parameters.setPreviewSize(400, 300); // Set Photo Size
- camera.setParameters(parameters); // Setting camera parameters
- camera.startPreview(); // Start Preview
- }
- public void surfaceDestroyed(SurfaceHolder holder) {
- Log.i(TAG,"====surfaceDestroyed");
- camera.stopPreview();// stop preview
- camera.release(); // Release camera resources
- camera = null;
- }
- };
- }
拍完以后自动保存到SD卡中的images目录下
下面是图片存放路径
1.8M 确实有点大,不过是高清图片 ,哈哈。