android之相機開發

?http://blog.csdn.net/jason0539/article/details/10125017

android之相機開發?

分類:?android 基礎知識
Android

在android中應用相機功能,一般有兩種:一種是直接調用系統相機,一種自己寫的相機。
我將分別演示兩種方式的使用:

第一種:是使用Intent跳轉到系統相機,action為:android.media.action.STILL_IMAGE_CAMERA
關鍵代碼:

[java]?view plaincopyprint?
  1. Intent?intent?=?new?Intent();?//調用照相機??????
  2. intent.setAction("android.media.action.STILL_IMAGE_CAMERA");??????
  3. startActivity(intent);??????

例子:

[java]?view plaincopyprint?
  1. import?android.app.Activity;??????
  2. import?android.content.Intent;??????
  3. import?android.os.Bundle;??????
  4. public?class?CameraTest_2?extends?Activity?{??????
  5. ????/**?Called?when?the?activity?is?first?created.?*/??????
  6. ????@Override??????
  7. ????public?void?onCreate(Bundle?savedInstanceState)?{??????
  8. ????????super.onCreate(savedInstanceState);??????
  9. ????????setContentView(R.layout.main);??????
  10. ????????Intent?intent?=?new?Intent();?//調用照相機??????
  11. ?????????intent.setAction("android.media.action.STILL_IMAGE_CAMERA");???????
  12. ????????startActivity(intent);??????
  13. ????}??????
  14. }??????

想要測試的,可以直接新建一個項目,并且把主activity的代碼換成上面的,然后運行,我測試了一下,上面這個代碼并不
需要權限,畢竟只是調用系統自帶的程序。
當然網上還有一些其他相關的調用方法,只要設置對了action,那么系統就會調用系統自帶的相機.


第二種:
(1)首先我們要自己創建一個照相界面,必須考慮用什么控件顯示照相機中的預覽效果,顯然android已經幫我們做好了選擇,那就是SurfaceView

控制SurfaceView需要一個surfaceHolder,他是系統提供的一個用來設置SurfaceView的一個對象,可以通過surfaceView.getHolder()這個方法來獲得.

Camera提供一個setPreviewDisplay(SurfaceHolder)的方法來連接surfaceHolder,并通過他來控制surfaceView.

而我們則使用android的Camera類提供了startPreview()和stopPreview()來開啟和關閉預覽.
關系如下:
Camera -- -->SurfaceHolder------>SurfaceView.

(2)知道怎么預覽了,當然也要知道怎么開啟相機.Camera.open()這是個靜態方法,如果相機沒有別人用著,則會返回一個 相機引用,如果被人用著,則會拋出異常。很奇怪的是,這個方法,不能隨便放,如放在構造方法或者onCreate()方法中,都會照成沒有預覽效果.

(3)
SurfaceHolder.Callback,這是個holder用來顯示surfaceView 數據的接口,他分別必須實現3個方法
surfaceCreated()這個方法是surface 被創建后調用的
surfaceChanged()這個方法是當surfaceView發生改變后調用的
surfaceDestroyed()這個是當surfaceView銷毀時調用的.
surfaceHolde通過addCallBack()方法將響應的接口綁定到他身上.
surfaceHolder還必須設定一個setType()方法,查看api的時候,發現這個方法已經過時,但是不寫,又會報錯

(4)
我用以上知識寫了一個MySurfaceView類,他繼承于SurfaceView,并在里面實現了照相機的預覽功能.這個我覺得最簡單的照相機預覽代碼:
MySurfaceView.java:

