0

I tried a recording program using Android Studio. but I received some errors.

package com.example.glass.transfer1;

import java.io.File;
import java.io.IOException;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.hardware.Camera;
import android.media.MediaRecorder;
import android.os.Bundle;
import android.os.Environment;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.Window;
import android.view.WindowManager;

@SuppressLint("Registered")
public class VideoActivity extends Activity {
    String fileOutput = "DCIM/Camera/imgtest.mp4";
    String path = Environment.getExternalStorageDirectory() + fileOutput;
    private android.hardware.Camera mCamera;
    private MediaRecorder mediaRecorder;
    SurfaceHolder holder;

    /*@Override
    public void surfaceCreated(SurfaceHolder holder)
    {
        try
        {
            mCamera = Camera.open();
            mCamera.setPreviewDisplay(holder);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height)
    {
        if (mCamera != null)
        {
            mCamera.startPreview();
        }
    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder)
    {
        if (mCamera != null)
        {
            mCamera.stopPreview();
            mCamera = null;
        }
    }*/

    SurfaceHolder.Callback surfaceCallback = new SurfaceHolder.Callback() {
        @Override
        public void surfaceCreated(SurfaceHolder holder) {
            try
            {
                mCamera = Camera.open();
                mCamera.setPreviewDisplay(holder);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        @Override
        public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
            if (mCamera != null)
            {
                mCamera.startPreview();
            }
        }

        @Override
        public void surfaceDestroyed(SurfaceHolder holder) {
            if (mCamera != null)
            {
                mCamera.stopPreview();
                mCamera = null;
            }
        }
    };

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //mVideo = (VideoView) findViewById(R.id.preview);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
        SurfaceView mPreview = (SurfaceView) findViewById(R.id.preview);
        setContentView(R.layout.preview);
        holder = mPreview.getHolder();
        holder.addCallback(surfaceCallback);
        Record(holder);
    }

    private void Record(SurfaceHolder holder)
    {
        if (mediaRecorder != null)
        {
            mediaRecorder.stop();
            mediaRecorder.release();
            mediaRecorder = null;
        }

        File videofile = new File(path);
        if (videofile.exists()) {
            videofile.delete();
        }
        if (mCamera != null)
        {
            mCamera.stopPreview();
            mCamera.release();
            mCamera = null;
        }
        try
        {
            mediaRecorder = new MediaRecorder();
            mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
            mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
            //mediaRecorder.setVideoSize(1280, 720);
            mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP);
            mediaRecorder.setMaxDuration(1000);
            mediaRecorder.setCaptureRate(15);
            mediaRecorder.setVideoFrameRate(15);
            mediaRecorder.setPreviewDisplay(holder.getSurface());
            mediaRecorder.setOutputFile(path);
            //mCamera.unlock();
            mediaRecorder.setCamera(mCamera);
            mediaRecorder.prepare();
            mediaRecorder.start();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

I received error:

E/AndroidRuntime: FATAL EXCEPTION: main Process: com.example.glass.transfer1, PID: 14146 java.lang.RuntimeException: Unable to start activity >ComponentInfo{com.example.glass.transfer1/com.example.glass.transfer1.VideoActivity}: java.lang.NullPointerException at >android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2235) at >android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2285) at >android.app.ActivityThread.access$800(ActivityThread.java:138) at >android.app.ActivityThread$H.handleMessage(ActivityThread.java:1236) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:149) at >android.app.ActivityThread.main(ActivityThread.java:5061) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:515) at >com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:794) at >com.android.internal.os.ZygoteInit.main(ZygoteInit.java:610) at dalvik.system.NativeStart.main(Native Method) Caused by: java.lang.NullPointerException at >com.example.glass.transfer1.VideoActivity.onCreate(VideoActivity.java:94) at >android.app.Activity.performCreate(Activity.java:5236) at >android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1089) at >android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2199) at >android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2285)  at >android.app.ActivityThread.access$800(ActivityThread.java:138)  at >android.app.ActivityThread$H.handleMessage(ActivityThread.java:1236)  at android.os.Handler.dispatchMessage(Handler.java:102)  at android.os.Looper.loop(Looper.java:149)  at >android.app.ActivityThread.main(ActivityThread.java:5061)  at java.lang.reflect.Method.invokeNative(Native Method)  at java.lang.reflect.Method.invoke(Method.java:515)  at >com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:794)  at >com.android.internal.os.ZygoteInit.main(ZygoteInit.java:610)  at dalvik.system.NativeStart.main(Native Method) 

How can I fix this error? Thank you.

Markus Kauppinen
  • 3,025
  • 4
  • 20
  • 30
이효동
  • 21
  • 4
  • Caused by: java.lang.NullPointerException at com.example.glass.transfer1.VideoActivity.onCreate(VideoActivity.java:94) at android.app.Activity.performCreate(Activity.java:5236) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1089) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2199) // I get error from line 94: holder = mPreview.getHolder(); – 이효동 Aug 27 '18 at 01:29
  • Looks like `SurfaceView mPreview = (SurfaceView) findViewById(R.id.preview);` returns `null` because it's called before `setContentView(R.layout.preview);`. They need to be the other way round. And [What is a NullPointerException, and how do I fix it?](https://stackoverflow.com/questions/218384/what-is-a-nullpointerexception-and-how-do-i-fix-it) has some general troubleshooting advice for the future. Debugging the `onCreate()` method would have been one way to understand this specific problem in more detail. – Markus Kauppinen Aug 27 '18 at 09:25
  • Thank you! I fixed that. but I met another errors, because I'm a beginner.. I will try to fix errors. – 이효동 Aug 28 '18 at 00:54

1 Answers1

2

You are getting a java.lang.NullPointerException exception because you are calling findViewById before setContentView

   @Override
    public void onCreate(Bundle savedInstanceState) {
        /..

        SurfaceView mPreview = (SurfaceView) findViewById(R.id.preview);
        setContentView(R.layout.preview);

        /..
    }

setContentView method as the documentation says :

Set the activity content to an explicit view. This view is placed directly into the activity's view hierarchy.

so you are trying to find a specific view which is SurfaceView whose id is preview without setting the view to the activity.

you should try switching between them

setContentView(R.layout.preview);
SurfaceView mPreview = (SurfaceView) findViewById(R.id.preview);