Android基础:Camera

调用手机摄像头拍照,并显示+转换成file,保存在本地

逻辑:

activity_main.xml中有1个Button,1个imageView,点击button实现拍照,并显示在imageview中,而且保存在本地。

步骤

  1. 调用手机摄像头拍照
  2. 将数据转换成Bitmap
  3. 将bitmap转换成file

效果图:


知识点:

怎么将Bitmap存放在file中?

public static void saveBitmapToFile(String path, Bitmap bm) {
        File file = new File(path);
        if (!file.exists()) {
            try {
                file.createNewFile();

            } catch (Exception e) {
                e.printStackTrace();
            }
        }

        try {
            FileOutputStream fos = new FileOutputStream(file);
            bm.compress(CompressFormat.JPEG, 100, fos);//压缩格式,压缩比例
            fos.flush();
            fos.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

怎么将byte[]数据转换成file?

通过FileoutputStream(File file)

//  将类型为:byte[]的Bitmap的资源转换成File
    public static void saveFile(String path, byte[] data) {
        File file = new File(path);
        if (!file.exists()) {
            try {
                file.createNewFile();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        FileOutputStream fos;
        try {
            fos = new FileOutputStream(file);
            fos.write(data, 0, data.length);
            fos.flush();
            fos.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

怎么调用系统摄像头?

给intent添加action

Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(intent, 1);

怎么获取手机摄像头拍照的图片,并转换成bitmap?

在onActiivtyResult()方法中从intent中获取bundle,再从bundle获取bitmap

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == 1) {
        Bundle bundle = data.getExtras();
        Bitmap bitmap = (Bitmap) bundle.get("data");//将数据转换成bitmap
    }
}

源码:
http://git.oschina.net/AndroidUI/Camera01

MainActivity(代码注释)

package com.android.tackcamera01;

import java.io.IOException;

import android.hardware.Camera;
import android.hardware.Camera.PictureCallback;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.os.Message;
import android.app.Activity;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

public class MainActivity extends Activity {
    public String tag = "MainActivity";

    public SurfaceView surfaceView;
    public Camera camera;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        surfaceView = (SurfaceView) findViewById(R.id.surfaceview);
        SurfaceHolder holder = surfaceView.getHolder();
        holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
        holder.addCallback(new MyCallBack());

    }

    class MyCallBack implements SurfaceHolder.Callback {

        @Override
        public void surfaceCreated(SurfaceHolder holder) {
            Log.d(tag, "###surfaceCreated");
            camera = Camera.open();
            try {
                camera.setPreviewDisplay(holder);
                camera.startPreview();

                camera.takePicture(null, null, new PictureCallback() {

                    @Override
                    public void onPictureTaken(byte[] data, Camera camera) {
//                      String path2 = "data/data/"+getPackageName()+"/"+System.currentTimeMillis()+ ".jpg";
//                      String path = Environment.getDataDirectory().getAbsolutePath()+ "/"+ System.currentTimeMillis()+ ".jpg";
//                      Log.d(tag, "###"+Environment.getDataDirectory().getAbsolutePath());
//                      FileUtil.saveFile(path, data);
                        camera.startPreview();
                    }
                });

            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        @Override
        public void surfaceChanged(SurfaceHolder holder, int format, int width,
                int height) {
            Log.d(tag, "###surfaceChanged");

        }

        @Override
        public void surfaceDestroyed(SurfaceHolder holder) {
            Log.d(tag, "###surfaceDestroyed");
            if (camera != null) {
                camera.stopPreview();
                camera.release();
                camera = null;
            }
        }

    }
}

Demo:http://download.csdn.net/detail/ss1168805219/9503230

获取图片的拍照时间

代码

图片采用的是仿微信多图上传MultiImageSeletor,选择图片后得到的是多个图片的路径,然后采用ExifInterface获取图片详情

List<String> paths = data.getStringArrayListExtra(MultiImageSelectorActivity.EXTRA_RESULT);
try {
    ExifInterface exif = new ExifInterface(paths.get(i));

    String TAG_APERTURE = exif.getAttribute(ExifInterface.TAG_APERTURE);
    String TAG_DATETIME = exif.getAttribute(ExifInterface.TAG_DATETIME);
    String TAG_EXPOSURE_TIME = exif.getAttribute(ExifInterface.TAG_EXPOSURE_TIME);
    String TAG_FLASH = exif.getAttribute(ExifInterface.TAG_FLASH);
    String TAG_FOCAL_LENGTH = exif.getAttribute(ExifInterface.TAG_FOCAL_LENGTH);
    String TAG_IMAGE_LENGTH = exif.getAttribute(ExifInterface.TAG_IMAGE_LENGTH);
    String TAG_IMAGE_WIDTH = exif.getAttribute(ExifInterface.TAG_IMAGE_WIDTH);
    String TAG_ISO = exif.getAttribute(ExifInterface.TAG_ISO);
    String TAG_MAKE = exif.getAttribute(ExifInterface.TAG_MAKE);
    String TAG_MODEL = exif.getAttribute(ExifInterface.TAG_MODEL);
    String TAG_ORIENTATION = exif.getAttribute(ExifInterface.TAG_ORIENTATION);
    String TAG_WHITE_BALANCE = exif.getAttribute(ExifInterface.TAG_WHITE_BALANCE);

    Log.i(TAG, "光圈值:" + TAG_APERTURE);
    Log.i(TAG, "拍摄时间:" + TAG_DATETIME);
    Log.i(TAG, "曝光时间:" + TAG_EXPOSURE_TIME);
    Log.i(TAG, "闪光灯:" + TAG_FLASH);
    Log.i(TAG, "焦距:" + TAG_FOCAL_LENGTH);
    Log.i(TAG, "图片高度:" + TAG_IMAGE_LENGTH);
    Log.i(TAG, "图片宽度:" + TAG_IMAGE_WIDTH);
    Log.i(TAG, "ISO:" + TAG_ISO);
    Log.i(TAG, "设备品牌:" + TAG_MAKE);
    Log.i(TAG, "设备型号:" + TAG_MODEL);
    Log.i(TAG, "旋转角度:" + TAG_ORIENTATION);
    Log.i(TAG, "白平衡:" + TAG_WHITE_BALANCE);
} catch (Exception ee) {
    Toast.makeText(getApplication(), "The date does not exit", Toast.LENGTH_LONG).show();
}

这里写图片描述

Demo

demo: https://git.oschina.net/libraryDemo/multiimageseletor01.git

获取拍照的缩略图和原图

获取缩略图

先打开摄像头

Intent intent1 = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(intent1, 1);

获取缩略图

Bundle bundle = data.getExtras();
Bitmap bitmap = (Bitmap) bundle.get("data");//将数据转换成bitmap
String path = Environment.getExternalStorageDirectory().getAbsolutePath() + "/" + System.currentTimeMillis() + ".jpg";
File oldFile = BitmapUtil.saveBitmapToFile(path, bitmap);

BitmapUtil是个工具类,就是上面的FileUtil

获取原图

先打开摄像头

public static final String PICTURE_FILE = "temp.jpg";

Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
String path = Environment.getExternalStorageDirectory() + "/ABC/" + PICTURE_FILE;//文件保存路径
boolean orExistsFile = FileUtils.createOrExistsFile(path);
if (orExistsFile) {
    File file = new File(path);
    Uri imageUri = Uri.fromFile(file);
    intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
    startActivityForResult(intent, 2);
} else {
    Log.d(TAG, "创建文件失败");
}

保存图片

String path2 = Environment.getExternalStorageDirectory() + "/ABC/" + PICTURE_FILE;
File oldFile2 = new File(path2);

其它

Demo:http://git.oschina.net/AndroidUI/cameraphoto01
参考:Android开发获取相机拍照的原图(并非缩略图)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值