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<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 确实有点大,不过是高清图片

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

以上是 android实现简单拍照功能 的全部内容, 来源链接: utcz.com/p/240736.html

回到顶部