本文出自 “whithin's” 博客,请务必保留此出处http://whithin.blog.51cto.com/690417/1063573

1. add  below three permission into AndroidManifest.xml file

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

  2. <uses-permissionandroid:name= "android.permission.RECORD_AUDIO"/>

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

2. get a camera instance

  1. /** A safe way to get an instance of the Camera object. */

  2. publicstatic Camera getCameraInstance(){

  3. Camera c = null;

  4. try {

  5. c = Camera. open(); // attempt to get a Camera instance

  6. }

  7. catch (Exception e){

  8. // Camera is not available (in use or does not exist)

  9. }

  10. return c; // returns null if camera is unavailable

  11. }

3. implement a preview for the user to preview the live p_w_picpath for the camera
  1. publicclass CameraPreview extends SurfaceView implements SurfaceHolder.Callback {

  2. private SurfaceHolder mHolder;

  3. private Camera mCamera;

  4. String TAG="CAMERAAPI";

  5. public CameraPreview(Context context, Camera camera) {

  6. super(context);

  7. mCamera = camera;

  8. // Install a SurfaceHolder.Callback so we get notified when the

  9. // underlying surface is created and destroyed.

  10. mHolder = getHolder();

  11. mHolder.addCallback( this);

  12. // deprecated setting, but required on Android versions prior to 3.0

  13. mHolder. setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

  14. }

  15. publicvoid surfaceCreated(SurfaceHolder holder) {

  16. // The Surface has been created, now tell the camera where to draw the preview.

  17. try {

  18. mCamera.setPreviewDisplay(holder);

  19. mCamera.startPreview();

  20. } catch (IOException e) {

  21. Log. d(TAG, "Error setting camera preview: " + e.getMessage());

  22. }

  23. }

  24. publicvoid surfaceDestroyed(SurfaceHolder holder) {

  25. // empty. Take care of releasing the Camera preview in your activity.

  26. }

  27. publicvoid surfaceChanged(SurfaceHolder holder, int format, int w, int h) {

  28. // If your preview can change or rotate, take care of those events here.

  29. // Make sure to stop the preview before resizing or reformatting it.

  30. if (mHolder .getSurface() == null){

  31. // preview surface does not exist

  32. return;

  33. }

  34. // stop preview before making changes

  35. try {

  36. mCamera.stopPreview();

  37. } catch (Exception e){

  38. // ignore: tried to stop a non-existent preview

  39. }

  40. // set preview size and make any resize, rotate or

  41. // reformatting changes here

  42. // start preview with new settings

  43. try {

  44. mCamera.setPreviewDisplay( mHolder);

  45. mCamera.startPreview();

  46. } catch (Exception e){

  47. Log. d(TAG, "Error starting camera preview: " + e.getMessage());

  48. }

  49. }

  50. }

4.initialize MediaRecorder for video recording
  1. privateboolean prepareVideoRecorder(){

  2. mCamera = getCameraInstance();

  3. mMediaRecorder = new MediaRecorder();

  4. // Step 1: Unlock and set camera to MediaRecorder

  5. mCamera.unlock();

  6. mMediaRecorder.setCamera(mCamera );

  7. // Step 2: Set sources

  8. mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);

  9. mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);

  10. // Step 3: Set a CamcorderProfile (requires API Level 8 or higher)

  11. mMediaRecorder.setProfile(CamcorderProfile.get(CamcorderProfile. QUALITY_HIGH));

  12. // Step 4: Set output file

  13. mMediaRecorder.setOutputFile(getOutputMediaFile( MEDIA_TYPE_VIDEO).toString());

  14. // Step 5: Set the preview output

  15. mMediaRecorder.setPreviewDisplay(mPreview .getHolder().getSurface());

  16. // Step 6: Prepare configured MediaRecorder

  17. try {

  18. mMediaRecorder.prepare();

  19. } catch (IllegalStateException e) {

  20. Log. d(TAG, "IllegalStateException preparing MediaRecorder: " + e.getMessage());

  21. releaseMediaRecorder();

  22. returnfalse ;

  23. } catch (IOException e) {

  24. Log. d(TAG, "IOException preparing MediaRecorder: " + e.getMessage());

  25. releaseMediaRecorder();

  26. returnfalse ;

  27. }

  28. returntrue ;

  29. }

5.listen for the user operation to start or stop recording, the complete code for MediaRecorder is as below,remember to release the camera and MediaRecord when finished using it.
  1. publicclass MediaRecorderActivity extends Activity {

  2. publicstaticfinalint MEDIA_TYPE_IMAGE = 1;

  3. publicstaticfinalint MEDIA_TYPE_VIDEO = 2;

  4. private Camera mCamera;

  5. private CameraPreview mPreview;

  6. private MediaRecorder mMediaRecorder;

  7. String TAG="CAMERAAPI";

  8. boolean isRecording=false ;

  9. @Override

  10. publicvoid onCreate(Bundle savedInstanceState) {

  11. super.onCreate(savedInstanceState);

  12. setContentView(R.layout. main);

  13. mCamera = getCameraInstance();

  14. //        // Create our Preview view and set it as the content of our activity.

  15. mPreview = new CameraPreview(this, mCamera);

  16. FrameLayout preview = (FrameLayout) findViewById(R.id. camera_preview);

  17. preview.addView( mPreview);

  18. Button captureButton = (Button) findViewById(id. button_capture);

  19. captureButton.setOnClickListener( new CaptureButtonOnClickListener());

  20. }

  21. publicclass CaptureButtonOnClickListener implements View.OnClickListener{

  22. publicvoid onClick(View v) {

  23. Button captureButton = (Button)v;

  24. if (isRecording ) {

  25. // stop recording and release camera

  26. mMediaRecorder.stop();  // stop the recording

  27. releaseMediaRecorder(); // release the MediaRecorder object

  28. mCamera.lock();         // take camera access back from MediaRecorder

  29. // inform the user that recording has stopped

  30. captureButton.setText( "Capture");

  31. isRecording = false ;

  32. } else {

  33. try{

  34. // initialize video camera

  35. if (prepareVideoRecorder()) {

  36. // Camera is available and unlocked, MediaRecorder is prepared,

  37. // now you can start recording

  38. mMediaRecorder.start();

  39. // inform the user that recording has started

  40. captureButton.setText( "Stop");

  41. isRecording = true ;

  42. } else {

  43. // prepare didn't work, release the camera

  44. releaseMediaRecorder();

  45. // inform user

  46. }

  47. } catch(Exception ex){

  48. System. out.println(ex.toString());

  49. ex.printStackTrace();

  50. }

  51. }

  52. }

  53. }

  54. /** A safe way to get an instance of the Camera object. */

  55. publicstatic Camera getCameraInstance(){

  56. Camera c = null;

  57. try {

  58. c = Camera. open(); // attempt to get a Camera instance

  59. }

  60. catch (Exception e){

  61. // Camera is not available (in use or does not exist)

  62. }

  63. return c; // returns null if camera is unavailable

  64. }

  65. /** Create a File for saving an p_w_picpath or video */

  66. privatestatic File getOutputMediaFile(int type){

  67. // To be safe, you should check that the SDCard is mounted

  68. // using Environment.getExternalStorageState() before doing this.

  69. File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory(

  70. Environment. DIRECTORY_PICTURES), "MyCameraApp" );

  71. // This location works best if you want the created p_w_picpaths to be shared

  72. // between applications and persist after your app has been uninstalled.

  73. // Create the storage directory if it does not exist

  74. if (! mediaStorageDir.exists()){

  75. if (! mediaStorageDir.mkdirs()){

  76. Log. d("MyCameraApp", "failed to create directory");

  77. returnnull ;

  78. }

  79. }

  80. // Create a media file name

  81. String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss" ).format(new Date());

  82. File mediaFile;

  83. if (type == MEDIA_TYPE_IMAGE){

  84. mediaFile = new File(mediaStorageDir.getPath() + File.separator +

  85. "IMG_"+ timeStamp + ".jpg" );

  86. } elseif (type == MEDIA_TYPE_VIDEO) {

  87. mediaFile = new File(mediaStorageDir.getPath() + File.separator +

  88. "VID_"+ timeStamp + ".mp4" );

  89. } else {

  90. returnnull ;

  91. }

  92. return mediaFile;

  93. }

  94. @Override

  95. protectedvoid onPause() {

  96. super.onPause();

  97. releaseMediaRecorder();       // if you are using MediaRecorder, release it first

  98. releaseCamera();              // release the camera immediately on pause event

  99. }

  100. privatevoid releaseCamera(){

  101. if (mCamera != null){

  102. mCamera.release();        // release the camera for other applications

  103. mCamera = null;

  104. }

  105. }

  106. privatevoid releaseMediaRecorder(){

  107. if (mMediaRecorder != null) {

  108. mMediaRecorder.reset();   // clear recorder configuration

  109. mMediaRecorder.release(); // release the recorder object

  110. mMediaRecorder = null ;

  111. mCamera.lock();           // lock camera for later use

  112. }

  113. }

  114. }

本文出自 “whithin's” 博客,请务必保留此出处http://whithin.blog.51cto.com/690417/1063573

转载于:https://blog.51cto.com/yuzuolin/1330360

Android开发:调用camera API 创建MediaRecorder相关推荐

  1. Android开发规范:API接口安全设计规范

    公众号[国民程序员]回馈粉丝福利: 现金红包和送书活动火热进行中,点击参与! 我的新书<Android App开发入门与实战>已于2020年8月由人民邮电出版社出版,欢迎购买. 书籍详情请 ...

  2. Android开发 调用系统相机相册图片功能,解决小米手机拍照或者图片横竖相反问题,及小米手机相册图片路径问题

    Android开发 调用系统相机相册图片功能,解决小米手机拍照或者图片横竖相反问题,及小米手机相册图片路径问题 1.调用相机,兼容7.0 AndroidManifest配置 <providera ...

  3. 调用Camera API实现自己的拍照和摄像程序

    参考博客: http://www.cnblogs.com/franksunny/archive/2011/11/17/2252926.html 根据Camera API实现自己的拍照和摄像程序 通过上 ...

  4. Android 开发多摄像头 API

    这篇博客是对我们的 Android 开发者峰会 2018 演讲 的补充,是与来自合作伙伴开发者团队中的 Vinit Modi.Android Camera PM 和 Emilie Roberts 合作 ...

  5. Android开发--调用系统邮件

    Android系统的开源性使其在当前智能手机市场占据绝对优势,同时也产生了各种各样的机型和系统.这使得我们Android开发人员需要根据不同的机型和系统去做对应的适配. 正文 本篇所述需求为调用本地邮 ...

  6. Android开发之高德API篇:2、高德API线路规划

    TIME:2020年7月6日 2.高德API线路规划----步行线路规划 前言: step1 工程配置 step2 整体实现过程 step3 具体实现过程 总结 附上源码 前言: 该篇博客主要是介绍高 ...

  7. Android之调用第三方API导航(高德,百度,google)

    一:效果图(点击路线调用API) 二:实现步骤: 1.判断是否安装各个地图软件 /*** 判断是否安装目标应用** @param packageName 目标应用安装后的包名* @return 是否已 ...

  8. Android开发技巧——Camera拍照功能

    本篇是我对开发项目的拍照功能过程中,对Camera拍照使用的总结.由于camera2是在api level 21(5.0.1)才引入的,而Camera到6.0仍可使用,所以暂未考虑camera2. 文 ...

  9. Android编译调用FFmpeg API,自己写方法,编译so库

    作者:谭东 时间:2017年9月19日 环境:Windows 8.1专业版 NDK版本:android-ndk-r14b FFmpeg版本:FFmpeg 3.0.2 "Einstein&qu ...

最新文章

  1. ToDictionary的用法
  2. 面向对象的 JavaScript 编程及其 Scope 处理
  3. java 日期的加减_用java实现日期类的加减
  4. 一个方框,文字在边框上
  5. CowNew开源-sql解析引擎和cownewsql阶段成果汇报
  6. 在GWT中序列化/反序列化Json
  7. 玩转Jquery中的动画效果(animate方法)
  8. eureka-7-多网卡下的ip选择
  9. 细粒度图像分类_1.1、 图片分类
  10. android 会话 java_java – Android会话管理
  11. 几何常用算法与判断线段相交【转】
  12. 什么是 Service Mesh?
  13. ubuntu命令行语法_Linux中重定向命令行的总结(ubuntu学习第三讲)
  14. Modules Of YoloV5 Architecture
  15. Android界面绘制流程--------How Android Draws Views
  16. java实践_java基础实践
  17. 系统学习深度学习(三十)--BiLSTM
  18. 学生信息的顺序表存储
  19. Sql server 双机热备份数据库
  20. 网络棋牌游戏成为网游主流力量

热门文章

  1. 字符串拼接在Oracle和mysql中的用法
  2. CSS3 创建简单的网页动画 – 实现弹跳球动
  3. navicate使用小技巧
  4. centos7下引导win7
  5. android-hotfix(QQ空间思路)浅析
  6. 关于Memcache使用的工具类
  7. thinkphp3.2 代码生成并点击验证码
  8. nginx+php-fpm 502 bad gateway
  9. Skeljs – 用于构建响应式网站的前端开发框架
  10. FreeModbus TCP传输