安卓调用相机和自定义相机SurfaceView实现预览
2016-11-10 21:36
429 查看
调用原生相机拍照:
1、添加权限
private File file; public void startCamera(View view) { Intent intent = new Intent(); intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE); file = new File("/mnt/sdcard/my.jpg"); intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(file)); startActivityForResult(intent, 1); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode==1) { Bitmap bitmap = BitmapFactory.decodeFile("/mnt/sdcard/my.jpg"); iv.setImageBitmap(bitmap); } }自定义相机实现预览:
1、添加权限
<uses-permission android:name="android.permission.CAMERA"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>2、布局
<SurfaceView android:id="@+id/sv" android:layout_width="match_parent" android:layout_height="match_parent" />3、设置预览
SurfaceView sv = (SurfaceView) findViewById(R.id.sv); holder = sv.getHolder(); holder.addCallback(new Callback() { //当界面不可见的时候回调该方法 @Override public void surfaceDestroyed(SurfaceHolder holder) { if (camera!=null) { //停止预览 camera.stopPreview(); //释放资源 camera.release(); camera = null; } } //当 界面展现出来的时候回调 @Override public void surfaceCreated(SurfaceHolder holder) { if (camera==null) { //打开照相机 camera = Camera.open(); } //开启预览 camera.startPreview(); try { //设置预览界面 camera.setPreviewDisplay(holder); } catch (IOException e) { e.printStackTrace(); } } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { } });4、实现拍照
if (camera!=null) { //参数1:拍照声音的回调 //参数2:照片的原生的没有压缩过的数据 //参数3:压缩过后的相片数据 camera.takePicture(null, null, new PictureCallback() { //参数1:照片的字节码 @Override public void onPictureTaken(byte[] data, Camera camera) { try { //将data保存到sdcard上 FileOutputStream fos = new FileOutputStream(new File("/mnt/sdcard/my2.jpg")); fos.write(data); fos.close(); /* * 需要重新开启预览,因此拍照的时候,系统会自动停止预览 */ camera.startPreview(); } catch (Exception e) { e.printStackTrace(); } } }); }5、如果想自动对焦
//点击拍照按钮,摄像头自动对焦,对焦完成后拍照并保存 camera.autoFocus(new AutoFocusCallback() { @Override public void onAutoFocus(boolean success, Camera camera) { //对焦完成,拍照并保存 camera.takePicture(null, null, new PictureCallback() { @Override public void onPictureTaken(byte[] data, Camera camera) { //设置照片保存路径 String path =Environment.getExternalStorageDirectory().getAbsolutePath() + "/" +UUID.randomUUID().toString() + ".jpg"; try { FileOutputStream outputStream = new FileOutputStream(path); //将照片字节数组写到文件中 outputStream.write(data); outputStream.close(); //重新开启预览 camera.startPreview(); } catch (Exception e) { e.printStackTrace(); } } }); }
相关文章推荐
- 基于Android TextureView与SurfaceTexture实现相机Camera拍照预览与保存照片
- 基于Android TextureView与SurfaceTexture实现相机Camera拍照预览与保存照片
- Android应用开发Camera系列(一):SurfaceView实现相机预览demo--新手上路
- WebView实现js调用安卓虚拟机的系统相机
- 安卓高级8 SurfaceView案例二 自定义相机
- 安卓高级8 SurfaceView案例二 自定义相机
- android之利用surfaceView实现自定义水印相机
- Android--相机预览及拍照临时文件/SurfaceView
- android自定义SurfaceView实现跑男动画
- 2014-11-3Android学习------关于自定义视图View的时候需要调用onMeasure--------GIF动画实现
- 安卓笔记——自定义HorizontalScrollView控件(实现QQ5.0侧滑结果)
- 安卓自定义View实现钟表
- Android--相机预览及拍照临时文件/SurfaceView
- 安卓之在SurfaceView中实现动画效果
- Android-图片预览(自定义ImageView实现图片缩放,多点触控,自由移动)
- Android自定义SurfaceView与传感器的并用(实现自绘的指北针)
- 安卓自定义View——PictureGuide一款不错的图片导航,可实现图片显示滑动到哪一张
- Android在自定义View(SurfaceView)中实现进度条Progress
- Android摄像头:只拍摄SurfaceView预览界面特定区域内容(矩形框)---完整实现(原理:底层SurfaceView+上层绘制ImageView)
- Android Camera+SurfaceView实现自定义拍照