Android调用Camera
调用系统相机或者是具有相机功能的App
调用系统相机
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
Uri photoUri = Uri.fromFile(new File(filePath);
intent.putExtra(MediaStore.EXTRA_OUTPUT, photoUri);
startActivityForResult(intent, requestCode);
调用具有相机功能的App
<activity>
<intent-filter>
<action android:name="android.media.action.IMAGE_CAPTURE"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</activity>
获取拍摄图片
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(resultCode == RESULT_OK && requestCode == 100){
if(data != null){
Bundle bundle = data.getExtras();
Bitmap bitmap = (Bitmap) bundle.get("data");
}
}
}
自定义相机
- 使用SurfaceView组件来显示相机内容。
- 打开Camera,并且try catch设置为空。
mCamera.open();
- 每次操作Camera的时候判断是否为空。
- Camera的使用要与Activity的生命周期绑定,如onDestory()、onPause()。
if(mCamera != null){
mCamera.setPreviewCallback(null);
mCamera.stopPreview();
mCamera.replease();
mCamera = null;
}
- 使用SurfaceView拿到SurfaceHolder对象,并且实现SurfaceHolder.Callback接口,并且重写方法。
- SurfaceHolder对象。
mSurfaceHolder = mSurfaceView.getHolder();
- 设置回调。
mSurfaceHolder.addCallback(this);
- 实现接口。
@Override
public void surfaceCreated(SurfaceHolder holder) {
if(mCamera != null && mSurfaceHolder != null){
mCamera.setPreviewDisplay(mSurfaceHolder);
mCamera.setDisplayOrientation(90);
mCamera.startPreview();
}
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
mCamera.stopPreview();
if(mCamera != null && mSurfaceHolder != null){
mCamera.setPreviewDisplay(mSurfaceHolder);
mCamera.setDisplayOrientation(90);
mCamera.startPreview();
}
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
if(mCamera != null){
mCamera.setPreviewCallback(null);
mCamera.stopPreview();
mCamera.replease();
mCamera = null;
}
}
if(mCamera != null && mSurfaceHolder != null){
mCamera.setPreviewDisplay(mSurfaceHolder);
mCamera.setDisplayOrientation(90);
mCamera.startPreview();
}
- 添加权限
<users-permission android:name="android.permission.CAMERA" />
注意
- 使用Camera的时候,导入的包要到hardware的,而不是graphics的。
- Android 5.0后新增了具有高级功能的Camera2。