[java]?view plaincopyprint?
  1. import?java.io.IOException;??????
  2. import?android.content.Context;??????
  3. import?android.graphics.PixelFormat;??????
  4. import?android.hardware.Camera;??????
  5. import?android.util.Log;??????
  6. import?android.view.SurfaceHolder;??????
  7. import?android.view.SurfaceView;??????
  8. public?class?MySurfaceView?extends?SurfaceView?implements?SurfaceHolder.Callback{??????
  9. ????SurfaceHolder?holder;??????
  10. ????Camera?myCamera;??????
  11. ????public?MySurfaceView(Context?context)??????
  12. ????{??????
  13. ????????super(context);??????
  14. ????????holder?=?getHolder();//獲得surfaceHolder引用??????
  15. ?????????holder.addCallback(this);??????
  16. ????????holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);//設置類型????????
  17. ????}??
  18. ????@Override??????
  19. ????public?void?surfaceCreated(SurfaceHolder?holder)?{??????
  20. ????????//?TODO?Auto-generated?method?stub??????
  21. ????????if(myCamera?==?null)??????
  22. ????????{??????
  23. ????????????myCamera?=?Camera.open();//開啟相機,不能放在構造函數中,不然不會顯示畫面.??????
  24. ????????????try?{??????
  25. ????????????????myCamera.setPreviewDisplay(holder);??????
  26. ????????????}?catch?(IOException?e)?{??????
  27. ????????????????//?TODO?Auto-generated?catch?block??????
  28. ????????????????e.printStackTrace();??????
  29. ????????????}??????
  30. ????????}?????????????
  31. ????}??????
  32. ????@Override??????
  33. ????public?void?surfaceChanged(SurfaceHolder?holder,?int?format,?int?width,??????
  34. ????????????int?height)?{??????
  35. ????????myCamera.startPreview();??????????????
  36. ????}??????
  37. ????????@Override??????
  38. ????public?void?surfaceDestroyed(SurfaceHolder?holder)?{??????
  39. ????????//?TODO?Auto-generated?method?stub??????
  40. ????????myCamera.stopPreview();//停止預覽??????
  41. ?????????myCamera.release();//釋放相機資源??????
  42. ?????????myCamera?=?null;??????
  43. ????????Log.d("ddd",?"4");????????
  44. ????}??????
  45. }??????

主activity代碼:

[java]?view plaincopyprint?
  1. import?android.app.Activity;??????
  2. import?android.os.Bundle;??????
  3. import?android.view.View;??????
  4. import?android.view.View.OnClickListener;??????
  5. public?class?CameraTest_3?extends?Activity??{??????
  6. ????/**?Called?when?the?activity?is?first?created.?*/??????
  7. ????MySurfaceView?mySurface;??????
  8. ????@Override??????
  9. ????public?void?onCreate(Bundle?savedInstanceState)?{??????
  10. ????????super.onCreate(savedInstanceState);??????
  11. ????????mySurface?=?new?MySurfaceView(this);??????
  12. ????????setContentView(mySurface);??????
  13. ????}??????
  14. }??????

而且必須給應用添加權限:

[html]?view plaincopyprint?
  1. <uses-permission?android:name="android.permission.CAMERA"></uses-permission>??

(5)能夠預覽了,接下來就是拍照了,拍照用到了一個camera.tackPiture()這個方法,這個方法,有三個參數分別是
ShutterCallBack shutter,PictureCallBack raw,PictureCallBack jpeg.
下面是對他們的實現

[java]?view plaincopyprint?
  1. private?ShutterCallback?shutter?=?new?ShutterCallback()?{??????
  2. ??????????
  3. ????@Override??????
  4. ????public?void?onShutter()?{??????
  5. ????????//?TODO?Auto-generated?method?stub??????
  6. ????????Log.d("ddd",?"shutter");??????????
  7. ????}??????
  8. };??????
  9. private?PictureCallback?raw?=?new?PictureCallback()?{??????
  10. ??????????
  11. ????@Override??????
  12. ????public?void?onPictureTaken(byte[]?data,?Camera?camera)?{??????
  13. ????????//?TODO?Auto-generated?method?stub??????
  14. ????????Log.d("ddd",?"raw");????????
  15. ????}??????
  16. };??????
  17. private?PictureCallback?jpeg?=?new?PictureCallback()?{??????
  18. ??????????
  19. ????@Override??????
  20. ????public?void?onPictureTaken(byte[]?data,?Camera?camera)?{??????
  21. ????????//?TODO?Auto-generated?method?stub??????
  22. ????????Log.d("ddd","jpeg");????????
  23. ????}??????
  24. };??????

當開始拍照時,會依次調用shutter的onShutter()方法,raw的onPictureTaken方法,jpeg的onPictureTaken方法.
三個參數的作用是shutter--拍照瞬間調用,raw--獲得沒有壓縮過的圖片數據,jpeg---返回jpeg的圖片數據
當你不需要對照片進行處理,可以直接用null代替.
注意,當調用camera.takePiture方法后,camera關閉了預覽,這時需要調用startPreview()來重新開啟預覽。


我用以上知識,加到上面的那個例子,就形成了下面的代碼:
MySurfaceView.java:

