編輯:關於android開發
如標題所述,學習如何打開攝像頭,並在屏幕上預覽圖像。使用Camera的步驟:
(1)調用Camera的open()方法打開相機;
(2)調用Camera的getParameters()方法獲取拍照參數,該方法返回一個Camera.Parameters對象;
(3)調用Camera的setParameters()方法//android2.3.3以後無需此步;
(4)調用Camera的startPreview()方法開始預覽取景,在預覽取景之前需要調用Camera的setPreviewDisplay(SurfaceHolder holder)方法設置使用哪個surfaceview來顯示取景圖片;
(5)結束程序時,調用Camera的stopPreview()結束取景預覽,並調用release()方法釋放資源。
以上過程參考《瘋狂android講義》,這本書確實不錯,能夠快速入門。整個系統大部分框架是參考此書的,部分問題在網上搜的資料。
1.在AndroidManifest.xml文件中添加camera的權限
<!-- 授予程序使用攝像頭的權限 -->
<uses-permission android:name=
"android.permission.CAMERA"
/>
<uses-feature android:name=
"android.hardware.camera"
/>
<uses-feature android:name=
"android.hardware.camera.autofocus"
/>
2.在界面布局文件中添加一個surfaceview用於顯示預覽圖片
<SurfaceView
android:id=
"@+id/sView"
android:layout_width=
"fill_parent"
android:layout_height=
"fill_parent"
/>
3.程序主體
在這裡我們定義了一個SurfaceView變量sView用於獲取布局文件中定義的SurfaceView組件。關於SurfaceView的基本問題,這個講的蠻好的。
我們在SurfaceView被創建時調用initcamera()初始化攝像頭,在SurfaceView被銷毀時釋放攝像頭。而這兩個時間是通過surfaceHolder.addCallback得到的,看看下面代碼就明白了。
public
class
MainActivity
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.activity_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()
{
@Override
public
void
surfaceChanged(SurfaceHolder holder,
int
format,
int
width,
int
height)
{
}
@Override
public
void
surfaceCreated(SurfaceHolder holder)
{
// 打開攝像頭
initCamera();
}
@Override
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);
//android2.3.3以後無需下步
//camera.setParameters(parameters);
//通過SurfaceView顯示取景畫面
camera.setPreviewDisplay(surfaceHolder);
// 開始預覽
camera.startPreview();
// 自動對焦
camera.autoFocus(
null
);
}
catch
(Exception e)
{
e.printStackTrace();
}
isPreview =
true
;
}
}
}
就這樣你就可以使用攝像頭預覽了。當然你會發現預覽的圖像轉了90度,方向不對。我們在AndroidManifest.xml文件的activity屬性設置中添加
android:screenOrientation=
"landscape"
設置成橫屏就OK了。如果黑屏請檢查camera.setParameters(parameters);這步是否與自己系統匹配,2.3.3以後是不須此步的。
就這樣簡單,我們就完成了無線視頻監控的第一步,實現了攝像頭圖像的預覽。在這裡我們設置了預覽但是卻沒有對每幀圖像數據進行處理,下次將講如何獲得攝像頭的每一幀圖像以及如何處理。
下面是sdk2.3.3下的源碼,在我android4.04系統的手機上也能運行。由於android開發工具的升級,這個源碼包跟以前版本有所不同,不知道和舊版本是否有沖突。如過不行大家新建個工程,再把3個關鍵文件的內容復制過去應該沒問題。
實現控件的拖拽,實現控件拖拽如圖是效果圖,移動ImageView時ImageView的位置會發生改變,並且雙擊的時候ImageView會水平居中 pac
Android 用Canvas畫textview、bitmap、矩形(裁剪)、橢圓、線、點、弧 初始化對象 private Paint mPaint;//畫筆 pri
微信支付僅能成功調用一次的問題,微信支付調用本人使用Android開發有一段時間了,但是本身沒有系統學,而且多年專注服務端開發,總覺得因為項目需要接觸Android移動端
Android 手機衛士--平移動畫實現,android衛士本文實現如下幾個界面之間的平移動畫實現 本文地址:http://www.cnblogs.com/wuyudo