在學習這個模塊之前必須要對android有關于相機拍照的API有所了解 , 這個模塊的API有兩部分 一部分就是Camera 還有一部分 是Camera2 好像androidX包里面還有一個CameraX , 但是 我們只能從最簡單的來 就看android Camera包吧 我們線了解了解它的結構

由于API較多 我們這里就不做多的介紹 可以查看官網 :android.hardware | Android Developers
https://developer.android.google.cn/reference/android/hardware/package-summary
開發步驟:
- 首先 , 需要獲取 相機物件實體 , 可以通過官網提供的open方法獲取
- 還需要一個預覽視圖的容器(我的理解)術語來說就是需要一個表面 Sufarce
- 可以通過 相機物件 的 setPreviewDisplay方法來設定視圖顯示 該方法需要一個引數 就是Sufarceholder 物件
- 通過sufarce物件獲取Sufarceholder 并設定Sufarceholder;
- 可以設定一下相機的引數 可以通過Camera.Parament這個類來設定
- 呼叫startPreView方法開啟預覽
- 在預覽的狀態下 呼叫TakePicture方法來實時拍照并獲取拍照的圖片 ;
代碼:
開啟預覽和引數配置
SurfaceView surface = (SurfaceView) findViewById(R.id.sf); //獲取視頻承載物件
SurfaceHolder holder = surface.getHolder();//通過這個承載物件獲取holder
camera = Camera.open();//使用Carmera類的open方法呼叫攝像頭 這個方法會回傳一個camera物件
camera.setDisplayOrientation(90);
//設定相機的引數
Camera.Parameters parameters = camera.getParameters();
//設定相機資訊
parameters.setPictureSize(400 , 400);//設定該相機拍攝的照片的大小
parameters.setPictureFormat(ImageFormat.JPEG);//設定相機拍照的格式
//開始預覽
startPreview.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//判斷相機物件是否被實體化
if (camera!=null){
try {
camera.setPreviewDisplay(holder);//設定實時預覽 --- 預覽顯示
camera.startPreview();//開啟預覽
isPreview = true ;
} catch (IOException e) {
e.printStackTrace();
}
}else {
new IllegalArgumentException("相機為打開");
}
}
});
開始拍照
//設定拍照按鈕的監聽事件
startTakePicture.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (camera == null || isPreview == false){
Log.e("TAG", "相機沒打開 或者是 未開啟預覽 " );
}else {
//開始拍照
parameters.setRotation(90);
camera.takePicture(null, null, new Camera.PictureCallback() {
@Override
public void onPictureTaken(byte[] data, Camera camera) {
//創建位圖
Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);
//為imageView控制元件添加圖片
image.setImageBitmap(bitmap);
//繼續回到預覽狀態
camera.startPreview();
isPreview = true;
}
});
}
}
});
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/325622.html
標籤:其他
