Мне нужно получить предварительный просмотр камеры, а затем нарисовать квадрат поверх камеры.
Мне удалось получить изображение с камеры, но оно не рисует квадрат. Приложение вылетает.
Помогите разобраться, как лучше всего это реализовать?
Я пытался нарисовать, но квадрат быстро исчез или не появился вообще. Я очень хочу это понять.
ShowCamera.java
public class ShowCamera extends SurfaceView implements SurfaceHolder.Callback {
Camera camera;
SurfaceHolder holder;
Path path;
volatile boolean running = false;
public ShowCamera(Context context, Camera camera) {
super(context);
this.camera = camera;
holder = getHolder();
holder.addCallback(this);
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
camera.stopPreview();
camera.release();
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
Camera.Parameters params = camera.getParameters();
List<Camera.Size> sizes = params.getSupportedPictureSizes();
Camera.Size mSize = null;
for(Camera.Size size : sizes){
mSize = size;
}
//change orientation
if (this.getResources().getConfiguration().orientation != Configuration.ORIENTATION_LANDSCAPE){
params.set("orientation","portrait");
camera.setDisplayOrientation(90);
params.setRotation(90);
}
else{
params.set("orientation","landscape");
camera.setDisplayOrientation(0);
params.setRotation(0);
}
params.setPictureSize(mSize.width,mSize.height);
camera.setParameters(params);
try{
camera.setPreviewDisplay(holder);
camera.startPreview();
}
catch(IOException e){
e.printStackTrace();
}
}
}
MainActivity.java
public class MainActivity extends AppCompatActivity {
Button btn_run;
Button btn_select;
TextView tv;
FrameLayout camera_preview;
Camera camera;
ShowCamera showCamera;
DrawView drawView;
Bitmap bitmap;
Canvas canvas;
float x_touch;
float y_touch;
int X_touch;
int Y_touch;
String sDown;
public boolean camera_state = true;
private boolean onSelect = false;
private boolean canSelect = false;
private boolean has_camera = true;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// элементы из activity_main
btn_run = findViewById(R.id.btn_run);
btn_select = findViewById(R.id.btn_selectStar);
camera_preview = findViewById(R.id.camera_preview);
tv = findViewById(R.id.tv);
// проверка на наличие камеры
if (!checkCameraHardware(MainActivity.this)) {
has_camera = false;
Toast toast = Toast.makeText(this, "Камера не найдена", Toast.LENGTH_LONG);
toast.show();
}
// open camera
camera = Camera.open();
showCamera = new ShowCamera(this, camera);
camera_preview.addView(showCamera);
camera_preview.setVisibility(View.VISIBLE);
addTouchListener();
}
public void btnRunOnClick(View view) {
if (has_camera) {
if (camera_state) {
camera_state = false;
btn_run.setText("Остановить");
camera_preview.setVisibility(View.VISIBLE);
Toast toast = Toast.makeText(this, "Камера остановлена", Toast.LENGTH_SHORT);
toast.show();
camera.startPreview();
} else {
camera_state = true;
btn_run.setText("Запустить");
camera_preview.setVisibility(View.VISIBLE);
Toast toast = Toast.makeText(this, "Камера запущена", Toast.LENGTH_SHORT);
toast.show();
camera.stopPreview();
}
} else {
Toast toast = Toast.makeText(this, "Камера не может быть запущена, \nпоскольку ее нет", Toast.LENGTH_LONG);
toast.show();
}
}
public void btnSelectStarOnClick(View view) {
if (onSelect) {
onSelect = false;
canSelect = true;
btn_select.setText("Прекратить");
Toast toast = Toast.makeText(this, "Выберите объект", Toast.LENGTH_SHORT);
toast.show();
} else {
onSelect = true;
canSelect = false;
btn_select.setText("Выбрать");
Toast toast = Toast.makeText(this, "Выбор запрещен", Toast.LENGTH_SHORT);
toast.show();
}
}
private boolean checkCameraHardware(Context context) {
if (context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA)) {
return true;
} else {
return false;
}
}
private void addTouchListener(){
camera_preview.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if(canSelect){
x_touch = event.getX();
y_touch = event.getY();
X_touch = Math.round(x_touch);
Y_touch = Math.round(y_touch);
sDown = "Down: " + X_touch + "," + Y_touch;
tv.setText(sDown);
}
return false;
}
});
}
}