一、基本介紹
Android相機應用是移動設備拍攝和錄製視頻的主要途徑,它可以讓用戶使用相機來拍攝照片、錄製視頻、使手機成為一個掃描儀,掃描條形碼等。
Android中使用相機應用需要使用Camera API。該API通過提供訪問相機硬件的功能來實現相機應用。可以通過檢測相機是否可用來查詢硬件是否支持相機功能,然後將其用於調用相機。應用可以通過Camera API來獲得硬件視頻流並對其進行處理。
二、Camera API的使用
使用API將相機集成到應用程序時,需要執行以下操作:
1.檢查相機支持
應用程序使用系統服務PackageManager.queryIntentActivities ()檢查“啟動相機”功能是否存在。如果設備上沒有攝像機硬件,或者沒有應用程序允許使用相機,此方法將返回null。
PackageManager pm = context.getPackageManager();
if (!pm.hasSystemFeature(PackageManager.FEATURE_CAMERA))
return false;
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
List<ResolveInfo> list = pm.queryIntentActivities(intent, 0);
return list.size() > 0;
2.打開相機
在使用相機之前,需要先訪問許可(Manifest.permission.CAMERA)。然後,使用Camera.open()方法打開一個訪問相機的實例。如果需要使用前置攝像頭,則可以使用Camera.open(int cameraId)方法獲取該攝像頭的ID。
//打開後置攝像頭
camera = Camera.open();
//打開前置攝像頭
camera = Camera.open(Camera.CameraInfo.CAMERA_FACING_FRONT);
3.設置相機參數
在啟動預覽之前,還需要設置相機參數,如預覽尺寸,照片/視頻大小和格式等等。Camera API中的Camera.Parameters類可用於設置這些參數。
Camera.Parameters parameters = camera.getParameters();
parameters.setPreviewSize(width, height);
parameters.setPictureSize(width, height);
parameters.setPictureFormat(ImageFormat.JPEG);
parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);
camera.setParameters(parameters);
4.預覽
設置好相機參數之後,調用camera.startPreview()方法即可啟動預覽。預覽會在SurfaceView或TextureView對象上呈現:
try {
camera.setPreviewDisplay(surfaceHolder);
camera.startPreview();
} catch (IOException e) {
e.printStackTrace();
}
5.拍照
要拍照,需要調用Camera.getPicture()方法。此方法異步處理請求,因此需要實現Camera.PictureCallback回調來接收結果。
camera.takePicture(null, null, new Camera.PictureCallback() {
@Override
public void onPictureTaken(byte[] data, Camera camera) {
// 處理圖片data,保存到文件等
// 拍完照後需要重新啟動預覽
camera.startPreview();
}
});
三、實現一個完整的Camera應用
下面我們會介紹如何實現一個完整的Camera應用:
1.準備工作
我們需要創建以下布局文件和資源文件:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center">
<SurfaceView
android:id="@+id/surface_view"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:layout_margin="20dp" />
<Button
android:id="@+id/button_capture"
android:text="Capture"
android:textSize="20dp"
android:textColor="@color/colorPrimary"
android:background="@color/colorAccent"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginTop="10dp" />
</LinearLayout>
定義一個SurfaceView對象並設置它的layout_width、layout_height屬性為match_parent. 在布局文件中添加一個按鈕對象,當您點擊時它將啟動拍照操作。
2.定義主活動
定義主活動來處理相機的邏輯。
public class CameraActivity extends AppCompatActivity {
private Camera camera;
private SurfaceView surfaceView;
private Button buttonCapture;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
surfaceView = findViewById(R.id.surface_view);
buttonCapture = findViewById(R.id.button_capture);
buttonCapture.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
camera.takePicture(null, null, new Camera.PictureCallback() {
@Override
public void onPictureTaken(byte[] data, Camera camera) {
// 處理圖片data,保存到文件等
// 拍完照後需要重新啟動預覽
camera.startPreview();
}
});
}
});
}
@Override
protected void onResume() {
super.onResume();
startCamera();
}
@Override
protected void onPause() {
super.onPause();
releaseCamera();
}
private void startCamera() {
camera = Camera.open();
Camera.Parameters parameters = camera.getParameters();
parameters.setPreviewSize(640, 480);
parameters.setPictureSize(1280, 720);
parameters.setPictureFormat(ImageFormat.JPEG);
camera.setParameters(parameters);
try {
camera.setPreviewDisplay(surfaceView.getHolder());
camera.startPreview();
} catch (IOException e) {
e.printStackTrace();
}
}
private void releaseCamera() {
if(camera != null) {
camera.stopPreview();
camera.release();
camera = null;
}
}
}
3.許可請求
打開相機需要許可請求,對應代碼如下:
private void requestPermission(){
if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, 1);
}else {
startCamera();
}
}
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == 1) {
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
startCamera();
} else {
Toast.makeText(this, "拒絕授權,無法使用相機", Toast.LENGTH_SHORT).show();
}
}
}
4.權限檢查
檢查權限的方法如下:
private boolean checkPermission(){
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (checkSelfPermission(Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED) {
return true;
} else {
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, 1);
return false;
}
} else {
return true;
}
}
然後在onCreate()中調用checkPermission()方法來檢查相機權限並啟動相機。
結論
以上是Android相機應用的開發過程,在Android的相機應用中,需要用到一些Camera API來實現。通過這些API,我們可以非常輕鬆地實現一個相機應用,但是需要注意應用的安全要求和用戶體驗。
原創文章,作者:FHPJN,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/372205.html