歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Android多媒體應用開發-控制攝像頭拍照

Android多媒體應用開發-控制攝像頭拍照

日期:2017/3/1 10:14:09   编辑:Linux編程

Android多媒體應用開發-控制攝像頭拍照

現在的手機的功能可謂是五花八門,手機照相功能就是特別突出的一點,現在的手機照相機甚至成了專業數碼照相機,可以拍攝出清晰的照片和錄制高分辨率的視頻。Android操作系統呢,提供了相應的功能來控制拍照:

通過Camera進行拍照

1.調用Camera的open()方法打開相機。

2.調用Camera的setParameters()方法獲取拍照參數。該方法返回一個Camera.Parameters對象。

3.調用Camera.Paramers對象方法設置拍照參數

4.調用Camera的startPreview()方法開始預覽取景,在預覽取景之前需要調用Camera的setPreViewDisplay(SurfaceHolder holder)方法設置使用哪個SurfaceView來顯示取景圖片。

5.調用Camera的takePicture()方法進行拍照.

6.結束程序時,調用Camera的StopPriview()結束取景預覽,並調用release()方法釋放資源.

創建項目:CaptureImage

運行效果:

程序代碼:

==>CaptureImage.java

  1. package org.wwj.sound;
  2. import java.io.File;
  3. import java.io.FileOutputStream;
  4. import java.io.IOException;
  5. import android.app.Activity;
  6. import android.app.AlertDialog;
  7. import android.content.Context;
  8. import android.content.DialogInterface;
  9. import android.content.DialogInterface.OnClickListener;
  10. import android.graphics.Bitmap;
  11. import android.graphics.Bitmap.CompressFormat;
  12. import android.graphics.BitmapFactory;
  13. import android.graphics.PixelFormat;
  14. import android.hardware.Camera;
  15. import android.hardware.Camera.PictureCallback;
  16. import android.os.Bundle;
  17. import android.os.Environment;
  18. import android.view.Display;
  19. import android.view.KeyEvent;
  20. import android.view.SurfaceHolder;
  21. import android.view.SurfaceHolder.Callback;
  22. import android.view.SurfaceView;
  23. import android.view.View;
  24. import android.view.Window;
  25. import android.view.WindowManager;
  26. import android.widget.EditText;
  27. import android.widget.ImageView;
  28. public class CaptureImage extends Activity
  29. {
  30. SurfaceView sView;
  31. SurfaceHolder surfaceHolder;
  32. int screenWidth, screenHeight;
  33. // 定義系統所用的照相機
  34. Camera camera;
  35. //是否在浏覽中
  36. boolean isPreview = false;
  37. @Override
  38. public void onCreate(Bundle savedInstanceState)
  39. {
  40. super.onCreate(savedInstanceState);
  41. // 設置全屏
  42. requestWindowFeature(Window.FEATURE_NO_TITLE);
  43. getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
  44. WindowManager.LayoutParams.FLAG_FULLSCREEN);
  45. setContentView(R.layout.main);
  46. WindowManager wm = (WindowManager) getSystemService(
  47. Context.WINDOW_SERVICE);
  48. Display display = wm.getDefaultDisplay();
  49. // 獲取屏幕的寬和高
  50. screenWidth = display.getWidth();
  51. screenHeight = display.getHeight();
  52. // 獲取界面中SurfaceView組件
  53. sView = (SurfaceView) findViewById(R.id.sView);
  54. // 獲得SurfaceView的SurfaceHolder
  55. surfaceHolder = sView.getHolder();
  56. // 為surfaceHolder添加一個回調監聽器
  57. surfaceHolder.addCallback(new Callback()
  58. {
  59. public void surfaceChanged(SurfaceHolder holder, int format, int width,
  60. int height)
  61. {
  62. }
  63. public void surfaceCreated(SurfaceHolder holder)
  64. {
  65. // 打開攝像頭
  66. initCamera();
  67. }
  68. public void surfaceDestroyed(SurfaceHolder holder)
  69. {
  70. // 如果camera不為null ,釋放攝像頭
  71. if (camera != null)
  72. {
  73. if (isPreview)
  74. camera.stopPreview();
  75. camera.release();
  76. camera = null;
  77. }
  78. }
  79. });
  80. // 設置該SurfaceView自己不維護緩沖
  81. surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
  82. }
  83. private void initCamera()
  84. {
  85. if (!isPreview)
  86. {
  87. camera = Camera.open();
  88. }
  89. if (camera != null && !isPreview)
  90. {
  91. try
  92. {
  93. Camera.Parameters parameters = camera.getParameters();
  94. // 設置預覽照片的大小
  95. parameters.setPreviewSize(screenWidth, screenHeight);
  96. // 每秒顯示4幀
  97. parameters.setPreviewFrameRate(4);
  98. // 設置圖片格式
  99. parameters.setPictureFormat(PixelFormat.JPEG);
  100. // 設置JPG照片的質量
  101. parameters.set("jpeg-quality", 85);
  102. //設置照片的大小
  103. parameters.setPictureSize(screenWidth, screenHeight);
  104. camera.setParameters(parameters);
  105. //通過SurfaceView顯示取景畫面
  106. camera.setPreviewDisplay(surfaceHolder);
  107. // 開始預覽
  108. camera.startPreview();
  109. // 自動對焦
  110. camera.autoFocus(null);
  111. }
  112. catch (Exception e)
  113. {
  114. e.printStackTrace();
  115. }
  116. isPreview = true;
  117. }
  118. }
  119. @Override
  120. public boolean onKeyDown(int keyCode, KeyEvent event)
  121. {
  122. switch (keyCode)
  123. {
  124. // 當用戶單擊照相鍵、中央鍵時執行拍照
  125. case KeyEvent.KEYCODE_DPAD_CENTER:
  126. case KeyEvent.KEYCODE_CAMERA:
  127. if (camera != null && event.getRepeatCount() == 0)
  128. {
  129. // 拍照
  130. camera.takePicture(null, null , myjpegCallback);
  131. return true;
  132. }
  133. break;
  134. }
  135. return super.onKeyDown(keyCode, event);
  136. }
  137. PictureCallback myjpegCallback = new PictureCallback()
  138. {
  139. public void onPictureTaken(byte[] data, Camera camera)
  140. {
  141. // 根據拍照所得的數據創建位圖
  142. final Bitmap bm = BitmapFactory.decodeByteArray(data
  143. , 0, data.length);
  144. // 加載/layout/save.xml文件對應的布局資源
  145. View saveDialog = getLayoutInflater().inflate(
  146. R.layout.save, null);
  147. final EditText photoName = (EditText) saveDialog
  148. .findViewById(R.id.photo_name);
  149. // 獲取saveDialog對話框上的ImageView組件
  150. ImageView show = (ImageView) saveDialog.findViewById(R.id.show);
  151. // 顯示剛剛拍得的照片
  152. show.setImageBitmap(bm);
  153. //使用對話框顯示saveDialog組件
  154. new AlertDialog.Builder(CaptureImage.this)
  155. .setView(saveDialog)
  156. .setPositiveButton("保存", new OnClickListener()
  157. {
  158. public void onClick(DialogInterface dialog,
  159. int which)
  160. {
  161. // 創建一個位於SD卡上的文件
  162. File file = new File(Environment.getExternalStorageDirectory()
  163. , photoName.getText().toString() + ".jpg");
  164. FileOutputStream outStream = null;
  165. try
  166. {
  167. // 打開指定文件對應的輸出流
  168. outStream = new FileOutputStream(file);
  169. // 把位圖輸出到指定文件中
  170. bm.compress(CompressFormat.JPEG, 100, outStream);
  171. outStream.close();
  172. }
  173. catch (IOException e)
  174. {
  175. e.printStackTrace();
  176. }
  177. }
  178. })
  179. .setNegativeButton("取消", null)
  180. .show();
  181. //重新浏覽
  182. camera.stopPreview();
  183. camera.startPreview();
  184. isPreview = true;
  185. }
  186. };
  187. }

設置權限:

  1. <!-- 授予程序使用攝像頭的權限 -->
  2. <uses-permission android:name="android.permission.CAMERA" />
  3. <uses-feature android:name="android.hardware.camera" />
  4. <uses-feature android:name="android.hardware.camera.autofocus" />
Copyright © Linux教程網 All Rights Reserved