I am just new here because I actually need help with an error in my CamActivity.java. When I open the app, the camera immediately opens, I click the button, the camera opens again. But as soon as I take the picture, the app crashes.
I think the error is in my CamActivity.java but I have no knowledge of Java myself, so I'm here to ask if anyone knows what to do.
Here is that piece of code:
package com.philippaerts.testapp;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import android.Manifest;
import android.app.Activity;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.hardware.Camera;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.Surface;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.ImageView;
import android.widget.Toast;
import com.philippaerts.testapp.user.ImageViewActivity;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Objects;
@SuppressWarnings("ALL")
public class CamActivity extends AppCompatActivity implements SurfaceHolder.Callback {
Camera camera;
Camera.PictureCallback jpegCallback;
SurfaceView surfaceView;
SurfaceHolder surfaceHolder;
ImageView button;
boolean inPreview = false;
final int CAMERA_REQUEST_CODE = 1;
private boolean isFlashOn;
private static final int PERMISSION_CODE = 1001;
int currentCameraId;
Camera.Parameters parameters;
@SuppressWarnings("deprecation")
@Override
protected 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_camera);
surfaceView = findViewById(R.id.surfaceView);
surfaceHolder = surfaceView.getHolder();
button = findViewById(R.id.button);
inPreview = true;
ImageView back = findViewById(R.id.imageView);
back.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
onBackPressed();
}
});
ImageView flash = findViewById(R.id.flash);
flash.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (isFlashOn){
turnOffFlash();
}else {
turnOnFlash();
}
}
});
ImageView swap = findViewById(R.id.swap);
swap.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (inPreview) {
camera.stopPreview();
}
camera.release();
if(currentCameraId == Camera.CameraInfo.CAMERA_FACING_BACK){
currentCameraId = Camera.CameraInfo.CAMERA_FACING_FRONT;
}
else {
currentCameraId = Camera.CameraInfo.CAMERA_FACING_BACK;
}
camera = Camera.open(currentCameraId);
setCameraDisplayOrientation(CamActivity.this, currentCameraId, camera);
try {
camera.setPreviewDisplay(surfaceHolder);
} catch (IOException e) {
e.printStackTrace();
}
camera.startPreview();
}
});
//Permission
if (ActivityCompat.checkSelfPermission(CamActivity.this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED){
ActivityCompat.requestPermissions(CamActivity.this, new String[] {Manifest.permission.CAMERA}, CAMERA_REQUEST_CODE);
}else {
surfaceHolder.addCallback(this);
surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){
if (checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE)
== PackageManager.PERMISSION_DENIED){
String[] permissions = {Manifest.permission.READ_EXTERNAL_STORAGE};
requestPermissions(permissions, PERMISSION_CODE);
}
else {
captureImage();
}
}
else {
captureImage();
}
}
});
jpegCallback = new Camera.PictureCallback() {
@Override
public void onPictureTaken(byte[] data, Camera camera) {
File pictureFile = getOutputMediaFile();
if (pictureFile == null) {
return;
}
try {
FileOutputStream fos = new FileOutputStream(pictureFile);
fos.write(data);
fos.close();
} catch (FileNotFoundException e) {
} catch (IOException e) {
}
}
};
}
@SuppressWarnings("deprecation")
private File getOutputMediaFile() {
File mediaStorageDir = new File(
Environment
.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES),
"Testapp");
if (!mediaStorageDir.exists()) {
if (!mediaStorageDir.mkdirs()) {
Log.d("Testapp", "failed to create directory");
return null;
}
}
// Create a media file name
String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss")
.format(new Date());
File mediaFile;
mediaFile = new File(mediaStorageDir.getPath() + File.separator
+ "IMG_" + timeStamp + ".jpg");
Uri uri = Uri.fromFile(mediaFile);
if(currentCameraId == Camera.CameraInfo.CAMERA_FACING_BACK){
Intent intent = new Intent(getApplicationContext(), ImageViewActivity.class);
intent.putExtra("uri", uri.toString());
intent.putExtra("type", "img");
intent.putExtra("type", "img");
intent.putExtra("angle", "90");
startActivity(intent);
}
else if(currentCameraId == Camera.CameraInfo.CAMERA_FACING_FRONT){
Intent intent = new Intent(getApplicationContext(), ImageViewActivity.class);
intent.putExtra("uri", uri.toString());
intent.putExtra("type", "img");
intent.putExtra("type", "img");
intent.putExtra("angle", "180");
startActivity(intent);
}
return mediaFile;
}
private void turnOnFlash() {
if (!isFlashOn){
if (camera == null || parameters == null){
return;
}
isFlashOn = true;
parameters = camera.getParameters();
parameters.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);
camera.setParameters(parameters);
camera.startPreview();
}
}
private void turnOffFlash() {
if (isFlashOn){
if (camera == null || parameters == null){
return;
}
isFlashOn = false;
parameters = camera.getParameters();
parameters.setFlashMode(Camera.Parameters.FLASH_MODE_OFF);
camera.setParameters(parameters);
}
}
public static void setCameraDisplayOrientation(Activity activity,
int cameraId, android.hardware.Camera camera) {
android.hardware.Camera.CameraInfo info =
new android.hardware.Camera.CameraInfo();
android.hardware.Camera.getCameraInfo(cameraId, info);
int rotation = activity.getWindowManager().getDefaultDisplay()
.getRotation();
int degrees = 0;
switch (rotation) {
case Surface.ROTATION_0: degrees = 0; break;
case Surface.ROTATION_90: degrees = 90; break;
case Surface.ROTATION_180: degrees = 180; break;
case Surface.ROTATION_270: degrees = 270; break;
}
int result;
if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
result = (info.orientation + degrees) % 360;
result = (360 - result) % 360; // compensate the mirror
} else { // back-facing
result = (info.orientation - degrees + 360) % 360;
}
camera.setDisplayOrientation(result);
}
private void captureImage() {
camera.takePicture(null, null, jpegCallback);
}
@SuppressWarnings("deprecation")
@Override
public void surfaceCreated(SurfaceHolder holder) {
camera = Camera.open();
parameters = camera.getParameters();
camera.setDisplayOrientation(90);
parameters.setPreviewFrameRate(30);
parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE);
try {
camera.setPreviewDisplay(surfaceHolder);
} catch (IOException e) {
e.printStackTrace();
}
camera.startPreview();
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
}
@SuppressWarnings("deprecation")
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode){
case CAMERA_REQUEST_CODE:{
if (grantResults.length>0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){
surfaceHolder.addCallback(this);
surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
restartApp();
}else {
Toast.makeText(getApplicationContext(), "Please provide the permission", Toast.LENGTH_LONG).show();
}
break;
}
case PERMISSION_CODE:{
if (grantResults.length >0 && grantResults[0] ==
PackageManager.PERMISSION_GRANTED){
Toast.makeText(CamActivity.this, "Storage permission Allowed",
Toast.LENGTH_LONG).show();
captureImage();
}
else {
Toast.makeText(CamActivity.this, "Storage permission is required",
Toast.LENGTH_LONG).show();
}
}
}
}
private void restartApp() {
Intent i = getBaseContext().getPackageManager().
getLaunchIntentForPackage(getBaseContext().getPackageName());
Objects.requireNonNull(i).addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(i);
}
}
logcat:
2020-10-26 17:46:03.402 22403-22403/com.philippaerts.testapp D/ViewRootImpl@ca8b06d[MainActivity]: ViewPostIme pointer 0 2020-10-26 17:46:03.416 22403-22403/com.philippaerts.testapp D/ViewRootImpl@ca8b06d[MainActivity]: ViewPostIme pointer 1 2020-10-26 17:46:03.454 22403-22403/com.philippaerts.testapp W/ActivityThread: handleWindowVisibility: no activity for token android.os.BinderProxy@4f9b62f 2020-10-26 17:46:03.476 22403-22403/com.philippaerts.testapp D/PhoneWindow: forceLight changed to true [] from com.android.internal.policy.PhoneWindow.updateForceLightNavigationBar:4238 com.android.internal.policy.DecorView.updateColorViews:1507 com.android.internal.policy.PhoneWindow.dispatchWindowAttributesChanged:3216 android.view.Window.setFlags:1148 com.android.internal.policy.PhoneWindow.generateLayout:2444 2020-10-26 17:46:03.477 22403-22403/com.philippaerts.testapp I/MultiWindowDecorSupport: updateCaptionType >> DecorView@2fe73c3[], isFloating: false, isApplication: true, hasWindowDecorCaption: false, hasWindowControllerCallback: true 2020-10-26 17:46:03.477 22403-22403/com.philippaerts.testapp D/MultiWindowDecorSupport: setCaptionType = 0, DecorView = DecorView@2fe73c3[] 2020-10-26 17:46:03.527 22403-22403/com.philippaerts.testapp D/ViewRootImpl@c5d98e9[CamActivity]: setView = com.android.internal.policy.DecorView@2fe73c3 TM=true MM=false 2020-10-26 17:46:03.529 22403-22403/com.philippaerts.testapp D/ViewRootImpl@ca8b06d[MainActivity]: MSG_WINDOW_FOCUS_CHANGED 0 1 2020-10-26 17:46:03.529 22403-22403/com.philippaerts.testapp D/InputMethodManager: prepareNavigationBarInfo() DecorView@c0fd7eb[MainActivity] 2020-10-26 17:46:03.529 22403-22403/com.philippaerts.testapp D/InputMethodManager: getNavigationBarColor() -855310 2020-10-26 17:46:03.534 22403-22403/com.philippaerts.testapp D/SurfaceView: onWindowVisibilityChanged(0) true android.view.SurfaceView{5a7496e V.E...... ......I. 0,0-0,0 #7f0a01f9 app:id/surfaceView} of ViewRootImpl@c5d98e9[CamActivity] 2020-10-26 17:46:03.549 22403-22403/com.philippaerts.testapp D/ViewRootImpl@c5d98e9[CamActivity]: Relayout returned: old=(0,0,720,1560) new=(0,58,720,1560) req=(720,1560)0 dur=11 res=0x7 s={true 497603686400} ch=true 2020-10-26 17:46:03.552 22403-22452/com.philippaerts.testapp D/OpenGLRenderer: createReliableSurface : 0x73db91bb80, 0x73db7db000 2020-10-26 17:46:03.553 22403-22452/com.philippaerts.testapp D/mali_winsys: EGLint new_window_surface(egl_winsys_display *, void *, EGLSurface, EGLConfig, egl_winsys_surface **, EGLBoolean) returns 0x3000 2020-10-26 17:46:03.563 22403-22403/com.philippaerts.testapp D/SurfaceView: surfaceCreated 1 #8 android.view.SurfaceView{5a7496e V.E...... ......ID 0,0-720,1406 #7f0a01f9 app:id/surfaceView} 2020-10-26 17:46:04.098 22403-22403/com.philippaerts.testapp D/SurfaceView: surfaceChanged (720,1406) 1 #8 android.view.SurfaceView{5a7496e V.E...... ......ID 0,0-720,1406 #7f0a01f9 app:id/surfaceView} 2020-10-26 17:46:04.123 22403-22403/com.philippaerts.testapp I/Choreographer: Skipped 34 frames! The application may be doing too much work on its main thread. 2020-10-26 17:46:04.151 22403-22403/com.philippaerts.testapp D/ViewRootImpl@c5d98e9[CamActivity]: Relayout returned: old=(0,58,720,1560) new=(0,58,720,1560) req=(720,1502)0 dur=27 res=0x1 s={true 497603686400} ch=false 2020-10-26 17:46:04.152 22403-22403/com.philippaerts.testapp D/ViewRootImpl@c5d98e9[CamActivity]: MSG_WINDOW_FOCUS_CHANGED 1 1 2020-10-26 17:46:04.152 22403-22403/com.philippaerts.testapp D/InputMethodManager: prepareNavigationBarInfo() DecorView@2fe73c3[CamActivity] 2020-10-26 17:46:04.152 22403-22403/com.philippaerts.testapp D/InputMethodManager: getNavigationBarColor() -855310 2020-10-26 17:46:04.154 22403-22403/com.philippaerts.testapp D/InputMethodManager: prepareNavigationBarInfo() DecorView@2fe73c3[CamActivity] 2020-10-26 17:46:04.154 22403-22403/com.philippaerts.testapp D/InputMethodManager: getNavigationBarColor() -855310 2020-10-26 17:46:04.154 22403-22403/com.philippaerts.testapp V/InputMethodManager: Starting input: tba=com.philippaerts.testapp ic=null mNaviBarColor -855310 mIsGetNaviBarColorSuccess true , NavVisible : true , NavTrans : false 2020-10-26 17:46:04.155 22403-22403/com.philippaerts.testapp D/InputMethodManager: startInputInner - Id : 0 2020-10-26 17:46:04.155 22403-22403/com.philippaerts.testapp I/InputMethodManager: startInputInner - mService.startInputOrWindowGainedFocus 2020-10-26 17:46:04.158 22403-22403/com.philippaerts.testapp D/InputTransport: Input channel destroyed: 'ClientS', fd=75 2020-10-26 17:46:04.159 22403-22403/com.philippaerts.testapp E/Camera: Error 2 2020-10-26 17:46:04.159 22403-22403/com.philippaerts.testapp D/ViewRootImpl@c5d98e9[CamActivity]: MSG_RESIZED_REPORT: frame=(0,58,720,1560) ci=(0,0,0,96) vi=(0,0,0,96) or=1 2020-10-26 17:46:04.457 22403-22403/com.philippaerts.testapp D/SurfaceView: onWindowVisibilityChanged(8) false android.view.SurfaceView{e280533 V.E...... ........ 0,0-720,1560 #7f0a01f9 app:id/surfaceView} of ViewRootImpl@ca8b06d[MainActivity] 2020-10-26 17:46:04.459 22403-22403/com.philippaerts.testapp D/SurfaceView: surfaceDestroyed callback.size 1 #2 android.view.SurfaceView{e280533 V.E...... ........ 0,0-720,1560 #7f0a01f9 app:id/surfaceView} 2020-10-26 17:46:04.460 22403-22403/com.philippaerts.testapp D/SurfaceView: remove() android.view.SurfaceView{e280533 V.E...... ........ 0,0-720,1560 #7f0a01f9 app:id/surfaceView} Surface(name=SurfaceView - com.philippaerts.testapp/com.philippaerts.testapp.MainActivity@e280533@0)/@0xe6c28cc 2020-10-26 17:46:04.467 22403-22452/com.philippaerts.testapp W/libEGL: EGLNativeWindowType 0x746101d390 disconnect failed 2020-10-26 17:46:04.476 22403-22403/com.philippaerts.testapp D/ViewRootImpl@ca8b06d[MainActivity]: Relayout returned: old=(0,0,720,1560) new=(0,0,720,1560) req=(720,1560)8 dur=8 res=0x5 s={false 0} ch=true 2020-10-26 17:46:04.477 22403-22403/com.philippaerts.testapp D/ViewRootImpl@ca8b06d[MainActivity]: stopped(true) old=false 2020-10-26 17:46:04.478 22403-22403/com.philippaerts.testapp D/SurfaceView: windowStopped(true) false android.view.SurfaceView{e280533 V.E...... ........ 0,0-720,1560 #7f0a01f9 app:id/surfaceView} of ViewRootImpl@ca8b06d[MainActivity] 2020-10-26 17:46:04.498 22403-22403/com.philippaerts.testapp D/ViewRootImpl@ca8b06d[MainActivity]: Relayout returned: old=(0,0,720,1560) new=(0,0,720,1560) req=(720,1560)8 dur=7 res=0x5 s={false 0} ch=false 2020-10-26 17:46:07.866 22403-22403/com.philippaerts.testapp D/ViewRootImpl@c5d98e9[CamActivity]: ViewPostIme pointer 0 2020-10-26 17:46:07.916 22403-22403/com.philippaerts.testapp D/ViewRootImpl@c5d98e9[CamActivity]: ViewPostIme pointer 1 2020-10-26 17:46:09.121 22403-22403/com.philippaerts.testapp D/testapp: failed to create directory
I did some research too, and found something that went in that direction. It used to be that the app opens the camera 2 times, but the first camera does not close before the second camera opens, causing the app to crash, I don't know if it is related to this, but I didn't understand anything of it. I hope you guys can find something, thanks anyway :)
Greetz