以下是一個使用CameraUtils類的Java示例:
import android.Manifest;
import android.content.pm.PackageManager;
import android.hardware.Camera;
import android.os.Bundle;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.WindowManager;
import android.widget.Button;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import java.io.IOException;
public class MainActivity extends AppCompatActivity implements SurfaceHolder.Callback {
private Camera mCamera;
private SurfaceView mSurfaceView;
private SurfaceHolder mSurfaceHolder;
private Button mButton;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 獲取SurfaceView
mSurfaceView = findViewById(R.id.surface_view);
mSurfaceHolder = mSurfaceView.getHolder();
mSurfaceHolder.addCallback(this);
// 獲取Button
mButton = findViewById(R.id.button);
mButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
takePicture();
}
});
}
@Override
protected void onResume() {
super.onResume();
// 申請相機權限
if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, 1);
}
}
private void takePicture() {
if (mCamera != null) {
// 設置自動對焦
Camera.Parameters parameters = mCamera.getParameters();
parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);
mCamera.setParameters(parameters);
// 拍照
mCamera.takePicture(null, null, new Camera.PictureCallback() {
@Override
public void onPictureTaken(byte[] data, Camera camera) {
// 保存照片
// ...
// 重新預覽
try {
mCamera.startPreview();
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
// 打開相機
try {
mCamera = CameraUtils.open();
mCamera.setPreviewDisplay(mSurfaceHolder);
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
// 設置預覽尺寸
Camera.Parameters parameters = mCamera.getParameters();
parameters.setPreviewSize(width, height);
mCamera.setParameters(parameters);
// 開始預覽
mCamera.startPreview();
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
// 關閉相機
mCamera.stopPreview();
mCamera.release();
mCamera = null;
}
}
以上代碼中,首先在 onCreate
方法中獲取 SurfaceView 和 Button 的實例,然后在 onResume
方法中申請相機權限。
在 surfaceCreated
方法中打開相機,并將預覽顯示設置為 SurfaceView。在 surfaceChanged
方法中設置預覽尺寸,并開始預覽。
在按鈕的點擊事件中調用 takePicture
方法拍照,拍照完成后保存照片,并重新開始預覽。
在 surfaceDestroyed
方法中關閉相機。
請注意,以上代碼只是一個簡單的示例,實際使用中可能需要更多的錯誤處理和邏輯。