初学android自定义Camera拍照并查看图片
来源:互联网 发布:mysql教程pdf 编辑:程序博客网 时间:2024/05/16 10:32
1.打开相机
a.预览拍摄图片,需用到SurfaceView,并且实现其回调函数implements SurfaceHolder.Callback;
activity_camera.xml
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <SurfaceView android:id="@+id/sv" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" /> <Button android:id="@+id/btn_camera" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="拍照" /></LinearLayout>
2.获取相机并开启预览
/** * 获取系统相机 * * @return */ private Camera getcCamera() { Camera camera = null; try { camera = Camera.open(); } catch (Exception e) { camera = null; } return camera; }
/** * 显示相机预览图片 * * @return */ private void showCameraView(Camera camera,SurfaceHolder holder) { try { camera.setPreviewDisplay(holder); camera.setDisplayOrientation(90); camera.startPreview(); }catch (Exception e){ e.printStackTrace(); }; }
/**** 实现界面回调处理*/ @Override public void surfaceCreated(SurfaceHolder holder) { showCameraView(mCamera, holder); } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { mCamera.stopPreview(); showCameraView(mCamera, holder); } @Override public void surfaceDestroyed(SurfaceHolder holder) { clearCamera(); }}
3,相机主页面处理
public class CameraActivity extends AppCompatActivity implements SurfaceHolder.Callback{ private SurfaceView sv; private Camera mCamera; private SurfaceHolder holder; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_camera); sv = (SurfaceView)findViewById(R.id.sv); holder = sv.getHolder(); holder.addCallback(this); findViewById(R.id.btn_camera).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 获取当前相机参数 Camera.Parameters parameters = mCamera.getParameters(); // 设置相片格式 parameters.setPictureFormat(ImageFormat.JPEG); // 设置预览大小 parameters.setPreviewSize(800, 480); // 设置对焦方式,这里设置自动对焦 parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO); mCamera.autoFocus(new Camera.AutoFocusCallback() { @Override public void onAutoFocus(boolean success, Camera camera) { // 判断是否对焦成功 if (success) { // 拍照 第三个参数为拍照回调 mCamera.takePicture(null, null, new Camera.PictureCallback() { @Override public void onPictureTaken(byte[] data, Camera camera) { // data为完整数据 File file = new File("/sdcard/photo.png"); // 使用流进行读写 try { FileOutputStream fos = new FileOutputStream(file); try { fos.write(data); // 关闭流 fos.close(); // 查看图片 Intent intent = new Intent(); // 传递路径 intent.putExtra("path", file.getAbsolutePath()); setResult(0,intent); finish(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }); } } }); } }); }
@Override protected void onResume() { super.onResume(); if (mCamera == null) { mCamera = getCamera(); if (holder != null) { showCameraView(mCamera, holder); } } } @Override protected void onPause() { // TODO Auto-generated method stub super.onPause(); // activity暂停时我们释放相机内存 clearCamera(); } @Override protected void onDestroy() { super.onDestroy(); } /** * 释放相机的内存 */ private void clearCamera() { // 释放hold资源 if (mCamera != null) { // 停止预览 mCamera.stopPreview(); mCamera.setPreviewCallback(null); // 释放相机资源 mCamera.release(); mCamera = null; } }
4.启动activity(设置拍照完图片路径返回显示图片处理,一定要对图片进行采样率操作(很可能拍照的图片太多而无法显示,又不报任何异常))
public class MainActivity extends AppCompatActivity { private ImageView cameraIv; @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if(resultCode == 0 && requestCode == 100) { String path = data.getStringExtra("path"); BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = true; BitmapFactory.decodeFile(path, options); ImageSize imageSize = getImageViewSize(cameraIv); options.inSampleSize = caculateInSampleSize(options, imageSize.width, imageSize.height); // 使用获得到的InSampleSize再次解析图片 options.inJustDecodeBounds = false; Bitmap bitmap = BitmapFactory.decodeFile(path, options); cameraIv.setImageBitmap(bitmap); } super.onActivityResult(requestCode, resultCode, data); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button openButton = (Button) findViewById(R.id.button); cameraIv = (ImageView) findViewById(R.id.imageView); openButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(MainActivity.this,CameraActivity.class); startActivityForResult(intent,100); } }); } /* 根据需求的宽和高以及图片实际的宽和高计算SampleSize * * @param options * @param width * @param height * @return */ public static int caculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight) { int width = options.outWidth; int height = options.outHeight; int inSampleSize = 1; if (width > reqWidth || height > reqHeight) { int widthRadio = Math.round(width * 1.0f / reqWidth); int heightRadio = Math.round(height * 1.0f / reqHeight); inSampleSize = Math.max(widthRadio, heightRadio); } return inSampleSize; } public static ImageSize getImageViewSize(ImageView imageView) { ImageSize imageSize = new ImageSize(); DisplayMetrics displayMetrics = imageView.getContext().getResources() .getDisplayMetrics(); LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams)imageView.getLayoutParams(); int width = imageView.getWidth();// 获取imageview的实际宽度 if (width <= 0) { width = lp.width;// 获取imageview在layout中声明的宽度 } if (width <= 0) { width = displayMetrics.widthPixels; } int height = imageView.getHeight();// 获取imageview的实际高度 if (height <= 0) { height = lp.height;// 获取imageview在layout中声明的宽度 } if (height <= 0) { height = displayMetrics.heightPixels; } imageSize.width = width; imageSize.height = height; return imageSize; } public static class ImageSize { int width; int height; }}
阅读全文
0 0
- 初学android自定义Camera拍照并查看图片
- Android Camera开发系列(下)——自定义Camera实现拍照查看图片等功能
- Android Camera开发系列(下)——自定义Camera实现拍照查看图片等功能
- android camera拍照/录像后查看图片/视频并删除所有内容后自动回到camera预览界面
- Android调用Camera APIs实现拍照功能并上传图片
- Android Camera+SurfaceView实现自定义拍照
- android自定义拍照界面SurfaceView+Camera
- android camera 拍照加图片处理
- Android:Camera的使用,并处理手机拍照后上传图片被旋转的问题
- 初学Android,多媒体之使用Camera进行拍照(七十九)
- Android 选择图片 拍照 并编辑图片
- 关于Android使用Camera自定义拍照出现模糊不清的解决方案
- android下自定义Camera进行录像和拍照
- Android 自定义Camera全屏拍照,支持前后摄像头
- android camera 后台拍照
- Android Camera进行拍照
- Android之Camera拍照
- android Camera拍照
- 在salesforce中实现鼠标悬停显示提示框效果,并对显示框内容进行微缩页面布局
- 利用Solidworks Motion将带有质量信息和关节约束的三维模型导入ADAMS
- IntelliJ 创建main函数快捷
- 查看SQL Server有几个 NUMA 节点及CPU情况
- C++学习笔记,引用变量
- 初学android自定义Camera拍照并查看图片
- procrank和dumpsys meminfo的pss大小不同的原因
- 十五、不可控组件
- 交换两个数组的内容
- 基于Android平台的身份证识别技术
- php开始认识之旅.1
- c#多线程
- java基础语法
- 13期 7月期刊自荐