首页 > 系统 > Android > 正文

android实现简单拍照功能

2019-10-21 21:48:57
字体:
来源:转载
供稿:网友

拍照可以调用系统的相机进行拍照,拍完保存到相应的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目录下 

android,拍照

下面是图片存放路径

android,拍照

1.8M 确实有点大,不过是高清图片

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


注:相关教程知识阅读请移步到Android开发频道。
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表