摄像头
- 1、启动系统原生的Camera程序来拍摄照片: intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);
- 最简单的方法是使用:MediaStore.ACTION_IMAGE_CAPTURE动作触发一个Intent。这将启动一个Camera应用程序来拍摄照片,不需要重写原生Camera应用程序,就可以为用户提供全套的摄像头功能。
- 默认情况下,拍摄的照片将作为一个缩略图返回,通过返回的Intent的extra(该extra的键名为data)可以访问原始位图。
- 2、指定一个用于存储拍摄照片的目标文件,图片路径被编码在Uri对象中 : intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
- 要获得完整图像,必须指定一个用于存储该图像的目标文件,该File对象将被编码为Uri对象,并在启动Intent后,在putExtra()方法中作为参数传入。这样摄像头拍摄的完整图像就被保存在了指定位置。
- 3、照片通过onActivityResult()处理程序将收到的Intent返回给应用程序:
- 可以将接收到的照片先进行裁剪,然后再次保存进Uri中所指定的文件路径;
- intent.setAction("com.android.camera.action.CROP");
- intent.setDataAndType(imageUri, "image/*");
- intent.putExtra("scale", true);
- intent.putExtra("output", imageUri);
- 然后再将裁切好的图片显示在Activity指定ImageView中。
- Bitmap bm = BitmapFactory.decodeFile(file.getAbsolutePath());
- imageView_main_show.setImageBitmap(bm);
- 可以将接收到的照片先进行裁剪,然后再次保存进Uri中所指定的文件路径;
public class MainActivity extends Activity {
private ImageView imageView_main_show;
private Uri imageUri = null;
private File file = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
imageView_main_show = (ImageView) findViewById(R.id.imageView_main_show);
}
public void clickButton(View view) {
file = new File(Environment.getExternalStorageDirectory()
.getAbsolutePath() + "/mypic.jpg");
try {
if (file.exists()) {
file.delete();
}
} catch (Exception e) {
e.printStackTrace();
}
imageUri = Uri.fromFile(file);
switch (view.getId()) {
case R.id.button_main_takephoto:
Intent intent = new Intent();
// 启动系统原生的Camera程序来拍摄照片。
intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);
// 指定一个用于存储该图像的目标文件,图片路径被编码在Uri对象中
intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
// 或者:以下的写法:
// intent.setAction("android.media.action.IMAGE_CAPTURE");
// intent.putExtra("output", imageUri);
startActivityForResult(intent, 1);
break;
case R.id.button_main_choose:
Intent intent2 = new Intent(Intent.ACTION_GET_CONTENT);
// Intent intent2 = new Intent("android.intent.action.GET_CONTENT");
intent2.setType("image/*");
intent2.putExtra("crop", true);
intent2.putExtra("scale", true);
intent2.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
startActivityForResult(intent2, 2);
break;
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == 1 && resultCode == RESULT_OK) {
Intent intent = new Intent();
intent.setAction("com.android.camera.action.CROP");
intent.setDataAndType(imageUri, "image/*");
intent.putExtra("scale", true);
intent.putExtra("output", imageUri);
startActivityForResult(intent, 2);
}
if (requestCode == 2 && resultCode == RESULT_OK) {
Bitmap bm = BitmapFactory.decodeFile(file.getAbsolutePath());
imageView_main_show.setImageBitmap(bm);
}
}
}
- 初始化SurfaceView:
- surfaceView_main = (SurfaceView) findViewById(R.id.surfaceView_main);
- surfaceHolder = surfaceView_main.getHolder();
- surfaceHolder.addCallback();
- 在surfaceCreated()中开启预览:
- mCamera.setPreviewDisplay(surfaceHolder);
- mCamera.startPreview();
- 在surfaceDestroyed()中停止预览:
- mCamera.stopPreview();
- 调用Camera对象的takePicture()方法实现拍照:
- mCamera.takePicture(shutterCallback, rawCallback, jpegCallback);
- 获取拍照的三个回调对象参数:
- ShutterCallback(shutterCallback 当快门关闭时执行的操作);
- PictureCallback(rawCallback 对图像原始数据做处理);
- PictureCallback(jpegCallback 对图像的JPEG数据进行操作)。
- 在onPause()生命周期中释放摄像头:
- mCamera.release();
- 在onResume()生命周期再打开摄像头:
- Camera.open();
public class MainActivity extends Activity {
private Camera mCamera = null;
private SurfaceView surfaceView_main;
private SurfaceHolder surfaceHolder;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
private void initSurfaceView() {
surfaceView_main = (SurfaceView) findViewById(R.id.surfaceView_main);
surfaceHolder = surfaceView_main.getHolder();
// surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
surfaceHolder.addCallback(new SurfaceHolder.Callback() {
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
if (mCamera != null) {
mCamera.stopPreview();
}
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
try {
mCamera.setPreviewDisplay(surfaceHolder);
mCamera.startPreview();
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format,
int width, int height) {
// TODO Auto-generated method stub
}
});
}
@Override
protected void onResume() {
super.onResume();
if (mCamera == null) {
mCamera = Camera.open();
}
}
@Override
protected void onPause() {
super.onPause();
if (mCamera != null) {
mCamera.release();
}
}
public void clickButton(View view) {
switch (view.getId()) {
case R.id.button_main_preview:
initSurfaceView();
break;
case R.id.button_main_takepicture:
mCamera.takePicture(shutterCallback, rawCallback, jpegCallback);
break;
}
}
ShutterCallback shutterCallback = new ShutterCallback() {
@Override
public void onShutter() {
// TODO Auto-generated method stub
}
};
PictureCallback rawCallback = new PictureCallback() {
@Override
public void onPictureTaken(byte[] data, Camera camera) {
// TODO Auto-generated method stub
}
};
PictureCallback jpegCallback = new PictureCallback() {
@Override
public void onPictureTaken(byte[] data, Camera camera) {
setTitle(data.length + "");
}
};
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
良心的公众号,更多精品文章,不要忘记关注哈
《Android和Java技术栈》