0

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

deluxephp
  • 1
  • 1

0 Answers0