首先,Camera中,调用系统相机:

使用系统Intent,ACTION_IMAGE_CAPTURE

注册Camera功能

<intent-filter><action android:name="android.media.action.IMAGE_CAPTURE"/><category android:name="android.intent.category.DEFAULT"/>
</intent-filter>

调用系统的Camera功能,由于默认返回的是缩略图,以下方法是通过将拍的照片存入自定义的SD卡中,之后再取出到ImageView中,使得返回的为原图:

MyFilePath = Environment.getExternalStorageDirectory().getPath();
MyFilePath = MyFilePath + "/" + "example.png";public void StartCamera(View view){Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);Uri photoUri = Uri.fromFile(new File(MyFilePath));//将系统默认保存路径改为指定的sd卡中的路径intent.putExtra(MediaStore.EXTRA_OUTPUT, photoUri);startActivityForResult(intent, REQUEST);
}protected void onActivityResult(int requestCode, int resultCode, Intent data){super.onActivityResult(requestCode, requestCode, data);if(resultCode == RESULT_OK){if(requestCode == REQUEST){Bundle bundle = data.getExtras();Bitmap bitmap = (Bitmap)bundle.get("data");mImageView.setImageBitmap(bitmap);}else{FileInputStream fis = null;try{fis = new FileInputStream(MyFilePath);Bitmap bitmap = BitmapFactory.decodeStream(fis);mImageView.setImageBitmap(bitmap);//这样显示的就是原图,而不是缩略图}catch(FileNotFoundException e){e.printStackTrace();}finally{try{fis.close();}catch(IOException e){e.printStackTrace();}}}}
}

以下就是自定义相机的基础实现

首先需要注意,由于是自定义的相机,就需要添加相机权限:

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

然后,即开始创建自定义的相机:

public class CustomCamera extends Activity implements SurfaceHolder.Callback{private Camera mCamera;private SurfaceView mPreview;//要实现SurfaceHolder.Callback接口中的方法private SurfaceHolder mHolder;private Camera.PictureCallback mpictureCallback = new Camera.PictureCallback(){public void onPictureTaken(byte[] data, Camera camera) {File tempFile = new File("/sdcard/temp.png")try{FileOutputStream fos = new FileOutputStream(tempFile);fos.write(data);fos.close();Intent intent = new Intent(CustomCamera.this, ResultAty.class);Intent.putExtra("picPath", temFile.getAbsolutePath());startActivity(intent);CustomCamera.this.finish();}catch(Exception e){e.printStackTrace();}}
};protected void OnCreate(Bundle savedInstanceState){super.OnCreate(savedInstanceState);setContentView(R.layout.custom);mPreview = (SurfaceView)findViewById(R.id.preview);mHolder = mPreview.getHolder();mHolder.addCallback(this);mPreview.setOnClickListener(new View.onClickListener(){public void onClick(View v){mCamera.autoFocus(null);}});}public void capturePhoto(View view){Camera.parameters parameters = mCamera.getParameters();parameters.setPictureFormat(ImageFormat.JPEG);parameters.setPreviewSize(800,400);//调整拍照的显示效果parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);mCamera.autoFocus(new Camera.AutoFocusCallback(){public void onAutoFocus(boolean success, Camera camera){if(success){mCamera.takePicture(null, null, mPictureCallback);}}});
}//------------------------
protected void onResume(){super.onResume();if(mCamera == null){mCamera = getCamera();if(mHolder != null){setStartPreview(mCamera, mHolder);}}
}protected void onPause(){super.onPause();releaseCamera();
}
//----------通过重写这两个方法,使得Camera生命周期与Activity周期进行绑定
//以保证资源能够被正确的初始化和释放//--------创建了Camera生命周期的三个方法:
//获取Camera对象,同时进行初始化操作
private Camera getCamera(){Camera camera;//在Android5.0之后系统推荐使用Camera2//但不使用高级的功能时,Camera仍然适用//在此是最基本的Camera操作try{camera = Camera.open();//进行初始化操作}catch(Exception e){camera = null;e.printStackTrace();}return camera;
}//开始预览相机内容
private void setStartPreview(Camera camera, SurfaceHolder holder){try{camera.setPreviewDisplay(holder);//将Camera与SurfaceView进行关联//同时Camera进行取景,预览画面camera.setDisplayOrientation(90);//将Camera预览旋转90度camera.startPreview();}catch(IOException e){e.printStackTrace();}
}//释放相机资源,同时解除与SurfaceView的绑定
private void releaseCamera(){if(mCamera != null){mCamera.setPreviewCallback(null);mCamera.stopPreview();mCamera.release();mCamera = null;}
}
//---------至此,camera生命周期的方法创建完毕
//-----以下将Camera生命周期与SurfaceView进行绑定
public void surfaceCreated(SurfaceHolder holder){setStartPreview(mCamera, mHolder);
}public void surfaceChanged(SurfaceHolder holder, int format, int width, int height){mCamera.stopPreview();setStartPreview(mCamera, mHolder);
}public void surfaceDestroyed(SurfaceHolder holder){releaseCamera();
}
//------------对相机的生命周期的管理//还需要另外一个类:
public class ResultAty extends Activity{protected void OnCreate(Bundle savedInstanceState){super.OnCreate(savedInstanceState);setContentView(R.layout.result);String path = getIntent().getStringExtra("picPath");ImageView imageView = (ImageView)findViewById(R.id.pic);// Bitmap bitmap = BitmapFactory.decodeFile(path);// imageView.setImageBitmap(bitmap);try{FileInputStream fis = new FileInputStream(path);Bitmap bitmap = BitmapFactory.decodeStream(fis);Matrix matrix = new Matrix();matrix.setRotate(90);//取得的照片进行旋转bitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);imageView.setImageBitmap(bitmap);}catch(Exception e){e.printStackTrace();}}
}

另外,若想要给相机添加一个水印功能,只需要在xml文件中,在<SurfaceView>标签中添加<TextView>标签即可,很简单,不予演示了。

自制Android相机相关推荐

  1. android相机采集sdk,Android相机在Android SDK怪怪

    我使用相机首次,像大多数第一次的问题接踵而至......Android相机在Android SDK怪怪 我有我的活动肖像,但我的相机是面向非常怪异.它从字面上翻转了图像.因此,如果我从顶部粘住我的手指 ...

  2. android --相机使用详解概述

    Android – 相机设置 http://www.eoeandroid.com/thread-69555-1-1.html Android 浅谈相机研发(一) http://www.eoeandro ...

  3. CAMERA(12)---[Android相机]光线传感器识别环境光亮强度

    [Android相机]光线传感器识别环境光亮强度 关于Android相机的开发流程可以看前一篇文章, [Android 相机]Android 相机开发的基本流程 https://blog.csdn.n ...

  4. camera (19)---Android 相机开发的基本流程

    [Android 相机]Android 相机开发的基本流程 https://blog.csdn.net/bluewindtalker/article/details/54563910 相机开发现在有2 ...

  5. android camera 显示过程,Android相机Camera基础知识

    一.概述本章节主要讲述的Android相机Camera的相关知识点,主要包含三个方面,Android启动系统相机生成缩略图.Android启动系统相机生成原图以及Android自定义相机等. 二.An ...

  6. 深入理解Android相机体系结构之二

    该系列文章总目录链接: https://blog.csdn.net/u012596975/article/details/107135938 本篇是<深入理解Android相机体系结构>连 ...

  7. Android 相机教程,Android 相机教程

    Android相机教程 相机主要用于捕获图片和视频.我们可以通过使用相机API的方法来控制相机. Android通过以下两种方式提供了在相机上工作的功能: 通过相机意图 通过相机API 了解相机意图和 ...

  8. android相机权限xml,Android相机权限检测兼容问题

    在做Android开发过程中,兼容问题一直都是安卓攻城狮们的常见的一个问题,各种手机品牌的兼容.还有API版本高低的兼容. 这里主要针对Android相机开发的兼容问题之 Fail to connec ...

  9. Android相机预览设置适配及显示方式

    Android相机的部分工作原理. 预览流程 相机预览是Android Camera最常用的功能之一,它是很多功能重要的输入,例如扫码.AR等. 一般而言,相机预览的整体流程,可以通过下图表示: 其中 ...

最新文章

  1. 几种filter的比较
  2. 1、spring的IOC
  3. tom启动报错:org.xml.sax.SAXParseException: Content is not allowed in prolog.
  4. 找出一个字符串中出现次数最多的字_Day34:第一个只出现一次的字符
  5. 端午前夕的班级小游戏
  6. spring data jpa 的 in 查询 Specification 实现
  7. 动作类游戏状态机设计
  8. 小米首登福布斯2000榜单 排名426位!
  9. 06-windows下Orcale使用Database Configuration Assistant建立数据库
  10. MATLAB语言初步学习(六)
  11. sql08 访问接口没有oraoledb_如何配置交换机和防火墙以访问 Internet?
  12. 必看干货!五个步骤帮您成功实施IT SLA
  13. WIN7 SP1系统浏览器怎么离线升级到IE11,怎么解决?
  14. CFA2019notes的PDF版本,热乎乎的百度网盘分享
  15. 在Windows里面使用binwalk工具分离图片
  16. Win10 IPv6 远程桌面连接(小米路由器)
  17. 知识付费资源变现小程序源码+可开流量主/带教程
  18. 计算机组装主机怎么拆,【电脑组装知识网】电脑主机组装教程之戴尔显示器底座拆卸教程...
  19. 什么样的公司程序员待遇好
  20. sonarqube+sonar-scanner+jenkins安装配置及使用

热门文章

  1. $query = mysql_query_关于$query=mysql_query($query);返回的是什么类型的值的问题的理解 | 学步园...
  2. Exp9 Web安全基础
  3. 设计模式:享元(FlyWeight)模式
  4. 在Spring Boot项目中使用Spock框架
  5. tkinter学习-菜单与画布
  6. 圣杯布局简单结构代码!
  7. [解决方案]sql server复制需要有实际的服务器名称才能连接到服务器
  8. Codeforces Round #144 (Div. 2) B. Non-square Equation 数学解一元二次方程+分析
  9. AsyncTask使用方式一
  10. Android Studio开发概要记录