[java]?view plaincopyprint?
  1. package?jason.camera;??????
  2. import?java.io.IOException;??????
  3. import?android.content.Context;??????
  4. import?android.graphics.PixelFormat;??????
  5. import?android.hardware.Camera;??????
  6. import?android.hardware.Camera.PictureCallback;??????
  7. import?android.hardware.Camera.ShutterCallback;??????
  8. import?android.util.Log;??????
  9. import?android.view.SurfaceHolder;??????
  10. import?android.view.SurfaceView;??????
  11. public?class?MySurfaceView?extends?SurfaceView?implements?SurfaceHolder.Callback{??????
  12. ????SurfaceHolder?holder;??????
  13. ????Camera?myCamera;??????
  14. ????private?ShutterCallback?shutter?=?new?ShutterCallback()?{??????
  15. ??????????????
  16. ????????@Override??????
  17. ????????public?void?onShutter()?{??????
  18. ????????????//?TODO?Auto-generated?method?stub??????
  19. ????????????Log.d("ddd",?"shutter");??????
  20. ??????????????????
  21. ????????}??????
  22. ????};??????
  23. ????private?PictureCallback?raw?=?new?PictureCallback()?{??????
  24. ??????????????
  25. ????????@Override??????
  26. ????????public?void?onPictureTaken(byte[]?data,?Camera?camera)?{??????
  27. ????????????//?TODO?Auto-generated?method?stub??????
  28. ????????????Log.d("ddd",?"raw");??????
  29. ??????????????????
  30. ????????}??????
  31. ????};??????
  32. ????private?PictureCallback?jpeg?=?new?PictureCallback()?{??????
  33. ??????????????
  34. ????????@Override??????
  35. ????????public?void?onPictureTaken(byte[]?data,?Camera?camera)?{??????
  36. ????????????//?TODO?Auto-generated?method?stub??????
  37. ????????????Log.d("ddd","jpeg");??????
  38. ??????????????????
  39. ????????}??????
  40. ????};??????
  41. ????public?MySurfaceView(Context?context)??????
  42. ????{??????
  43. ????????super(context);??????
  44. ????????holder?=?getHolder();//獲得surfaceHolder引用??????
  45. ?????????holder.addCallback(this);??????
  46. ????????holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);//設置類型????????
  47. ????}??????
  48. ????public?void?tackPicture()??????
  49. ????{??????
  50. ????????myCamera.takePicture(null,null,null);??????
  51. ????}??????
  52. ????public?void?voerTack()??????
  53. ????{??????
  54. ????????myCamera.startPreview();??????
  55. ????}??????
  56. ????@Override??????
  57. ????public?void?surfaceChanged(SurfaceHolder?holder,?int?format,?int?width,??????
  58. ????????????int?height)?{??????
  59. ????????myCamera.startPreview();??????????????
  60. ????}??????
  61. ????@Override??????
  62. ????public?void?surfaceCreated(SurfaceHolder?holder)?{??????
  63. ????????//?TODO?Auto-generated?method?stub??????
  64. ????????if(myCamera?==?null)??????
  65. ????????{??????
  66. ????????????myCamera?=?Camera.open();//開啟相機,不能放在構造函數中,不然不會顯示畫面.??????
  67. ????????????try?{??????
  68. ????????????????myCamera.setPreviewDisplay(holder);??????
  69. ????????????}?catch?(IOException?e)?{??????
  70. ????????????????//?TODO?Auto-generated?catch?block??????
  71. ????????????????e.printStackTrace();??????
  72. ????????????}??????
  73. ????????}?????????????
  74. ????}??????
  75. ????@Override??????
  76. ????public?void?surfaceDestroyed(SurfaceHolder?holder)?{??????
  77. ????????//?TODO?Auto-generated?method?stub??????
  78. ????????myCamera.stopPreview();//停止預覽??????
  79. ?????????myCamera.release();//釋放相機資源??????
  80. ?????????myCamera?=?null;??????
  81. ??????????????????
  82. ????}??????
  83. }??????

主activity:

