您的位置:首页 > 移动开发 > Android开发

Android 摄像头系统调用

2016-06-25 20:56 381 查看
一个简单的demo演示摄像头的用法

直接启动摄像头

使用权限

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.CAMERA" />


在Activity中以接收回传值的方式处理拍照的图片

public class CameraActivity extends AppCompatActivity {

private File mFileName;
private Button mBtnStart;
private ImageView mIvImg;
private Button mBtnPreview;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_camera);
initView();
mBtnStart.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
File path = new File(Environment.getExternalStorageDirectory(), "test");
if (!path.exists()) {
path.mkdirs();
}
mFileName = new File(path, System.currentTimeMillis() + ".jpg");
if (!mFileName.exists()) {
try {
mFileName.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}
// 启动系统的Camera
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
// 将系统的的拍摄结果写入文件
intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(mFileName));
// 打开摄像头
startActivityForResult(intent, Activity.DEFAULT_KEYS_DIALER);
}
});
mBtnPreview.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(CameraActivity.this, PickActivity.class);
startActivity(intent);

}
});
}

private void initView() {
mBtnStart = (Button) findViewById(R.id.id_btn_start);
mBtnPreview = (Button) findViewById(R.id.id_btn_preview);
mIvImg = (ImageView) findViewById(R.id.id_iv_img);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// 显示图片
if (requestCode == Activity.DEFAULT_KEYS_DIALER) {
mIvImg.setImageURI(Uri.fromFile(mFileName));
}
super.onActivityResult(requestCode, resultCode, data);
}
}


此处就是通过将摄像头拍照的图片保存在文件中,文件的路径通过Intent和Uri传递



使用SufaceView 实现拍照预览,手动实现拍照功能

public class PickActivity extends AppCompatActivity {

private Button mBtnPick;
private SurfaceView mSvView;

private SurfaceHolder.Callback mCallback;
private Camera mCamera;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_pick);
initView();
mCallback = new SurfaceHolder.Callback() {
@Override
public void surfaceCreated(SurfaceHolder holder) {
startCamera();
}

@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {

}

@Override
public void surfaceDestroyed(SurfaceHolder holder) {
stopCamera();
}
};
mSvView.getHolder().addCallback(mCallback);
mBtnPick.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mCamera.takePicture(null, null, new Camera.PictureCallback() {
@Override
public void onPictureTaken(byte[] data, Camera camera) {
File path = new File(Environment.getExternalStorageDirectory(), "test");
if (!path.exists()) {
path.mkdirs();
}
File fileName = new File(path, "test.jpg");
try {
FileOutputStream fos = new FileOutputStream(fileName);
fos.write(data);
fos.flush();
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
});
}
});
}

private void stopCamera() {
mCamera.stopPreview();
mCamera.release();
mCamera = null;
}

private void startCamera() {
mCamera = Camera.open();
try {
mCamera.setPreviewDisplay(mSvView.getHolder());
mCamera.setDisplayOrientation(90);
mCamera.startPreview();
} catch (IOException e) {
e.printStackTrace();
}
}

private void initView() {
mBtnPick = (Button) findViewById(R.id.id_btn_pick);
mSvView = (SurfaceView) findViewById(R.id.id_sv_camera);
}
}


* 在SurfaceView 的onCreate 和 onDestory 回调方法中分别实现摄像头的打开和关闭,点击Btn时,调用takePicture将摄像头捕获的数据写入文件。*

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: