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

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

(0)

相关推荐

  • Android实现拍照、选择图片并裁剪图片功能

    一. 实现拍照.选择图片并裁剪图片效果 按照之前博客的风格,首先看下实现效果. 二. uCrop项目应用 想起之前看到的Yalantis/uCrop效果比较绚,但是研究源码之后发现在定制界面方面还是有一点的限制,于是在它的基础上做了修改Android-Crop,把定制界面独立出来,让用户去自由设置.下图为使用Android-Crop实现的模仿微信选择图片并裁剪Demo. 三. 实现思路 比较简单的选择设备图片裁剪,并将裁剪后的图片保存到指定路径: 调用系统拍照,将拍照图片保存在SD卡,然后裁剪图

  • android图像绘制(六)获取本地图片或拍照图片等图片资源

    从SD卡中获取图片资源,或者拍一张新的图片. 先贴代码 获取图片: 注释:拍照获取的话,可以指定图片的保存地址,在此不说明. 复制代码 代码如下: CharSequence[] items = {"相册", "相机"}; new AlertDialog.Builder(this) .setTitle("选择图片来源") .setItems(items, new OnClickListener() { public void onClick(Dia

  • Android选择图片或拍照图片上传到服务器

    最近要搞一个项目,需要上传相册和拍照的图片,不负所望,终于完成了!  不过需要说明一下,其实网上很多教程拍照的图片,都是缩略图不是很清晰,所以需要在调用照相机的时候,事先生成一个地址,用于标识拍照的图片URI 具体上传代码: 1.选择图片和上传界面,包括上传完成和异常的回调监听 package com.spring.sky.image.upload; import java.util.HashMap; import java.util.Map; import android.app.Activi

  • Android应用中拍照后获取照片路径并上传的实例分享

    Activity 中的代码,我只贴出重要的事件部分代码 public void doPhoto(View view) { destoryBimap(); String state = Environment.getExternalStorageState(); if (state.equals(Environment.MEDIA_MOUNTED)) { Intent intent = new Intent("android.media.action.IMAGE_CAPTURE"); s

  • Android拍照得到全尺寸图片并进行压缩

    废话不多说了,直接给大家贴代码了,具体代码如下所示: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <

  • Android实现从本地图库/相机拍照后裁剪图片并设置头像

    玩qq或者是微信的盆友都知道,这些聊天工具里都要设置头像,一般情况下大家的解决办法是从本地图库选择图片或是从相机拍照,然后根据自己的喜爱截取图片.上述过程已经实现好了,最后一步我加上了把截取好的图片在保存到本地的操作,来保存头像.为了大家需要,下面我们小编把完整的代码贴出来供大家参考. 先给大家展示效果图: 代码部分: 布局代码(其实就是两个按钮和一个ImageView来显示头像) <LinearLayout xmlns:android="http://schemas.android.co

  • Android启动相机拍照并返回图片

    具体实现过程请看下面代码: 简单的调用了一下系统的拍照功能 代码如下所示: //拍照的方法 private void openTakePhoto(){ /** * 在启动拍照之前最好先判断一下sdcard是否可用 */ String state = Environment.getExternalStorageState(); //拿到sdcard是否可用的状态码 if (state.equals(Environment.MEDIA_MOUNTED)){ //如果可用 Intent intent

  • android 拍照和上传的实现代码

    复制代码 代码如下: import java.io.ByteArrayOutputStream;   import java.io.File;   import android.app.Activity;   import android.content.Intent;   import android.graphics.Bitmap;   import android.net.Uri;   import android.os.Bundle;   import android.os.Enviro

  • Android拍照保存在系统相册不显示的问题解决方法

    可能大家都知道我们保存相册到Android手机的时候,然后去打开系统图库找不到我们想要的那张图片,那是因为我们插入的图片还没有更新的缘故,先讲解下插入系统图库的方法吧,很简单,一句代码就能实现 复制代码 代码如下: MediaStore.Images.Media.insertImage(getContentResolver(), mBitmap, "", ""); 通过上面的那句代码就能插入到系统图库,这时候有一个问题,就是我们不能指定插入照片的名字,而是系统给了我

  • Android仿微信发表说说实现拍照、多图上传功能

    本文实例为大家分享了Android仿微信发表说说.心情功能,供大家参考,具体内容如下 既能实现拍照,选图库,多图案上传的案例,目前好多App都有类似微信朋友圈的功能,能过发表说说等附带图片上传.下面的就是实现该功能的过程:大家还没有看过Android Retrofit 2.0框架上传图片解决方案这篇文章,在看今天的就很容易,接在本项目中用到了一个library:photopicker,封装了图片的选择功能,是否选相机,还有选中图片后可以查看图片的功能.  一. 首先:将photopicker到工

随机推荐