[java]?view plaincopyprint?
  1. import?android.app.Activity;??????
  2. import?android.os.Bundle;??????
  3. import?android.view.View;??????
  4. import?android.view.View.OnClickListener;??????
  5. public?class?CameraTest_3?extends?Activity?implements?OnClickListener??{??????
  6. ????/**?Called?when?the?activity?is?first?created.?*/??????
  7. ????MySurfaceView?mySurface;??????
  8. ????boolean?isClicked?=?false;??????
  9. ????@Override??????
  10. ????public?void?onCreate(Bundle?savedInstanceState)?{??????
  11. ????????super.onCreate(savedInstanceState);??????
  12. ????????mySurface?=?new?MySurfaceView(this);??????
  13. ????????setContentView(mySurface);??????
  14. ????????mySurface.setOnClickListener(this);??????
  15. ????}??????
  16. ????@Override??????
  17. ????public?void?onClick(View?v)?{??????
  18. ????????//?TODO?Auto-generated?method?stub??????
  19. ????????if(!isClicked)??????
  20. ????????{??????
  21. ????????????mySurface.tackPicture();??????
  22. ????????????isClicked?=?true;??????
  23. ????????}else??????
  24. ????????{??????
  25. ????????????mySurface.voerTack();??????
  26. ????????????isClicked?=?false;??????
  27. ??????????????????
  28. ????????}??????
  29. ??????????????
  30. ????}??????

這樣就是實現了拍照的功能,那么怎樣要圖片保存呢?那么這是就需要在那個參數中的jpeg的
方法里面進行處理了,那個方法的data參數,就是相片的數據。
我們通過BitmapFactory.decodeByteArray(data, 0, data.length)來獲得圖片并通過io處理,將圖片保存到想要保存的位置
下面這段代碼,是將照片保存到/sdcard/wjh.jpg;并把一些沒有用到的代碼全部刪掉,剩下一些必須的代碼

[java]?view plaincopyprint?
  1. package?java.camera;??????
  2. import?java.io.BufferedInputStream;??????
  3. import?java.io.BufferedOutputStream;??????
  4. import?java.io.File;??????
  5. import?java.io.FileOutputStream;??????
  6. import?java.io.IOException;??????
  7. import?java.io.OutputStream;??????
  8. import?android.content.Context;??????
  9. import?android.graphics.Bitmap;??????
  10. import?android.graphics.BitmapFactory;??????
  11. import?android.graphics.PixelFormat;??????
  12. import?android.hardware.Camera;??????
  13. import?android.hardware.Camera.PictureCallback;??????
  14. import?android.hardware.Camera.ShutterCallback;??????
  15. import?android.util.Log;??????
  16. import?android.view.SurfaceHolder;??????
  17. import?android.view.SurfaceView;??????
  18. public?class?MySurfaceView?extends?SurfaceView?implements?SurfaceHolder.Callback{??????
  19. ????SurfaceHolder?holder;??????
  20. ????Camera?myCamera;??????
  21. ????private?PictureCallback?jpeg?=?new?PictureCallback()?{??????
  22. ??????????????
  23. ????????@Override??????
  24. ????????public?void?onPictureTaken(byte[]?data,?Camera?camera)?{??????
  25. ????????????//?TODO?Auto-generated?method?stub??????
  26. ????????????try??????
  27. ????????????{??????
  28. ????????????????Bitmap?bm?=?BitmapFactory.decodeByteArray(data,?0,?data.length);??????
  29. ????????????????File?file?=?new?File("/sdcard/wjh.jpg");??????
  30. ????????????????BufferedOutputStream?bos???????
  31. ????????????????=?new?BufferedOutputStream(new?FileOutputStream(file));??????
  32. ????????????????bm.compress(Bitmap.CompressFormat.JPEG,100,bos);??????
  33. ????????????????bos.flush();??????
  34. ????????????????bos.close();??????
  35. ????????????}catch(Exception?e)??????
  36. ????????????{??????
  37. ????????????????e.printStackTrace();??????
  38. ????????????}??????
  39. ????????}??????
  40. ????};??????
  41. ????public?MySurfaceView(Context?context)??????
  42. ????{??????
  43. ????????super(context);??????
  44. ????????holder?=?getHolder();//獲得surfaceHolder引用??????
  45. ?????????holder.addCallback(this);??????
  46. ????????holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);//設置類型????????
  47. ????}??????
  48. ????public?void?tackPicture()??????
  49. ????{??????
  50. ????????myCamera.takePicture(null,null,jpeg);??????
  51. ????}??????
  52. ????public?void?voerTack()??????
  53. ????{??????
  54. ????????myCamera.startPreview();??????
  55. ????}??????
  56. ????@Override??????
  57. ????public?void?surfaceChanged(SurfaceHolder?holder,?int?format,?int?width,??????
  58. ????????????int?height)?{??????
  59. ????????myCamera.startPreview();??????????????
  60. ????}??????
  61. ????@Override??????
  62. ????public?void?surfaceCreated(SurfaceHolder?holder)?{??????
  63. ????????//?TODO?Auto-generated?method?stub??????
  64. ????????if(myCamera?==?null)??????
  65. ????????{??????
  66. ????????????myCamera?=?Camera.open();//開啟相機,不能放在構造函數中,不然不會顯示畫面.??????
  67. ????????????try?{??????
  68. ????????????????myCamera.setPreviewDisplay(holder);??????
  69. ????????????}?catch?(IOException?e)?{??????
  70. ????????????????//?TODO?Auto-generated?catch?block??????
  71. ????????????????e.printStackTrace();??????
  72. ????????????}??????
  73. ????????}?????????????
  74. ????}??????
  75. ????@Override??????
  76. ????public?void?surfaceDestroyed(SurfaceHolder?holder)?{??????
  77. ????????//?TODO?Auto-generated?method?stub??????
  78. ????????myCamera.stopPreview();//停止預覽??????
  79. ????????myCamera.release();//釋放相機資源??????
  80. ????????myCamera?=?null;??????
  81. ????}??????
  82. }??????

