Android多媒體應用開發-控制攝像頭拍照
【原文:http://www.linuxidc.com/Linux/2012-08/67202.htm】
現在的手機的功能可謂是五花八門,手機照相功能就是特別突出的一點,現在的手機照相機甚至成了專業數碼照相機,可以拍攝出清晰的照片和錄製高解析度的視訊。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
- package org.wwj.sound;
- import java.io.File;
- import java.io.FileOutputStream;
- import java.io.IOException;
- import android.app.Activity;
- import android.app.AlertDialog;
- import android.content.Context;
- import android.content.DialogInterface;
- import android.content.DialogInterface.OnClickListener;
- import android.graphics.Bitmap;
- import android.graphics.Bitmap.CompressFormat;
- import android.graphics.BitmapFactory;
- import android.graphics.PixelFormat;
- import android.hardware.Camera;
- import android.hardware.Camera.PictureCallback;
- import android.os.Bundle;
- import android.os.Environment;
- import android.view.Display;
- import android.view.KeyEvent;
- import android.view.SurfaceHolder;
- import android.view.SurfaceHolder.Callback;
- import android.view.SurfaceView;
- import android.view.View;
- import android.view.Window;
- import android.view.WindowManager;
- import android.widget.EditText;
- import android.widget.ImageView;
- public class CaptureImage extends Activity
- {
- SurfaceView sView;
- SurfaceHolder surfaceHolder;
- int screenWidth, screenHeight;
- // 定義系統所用的照相機
- Camera camera;
- //是否在瀏覽中
- boolean isPreview = false;
- @Override
- public void onCreate(Bundle savedInstanceState)
- {
- super.onCreate(savedInstanceState);
- // 設定全屏
- requestWindowFeature(Window.FEATURE_NO_TITLE);
- getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
- WindowManager.LayoutParams.FLAG_FULLSCREEN);
- setContentView(R.layout.main);
- WindowManager wm = (WindowManager) getSystemService(
- Context.WINDOW_SERVICE);
- Display display = wm.getDefaultDisplay();
- // 獲取螢幕的寬和高
- screenWidth = display.getWidth();
- screenHeight = display.getHeight();
- // 獲取介面中SurfaceView元件
- sView = (SurfaceView) findViewById(R.id.sView);
- // 獲得SurfaceView的SurfaceHolder
- surfaceHolder = sView.getHolder();
- // 為surfaceHolder新增一個回撥監聽器
- surfaceHolder.addCallback(new Callback()
- {
- public void surfaceChanged(SurfaceHolder holder, int format, int width,
- int height)
- {
- }
- public void surfaceCreated(SurfaceHolder holder)
- {
- // 開啟攝像頭
- initCamera();
- }
- public void surfaceDestroyed(SurfaceHolder holder)
- {
- // 如果camera不為null ,釋放攝像頭
- if (camera != null)
- {
- if (isPreview)
- camera.stopPreview();
- camera.release();
- camera = null;
- }
- }
- });
- // 設定該SurfaceView自己不維護緩衝
- surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
- }
- private void initCamera()
- {
- if (!isPreview)
- {
- camera = Camera.open();
- }
- if (camera != null && !isPreview)
- {
- try
- {
- Camera.Parameters parameters = camera.getParameters();
- // 設定預覽照片的大小
- parameters.setPreviewSize(screenWidth, screenHeight);
- // 每秒顯示4幀
- parameters.setPreviewFrameRate(4);
- // 設定圖片格式
- parameters.setPictureFormat(PixelFormat.JPEG);
- // 設定JPG照片的質量
- parameters.set("jpeg-quality", 85);
- //設定照片的大小
- parameters.setPictureSize(screenWidth, screenHeight);
- camera.setParameters(parameters);
- //通過SurfaceView顯示取景畫面
- camera.setPreviewDisplay(surfaceHolder);
- // 開始預覽
- camera.startPreview();
- // 自動對焦
- camera.autoFocus(null);
- }
- catch (Exception e)
- {
- e.printStackTrace();
- }
- isPreview = true;
- }
- }
- @Override
- public boolean onKeyDown(int keyCode, KeyEvent event)
- {
- switch (keyCode)
- {
- // 當使用者單擊照相鍵、中央鍵時執行拍照
- case KeyEvent.KEYCODE_DPAD_CENTER:
- case KeyEvent.KEYCODE_CAMERA:
- if (camera != null && event.getRepeatCount() == 0)
- {
- // 拍照
- camera.takePicture(null, null , myjpegCallback);
- return true;
- }
- break;
- }
- return super.onKeyDown(keyCode, event);
- }
- PictureCallback myjpegCallback = new PictureCallback()
- {
- public void onPictureTaken(byte[] data, Camera camera)
- {
- // 根據拍照所得的資料建立點陣圖
- final Bitmap bm = BitmapFactory.decodeByteArray(data
- , 0, data.length);
- // 載入/layout/save.xml檔案對應的佈局資源
- View saveDialog = getLayoutInflater().inflate(
- R.layout.save, null);
- final EditText photoName = (EditText) saveDialog
- .findViewById(R.id.photo_name);
- // 獲取saveDialog對話方塊上的ImageView元件
- ImageView show = (ImageView) saveDialog.findViewById(R.id.show);
- // 顯示剛剛拍得的照片
- show.setImageBitmap(bm);
- //使用對話方塊顯示saveDialog元件
- new AlertDialog.Builder(CaptureImage.this)
- .setView(saveDialog)
- .setPositiveButton("儲存", new OnClickListener()
- {
- public void onClick(DialogInterface dialog,
- int which)
- {
- // 建立一個位於SD卡上的檔案
- File file = new File(Environment.getExternalStorageDirectory()
- , photoName.getText().toString() + ".jpg");
- FileOutputStream outStream = null;
- try
- {
- // 開啟指定檔案對應的輸出流
- outStream = new FileOutputStream(file);
- // 把點陣圖輸出到指定檔案中
- bm.compress(CompressFormat.JPEG, 100, outStream);
- outStream.close();
- }
- catch (IOException e)
- {
- e.printStackTrace();
- }
- }
- })
- .setNegativeButton("取消", null)
- .show();
- //重新瀏覽
- camera.stopPreview();
- camera.startPreview();
- isPreview = true;
- }
- };
- }
設定許可權:
- <!-- 授予程式使用攝像頭的許可權 -->
- <uses-permission android:name="android.permission.CAMERA" />
- <uses-feature android:name="android.hardware.camera" />
- <uses-feature android:name="android.hardware.camera.autofocus" />
相關文章
- Android開發之呼叫攝像頭拍照Android
- Android呼叫攝像頭拍照Android
- Android 呼叫攝像頭拍照Android
- Android提供的攝像頭拍照Android
- 安卓呼叫攝像頭拍照安卓
- 照片系列之android呼叫攝像頭拍照Android
- Android呼叫攝像頭拍照並顯示照片Android
- Android 呼叫攝像頭功能【拍照與視訊】Android
- 搭建一個攝像頭應用程式 應用程式內部攝像頭
- 【Android】【opencv】實現攝像頭拍照和錄影AndroidOpenCV
- android 開啟攝像頭Android
- [譯]Android的多攝像頭支援Android
- [譯] Android 的多攝像頭支援Android
- C#實現攝像頭呼叫、拍照C#
- android studio呼叫攝像頭拍照及具體步驟演示程式碼Android
- 在Android中呼叫攝像頭拍照並顯示出來Android
- 如何在SAP UI5應用裡新增使用攝像頭拍照的功能UI
- html5呼叫攝像頭實現拍照HTML
- Android呼叫攝像頭Android
- [譯] 如何在 Android 開發中充分利用多攝像頭 APIAndroidAPI
- vlc的應用:用vlc串流攝像頭
- 安卓開發之呼叫攝像頭安卓
- 瀏覽器呼叫攝像頭進行拍照程式瀏覽器
- AngularJS中使用HTML5攝像頭拍照AngularJSHTML
- android opencv 前置攝像頭AndroidOpenCV
- 修正Android攝像頭APIAndroidAPI
- Android如何呼叫攝像頭Android
- 攝像頭背後的應用–資訊圖
- C# 使用AForge呼叫筆記本攝像頭拍照C#筆記
- iPhone XS/iPhone XS Max攝像頭拍照解析:蘋果也玩起了AI拍照iPhone蘋果AI
- Android CameraX 開啟攝像頭預覽Android
- web呼叫攝像頭拍照並上傳到伺服器Web伺服器
- WebRTC開啟本地攝像頭Web
- iOS應用自動撥打電話,開啟攝像頭缺陷iOS
- Win10攝像頭如何開啟_WIN10攝像頭在哪裡Win10
- Win10怎麼開啟攝像頭 win10開啟攝像頭的方法Win10
- 《HTML5多媒體應用開發》——1.4 小結HTML
- Android 用MultiImageSelector實現上傳頭像的拍照跟相簿Android