我应该在应用程序的 toString() 方法中插入什么参数?

问题描述

我正在开发一个相机应用,它使用 Camera APIFrameLayoutMediaRecorder 类更改相机的某些参数。我的主要目标是更改我将要在此应用上录制的视频的 frame per second (fps) 和 resolution。为此,我按照 Android 网站 Camera API 部分的说明操作,并添加了我的项目所需的功能

代码如下:

 public class MainActivity extends AppCompatActivity {

    private Camera mCamera;
    private Button captureButton;
    private CameraPreview cameraPreview;
    private FrameLayout preview;
    private MediaRecorder mediaRecorder;
    private boolean isRecording = false;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mCamera = getCameraInstance();

        cameraPreview = new CameraPreview(this,mCamera);
        preview = (FrameLayout) findViewById(R.id.camera_previewXML);
        preview.addView(cameraPreview);

        captureButton = (Button) findViewById(R.id.capture_buttonXML);
        captureButton.setonClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (isRecording) {
                    mediaRecorder.stop();
                    releaseMediaRecorder();
                    mCamera.lock();

                    isRecording = false;
                } else {

                    if(prepareVideoRecorder()) {
                        mediaRecorder.start();

                        isRecording = true;
                    } else {
                        releaseMediaRecorder();
                    }

                }
            }
        });

    }

    public static Camera getCameraInstance(){
     Camera c = null;
     try{
         c = Camera.open();
     } catch (Exception e){

     } return c;
    }

    private boolean prepareVideoRecorder(){
        mCamera = getCameraInstance();
        mediaRecorder = new MediaRecorder();

        mCamera.unlock();
        mediaRecorder.setCamera(mCamera);

        mediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);
        mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);

        mediaRecorder.setoutputFormat(MediaRecorder.OutputFormat.MPEG_4);
        mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
        mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.DEFAULT);
        mediaRecorder.setVideoEncodingBitRate(10000000);
        mediaRecorder.setVideoFrameRate(30);
        mediaRecorder.setVideoSize(1280,720);

        mediaRecorder.setoutputFile(getoutputMediaFile(MEDIA_TYPE_VIDEO).toString());

        mediaRecorder.setPreviewdisplay(cameraPreview.getHolder().getSurface());

        try{
            mediaRecorder.prepare();
        } catch (IllegalStateException e){
            Log.d(TAG,"IllegalStateException ao prepara o MediaRecorder"+e.getMessage());
            releaseMediaRecorder();
            return false;
        } catch (IOException e){
            Log.d(TAG,"IOException preparando o MediaRecorder"+e.getMessage());
            releaseMediaRecorder();
            return false;
        }
        return true;
    }

    @Override
    protected void onPause(){
        super.onPause();
        releaseMediaRecorder();
        releaseCamera();
    }

    private void releaseMediaRecorder(){
        if(mediaRecorder != null){
            mediaRecorder.reset();
            mediaRecorder.release();
            mediaRecorder = null;
            mCamera.lock();
        }
    }

    private void releaseCamera(){
        if(mCamera != null){
            mCamera.release();
            mCamera = null;
        }
    }

    public static final int MEDIA_TYPE_VIDEO = 2;

    private static File getoutputMediaFile(int type){

        File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory(
                Environment.DIRECTORY_PICTURES),"MyCameraApp");

        if( ! mediaStorageDir.exists()){
            if(! mediaStorageDir.mkdirs()){
                Log.d("MyCameraApp","Falha na criação do diretório");
                return null;
            }
        }

        String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
        File mediaFile;
        if(type == MEDIA_TYPE_VIDEO){
            mediaFile = new File(mediaStorageDir.getPath() + File.separator +
                    "VID_" + timeStamp + ".mp4");
        } else {
            return null;
        }

        return mediaFile;

    }




}

当我在智能手机上执行它时,出现此错误

´´´
      Process: com.example.myapplication,PID: 29541
    java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String 
         java.io.File.toString()' on a null object reference
        at com.example.myapplication.MainActivity.prepareVideoRecorder(MainActivity.java:95)
        at com.example.myapplication.MainActivity.access$400(MainActivity.java:22)
        at com.example.myapplication.MainActivity$1.onClick(MainActivity.java:55)
        at android.view.View.performClick(View.java:7161)
        at com.google.android.material.button.MaterialButton.performClick(MaterialButton.java:992)
        at android.view.View.performClickInternal(View.java:7133)
        at android.view.View.access$3500(View.java:804)
        at android.view.View$PerformClick.run(View.java:27416)
        at android.os.Handler.handleCallback(Handler.java:883)
        at android.os.Handler.dispatchMessage(Handler.java:100)
        at android.os.Looper.loop(Looper.java:241)
        at android.app.ActivityThread.main(ActivityThread.java:7604)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:941)

´´´

显然,当我调用方法 toString() 来保存我创建的文件时,我试图调用方法 setoutputFile()。但是,当我按下按钮来捕获视频时,它显示错误

Attempt to invoke virtual method 'java.lang.String 
         java.io.File.toString()' on a null object reference

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...