注意,這是必須添加在sd卡上寫數據的權限

[html]?view plaincopyprint?
  1. <uses-permission?android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>??

(7)能夠拍照了,這下子要考慮如何讓圖片更好看了,這顯然是專業人士的強項,但是我們在程序上,也可以做一些處理,
向上面的那些,因為我直接把surfaceView當做整體布局,就可能出現屏幕被拉開了,不是很好看,所以這時,就可以不要把
surfaceView弄成整體布局,把他弄到一個布局管理器,再設置相關的參數.
這時需要注意的是有些參數不能隨便亂設
如以下代碼:

[java]?view plaincopyprint?
  1. Camera.Parameters?parames?=?myCamera.getParameters();//獲得參數對象??
  2. parames.setPictureFormat(PixelFormat.JPEG);//設置圖片格式??
  3. parames.setPreviewSize(640,480);//這里面的參數只能是幾個特定的參數,否則會報錯.(176*144,320*240,352*288,480*360,640*480)??
  4. myCamera.setParameters(parames);??

還有自動對焦,當然有些手機沒有這個功能,自動對焦是通過autoFocus()這個方法調用一個自動對焦的接口,并在里面進行處理。
注意,這個方法必須在startPreview()和stopPreview()中間。
AutoFocusCallback是自動對焦的接口,實現它必須實現public void onAutoFocus(boolean success, Camera camera)這個方法,
所以我們可以將拍照方法放在這里面,然后對焦后再進行拍攝。。效果會好很多。
注意自動對焦需要添加

[html]?view plaincopyprint?
  1. <uses-feature?android:name="android.hardware.camera.autofocus"?/>??

?

下面是主要代碼,直接貼出來了

