android拍照

            拍照可以调用系统的相机进行拍照,拍完保存到相应的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 {  
        @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 确实有点大,不过是高清图片 ,哈哈。

你可能感兴趣的:(android开发)