调用手机摄像头拍照,并显示+转换成file,保存在本地
逻辑:
activity_main.xml中有1个Button,1个imageView,点击button实现拍照,并显示在imageview中,而且保存在本地。
步骤
- 调用手机摄像头拍照
- 将数据转换成Bitmap
- 将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
}
}
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开发获取相机拍照的原图(并非缩略图)