[java]?view plaincopyprint?
  1. import?java.io.BufferedOutputStream;??????
  2. import?java.io.File;??????
  3. import?java.io.FileOutputStream;??????
  4. import?java.io.IOException;??????
  5. import?android.app.Activity;??????
  6. import?android.content.pm.ActivityInfo;??????
  7. import?android.graphics.Bitmap;??????
  8. import?android.graphics.BitmapFactory;??????
  9. import?android.graphics.PixelFormat;??????
  10. import?android.hardware.Camera;??????
  11. import?android.hardware.Camera.AutoFocusCallback;??????
  12. import?android.hardware.Camera.PictureCallback;??????
  13. import?android.os.Bundle;??????
  14. import?android.view.SurfaceHolder;??????
  15. import?android.view.SurfaceView;??????
  16. import?android.view.View;??????
  17. import?android.view.Window;??????
  18. import?android.view.SurfaceHolder.Callback;??????
  19. import?android.view.View.OnClickListener;??????
  20. public?class?CameraTest_4?extends?Activity?implements??????
  21. Callback,?OnClickListener,?AutoFocusCallback{??????
  22. ????SurfaceView?mySurfaceView;//surfaceView聲明??????
  23. ????SurfaceHolder?holder;//surfaceHolder聲明??????
  24. ????Camera?myCamera;//相機聲明??????
  25. ????String?filePath="/sdcard/wjh.jpg";//照片保存路徑??????
  26. ????boolean?isClicked?=?false;//是否點擊標識??????
  27. ????//創建jpeg圖片回調數據對象??????
  28. ????PictureCallback?jpeg?=?new?PictureCallback()?{??????
  29. ??????????????
  30. ????????@Override??????
  31. ????????public?void?onPictureTaken(byte[]?data,?Camera?camera)?{??????
  32. ????????????//?TODO?Auto-generated?method?stub??????
  33. ????????????try??????
  34. ????????????{//?獲得圖片??????
  35. ????????????Bitmap?bm?=?BitmapFactory.decodeByteArray(data,?0,?data.length);??????
  36. ????????????File?file?=?new?File(filePath);??????
  37. ????????????BufferedOutputStream?bos?=??????
  38. ????????????????new?BufferedOutputStream(new?FileOutputStream(file));??????
  39. ????????????bm.compress(Bitmap.CompressFormat.JPEG,?100,?bos);//將圖片壓縮到流中??????
  40. ????????????bos.flush();//輸出??????
  41. ????????????bos.close();//關閉??????
  42. ????????????}catch(Exception?e)??????
  43. ????????????{??????
  44. ????????????????e.printStackTrace();??????
  45. ????????????}??????
  46. ??????????????????
  47. ????????}??????
  48. ????};??????
  49. ????/**?Called?when?the?activity?is?first?created.?*/??????
  50. ????@Override??????
  51. ????public?void?onCreate(Bundle?savedInstanceState)?{??????
  52. ????????super.onCreate(savedInstanceState);??????
  53. ????????requestWindowFeature(Window.FEATURE_NO_TITLE);//無標題?????????????????
  54. ????????//設置拍攝方向??????
  55. ????????this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);??????
  56. ????????setContentView(R.layout.main);??????
  57. ????????//獲得控件??????
  58. ????????mySurfaceView?=?(SurfaceView)findViewById(R.id.surfaceView1);??????
  59. ????????//獲得句柄??????
  60. ????????holder?=?mySurfaceView.getHolder();??????
  61. ????????//添加回調??????
  62. ????????holder.addCallback(this);??????
  63. ????????//設置類型??????
  64. ????????holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);??????
  65. ????????//設置監聽??????
  66. ????????mySurfaceView.setOnClickListener(this);??????
  67. ????}??????
  68. ????@Override??????
  69. ????public?void?surfaceChanged(SurfaceHolder?holder,?int?format,?int?width,??????
  70. ????????????int?height)?{??????
  71. ????????//?TODO?Auto-generated?method?stub??????
  72. ????????//設置參數并開始預覽??????
  73. ????????Camera.Parameters?params?=?myCamera.getParameters();??????
  74. ????????params.setPictureFormat(PixelFormat.JPEG);??????
  75. ????????params.setPreviewSize(640,480);??????
  76. ????????myCamera.setParameters(params);??????
  77. ????????myCamera.startPreview();??????
  78. ??????????????
  79. ????}??????
  80. ????@Override??????
  81. ????public?void?surfaceCreated(SurfaceHolder?holder)?{??????
  82. ????????//?TODO?Auto-generated?method?stub??????
  83. ????????//開啟相機??????
  84. ????????if(myCamera?==?null)??????
  85. ????????{??????
  86. ????????????myCamera?=?Camera.open();??????
  87. ????????????try?{??????
  88. ????????????????myCamera.setPreviewDisplay(holder);??????
  89. ????????????}?catch?(IOException?e)?{??????
  90. ????????????????//?TODO?Auto-generated?catch?block??????
  91. ????????????????e.printStackTrace();??????
  92. ????????????}??????
  93. ????????}??????
  94. ??????????????
  95. ????}??????
  96. ????@Override??????
  97. ????public?void?surfaceDestroyed(SurfaceHolder?holder)?{??????
  98. ????????//?TODO?Auto-generated?method?stub??????
  99. ????????//關閉預覽并釋放資源??????
  100. ????????myCamera.stopPreview();??????
  101. ????????myCamera.release();??????
  102. ????????myCamera?=?null;??????
  103. ??????????????
  104. ????}??????
  105. ????@Override??????
  106. ????public?void?onClick(View?v)?{??????
  107. ????????//?TODO?Auto-generated?method?stub??????
  108. ????????if(!isClicked)??????
  109. ????????{??????
  110. ????????????myCamera.autoFocus(this);//自動對焦??????
  111. ????????????isClicked?=?true;??????
  112. ????????}else??????
  113. ????????{??????
  114. ????????????myCamera.startPreview();//開啟預覽??????
  115. ????????????isClicked?=?false;??????
  116. ????????}??????
  117. ??????????????
  118. ????}??????
  119. ????@Override??????
  120. ????public?void?onAutoFocus(boolean?success,?Camera?camera)?{??????
  121. ????????//?TODO?Auto-generated?method?stub??????
  122. ????????if(success)??????
  123. ????????{??????
  124. ????????????//設置參數,并拍照??????
  125. ????????????Camera.Parameters?params?=?myCamera.getParameters();??????
  126. ????????????params.setPictureFormat(PixelFormat.JPEG);??????
  127. ????????????params.setPreviewSize(640,480);??????
  128. ????????????myCamera.setParameters(params);??????
  129. ????????????myCamera.takePicture(null,?null,?jpeg);??????
  130. ????????}??????
  131. ??????????????
  132. ????}??????
  133. }??????

main.xml:

[html]?view plaincopyprint?
  1. <linearlayout?xmlns:android="http://schemas.android.com/apk/res/android"?????
  2. ????androidrientation="vertical"??????
  3. ????android:layout_width="fill_parent"??????
  4. ????android:layout_height="fill_parent"??????
  5. ????>??????
  6. ????<surfaceview?android:id="@+id/surfaceView1"?????
  7. ?????android:layout_width="640px"??????
  8. ?????android:layout_height="480px"??????
  9. ?????android:layout_gravity="center">??????

AndroidManifest.xml:

[html]?view plaincopyprint?
  1. <?xml?version="1.0"?encoding="utf-8"?>????
  2. <manifest?xmlns:android="http://schemas.android.com/apk/res/android"????
  3. ??????package="com.wjh.camera"????
  4. ??????android:versionCode="1"????
  5. ??????android:versionName="1.0">????
  6. ????<uses-sdk?android:minSdkVersion="7"?/>????
  7. ????<uses-permission?android:name="android.permission.CAMERA"></uses-permission>????
  8. ????<uses-feature?android:name="android.hardware.camera.autofocus"?/>????
  9. ????????<uses-permission?android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>????
  10. ????<application?android:icon="@drawable/icon"?android:label="@string/app_name">????
  11. ????????<activity?android:name=".CameraTest_4"????
  12. ??????????????????android:label="@string/app_name">????
  13. ????????????<intent-filter>????
  14. ????????????????<action?android:name="android.intent.action.MAIN"?/>????
  15. ????????????????<category?android:name="android.intent.category.LAUNCHER"?/>????
  16. ????????????</intent-filter>????
  17. ????????</activity>????
  18. ????</application>????
  19. </manifest>????

?

PS:其實自己去實現相機的必要性不大,大部分應用都是直接調用系統的相機,畢竟相機是涉及到一些比較專業的成像知識.

轉載于:https://www.cnblogs.com/qingchen1984/p/4766395.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/375594.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/375594.shtml
英文地址,請注明出處:http://en.pswp.cn/news/375594.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

文件和文件夾權限-Win7公共盤中出現大量臨時文件

公司中有一個文件服務器&#xff0c;給不同部門和員工設置了不同的權限&#xff0c;最近有員工&#xff08;沒有修改權限&#xff0c;有讀取及執行,讀取,寫入&#xff09;反映在公共盤上修改文件的時候會產生大量的臨時文件&#xff0c;添加上修改權限之后就可以了&#xff0c;…

Duilib編輯框Edit輸入完自動跳到下一個編輯框

首先xml文件中設置edit的maxchar參數&#xff0c;默認255好像。 <edit maxchar"10" />然后在notify函數中加入以下代碼 if (msg.sType _T("textchanged")) {if (static_cast<CEditUI*>(msg.pSender)->GetMaxChar() msg.pSender->GetT…

Mysql數據庫安全管理配置

1.刪除test庫 原因&#xff1a; The default MySQL installation comes with a database named test that anyone can access. This database is intended only for tutorials, samples, testing, etc. Databases named "test" and also databases with names starti…

duilib清空richedit內容

推薦使用以下方法&#xff1a; m_pRichEdit->SetSelAll(); m_pRichEdit->Clear();不推薦使用以下方法&#xff1a; m_pRichEdit->SetText("");雖然效果是一樣的&#xff0c;但是當編輯框中文本存在多種格式的時候&#xff0c;第二種方法會存在問題&#x…

新學了一個用python編寫的簡單的百度貼吧帖子的爬蟲

# -*- coding: utf-8 -*- #--------------------------------------- # 作者&#xff1a;chendn # 語言&#xff1a;Python 2.7.10 #---------------------------------------import string,urllib2 def tieba(url,beginPage,endPage):for i in range(beginPage,endPage1):…

duilib自定義消息

/** NOTE: All Message Numbers below 0x0400 are RESERVED.** Private Window Messages Start Here:*/ #define WM_USER 0x0400從WM_USER往上加就行了

BZOJ 2190儀仗隊【歐拉函數】

問題的唯一難點就是如何表示隊長能看到的人數&#xff1f;如果建系&#xff0c;隊長所在的點為&#xff08;0,0&#xff09;分析幾組數據就一目了然了&#xff0c;如果隊長能看到的點為(m,n),那么gcd&#xff08;m&#xff0c;n&#xff09;1即m n 互質或者是&#xff08;0,1&a…

Codeforces Round #318 (Div. 2) B Bear and Three Musketeers (暴力)

算一下復雜度。發現可以直接暴。對于u枚舉a和b&#xff0c;判斷一下是否連邊&#xff0c;更新答案。 #include<bits/stdc.h> using namespace std;int n,m; const int maxn 4001; #define PB push_back vector<int> G[maxn]; bool g[maxn][maxn]; int deg[maxn]; …

form表單,submit,ajax提交

尼瑪... 一個簡單的表單提交&#xff0c;竟然給我整的直郁悶。 本來就是個保存功能&#xff0c;幾個前人都用的ajax提交&#xff0c;我也就沒改成submit。然后坑爹的就來了。 我在表單里寫了個<form></form>&#xff08;實際用ajax提交&#xff0c;也沒必要寫這個標…

windows 文件對話框

https://docs.microsoft.com/zh-cn/previous-versions/windows/desktop/legacy/bb776913(vvs.85)

python開發技術詳解(一)

python是一門簡單靈動的語言。從今天開始我要每天都做筆記&#xff0c;每天都要寫博客記錄我所想&#xff0c;我所學到的。 筆記提綱&#xff1a; 1&#xff0c;python的簡單介紹&#xff0c;python的編譯用法&#xff0c;有什么要注意的。 2&#xff0c;命名規則 3&#xff0c…

(Android Studio)添加文本框

此文大部分摘自http://hukai.me/android-training-course-in-chinese/basics/firstapp/building-ui.html android : id 這是定義View的唯一標識符。可以在程序代碼中通過該標識符對對象進行引用&#xff0c;例如對這個對象進行讀和修改的操作(在下一課里將會用到)。 當想從XML里…

java final keyword

依據上下文環境&#xff0c;java的keywordfinal也存在著細微的差別&#xff0c;但通常指的是“這是無法改變的。”不想改變的理由由兩種&#xff1a;一種是效率&#xff0c;還有一種是設計。因為兩個原因相差非常遠&#xff0c;所以關鍵子final可能被吳用。 接下來介紹一下使用…

聽GPT 講Rust源代碼--src/tools(24)

File: rust/src/tools/clippy/clippy_lints/src/types/borrowed_box.rs 在Rust源代碼中的rust/src/tools/clippy/clippy_lints/src/types/borrowed_box.rs文件是Clippy項目的一個規則&#xff0c;用于檢查可能是誤用或錯誤的Box引用情況。 Rust中的Box是一個堆分配的值的所有權…

遞歸乘法

遞歸乘法。 寫一個遞歸函數&#xff0c;不使用 * 運算符&#xff0c; 實現兩個正整數的相乘。可以使用加號、減號、位移&#xff0c;但要吝嗇一些。 示例1: 輸入&#xff1a;A 1, B 10輸出&#xff1a;10示例2: 輸入&#xff1a;A 3, B 4輸出&#xff1a;12提示: 保證乘法…

Building a RESTful Web Service

http://spring.io/guides/gs/rest-service/ Should shutdown tomcat service first , and then java -jar *.jar轉載于:https://www.cnblogs.com/churuosi/p/4774151.html

IOS的各種手勢

轉自http://blog.csdn.net/likendsl/article/details/7554150 一、概述 iPhone中處理觸摸屏的操作&#xff0c;在3.2之前是主要使用的是由UIResponder而來的如下4種方式&#xff1a; - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event - (void)touchesCancell…

duilib獲取字符串的像素長

CDuiString m_test_string _T("測試字符串")HDC m_hDc m_pm.GetPaintDC();// 100 是xml中配置的字體的編號HFONT hFont m_pm.GetFont(100);::SelectObject(m_hDc, hFont);SIZE size;GetTextExtentPoint32(m_hDc, m_test_string, i, &size);return size.cxThe …

(轉)rvm安裝與常用命令

rvm是一個命令行工具&#xff0c;可以提供一個便捷的多版本ruby環境的管理和切換。 https://rvm.io/ 如果你打算學習ruby/rails, rvm是必不可少的工具之一。 這里所有的命令都是再用戶權限下操作的&#xff0c;任何命令最好都不要用sudo. rvm安裝 $ curl -L get.rvm.io | bash …