title: Attempt to invoke virtual method 'android.hardware.Display.VirtualDisplay'
body: <p>What to do with this error this code is for screen recorder which is giving error after the toggle button is clicked means it say application closed without doing any furthur operation but app launches initially very well But the problem ocurs when clicked the button</p>
  
  <p>public class MainActivity extends AppCompatActivity {</p>
  
  <pre><code>private static final int REQUEST_CODE = 11;
  private static final int MEDIA_CODE = 12;
  private static final SparseIntArray ORIENTAIONS = new SparseIntArray();
  
  private MediaProjectionManager mediaProjectionManager;
  private MediaProjection mediaProjection;
  private VirtualDisplay virtualDisplay;
  private MediaRecorder mediaRecorder;
  
  private MediaProjectionCallback mediaProjectionCallback;
  
  private int mScreenDensity;
  private static final int DISPLAY_WIDTH = 720;
  private static final int DISPLAY_HEIGHT = 1280;
  static
  {
      ORIENTAIONS.append(Surface.ROTATION_0, 90);
      ORIENTAIONS.append(Surface.ROTATION_90, 0);
      ORIENTAIONS.append(Surface.ROTATION_180, 270);
      ORIENTAIONS.append(Surface.ROTATION_270, 180);
  }
  private ToggleButton btnToggle;
  private VideoView videoView;
  private String videoUri = "";
  private RelativeLayout rootLayout;
  @Override
  protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
      btnToggle = findViewById(R.id.btnToggle);
      videoView = findViewById(R.id.videoView);
      rootLayout = findViewById(R.id.rootLayout);
  
      DisplayMetrics metrics = new DisplayMetrics();
      getWindowManager().getDefaultDisplay().getMetrics(metrics);
      mScreenDensity = metrics.densityDpi;
      mediaRecorder = new MediaRecorder();
      mediaProjectionManager = (MediaProjectionManager) getSystemService(Context.MEDIA_PROJECTION_SERVICE);
  
      btnToggle.setOnClickListener(new View.OnClickListener() {
          @Override
          public void onClick(View v) {
              if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE)
               + ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.RECORD_AUDIO) !=
                      PackageManager.PERMISSION_GRANTED)
              {
                  if (ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE)
                  || ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this, Manifest.permission.RECORD_AUDIO))
                  {
                      btnToggle.setChecked(false);
                      Snackbar.make(rootLayout, "Permissions", Snackbar.LENGTH_INDEFINITE)
                              .setAction("ENABLE", new View.OnClickListener() {
                                  @Override
                                  public void onClick(View v) {
                                      ActivityCompat.requestPermissions(MainActivity.this,
                                              new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE,
                                              Manifest.permission.RECORD_AUDIO}, REQUEST_CODE);
                                  }
                              }).show();
                  }
                  else
                  {
                      ActivityCompat.requestPermissions(MainActivity.this,
                              new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE,
                                      Manifest.permission.RECORD_AUDIO}, REQUEST_CODE);
                  }
              }
              else
              {
                  toggleScreenShare(v);
              }
          }
      });
  
  
  }
  
  private void toggleScreenShare(View v) {
      if (((ToggleButton)v).isChecked())
      {
          initRecorder();
          screenRecord();
      }
      else
      {
          mediaRecorder.stop();
          mediaRecorder.reset();
          stopRecordScreen();
  
          //Video View
          videoView.setVisibility(View.VISIBLE);
          videoView.setVideoURI(Uri.parse(videoUri));
          videoView.start();
      }
  }
  
  private void screenRecord() {
      if (mediaRecorder == null)
      {
          startActivityForResult(mediaProjectionManager.createScreenCaptureIntent(), MEDIA_CODE);
          return;
      }
      virtualDisplay = createVirtualDisplay();
      mediaRecorder.start();
  }
  
  private VirtualDisplay createVirtualDisplay() {
  
      return mediaProjection.createVirtualDisplay("MainActivity", DISPLAY_WIDTH, DISPLAY_HEIGHT, mScreenDensity,
              DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR, mediaRecorder.getSurface(), null, null);
  
  }
  
  private void initRecorder() {
      try {
          mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
          mediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE);
          mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
  
          videoUri = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS)
                  + new StringBuilder("/Video_Screen").append(new SimpleDateFormat("dd-MM-yyyy-hh_mm_ss")
          .format(new Date())).append(".mp4").toString();
  
          mediaRecorder.setOutputFile(videoUri);
          mediaRecorder.setVideoSize(DISPLAY_WIDTH,DISPLAY_HEIGHT);
          mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
          mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
          mediaRecorder.setVideoEncodingBitRate(512*1000);
          mediaRecorder.setVideoFrameRate(30);
  
          int rotation = getWindowManager().getDefaultDisplay().getRotation();
          int orientation = ORIENTAIONS.get(rotation + 90);
          mediaRecorder.setOrientationHint(orientation);
          mediaRecorder.prepare();
      } catch (IOException e) {
  
          e.printStackTrace();
      }
  
  
  }
  
  @Override
  protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
      super.onActivityResult(requestCode, resultCode, data);
      if (requestCode != REQUEST_CODE)
      {
          Toast.makeText(MainActivity.this, "Unknown error..", Toast.LENGTH_SHORT).show();
          return;
      }
          if (requestCode != RESULT_OK) {
              Toast.makeText(MainActivity.this, "Permission denied..", Toast.LENGTH_SHORT).show();
              btnToggle.setChecked(false);
              return;
          }
  
          mediaProjectionCallback = new MediaProjectionCallback();
          mediaProjection = mediaProjectionManager.getMediaProjection(resultCode, data);
          mediaProjection.registerCallback(mediaProjectionCallback, null);
         virtualDisplay = createVirtualDisplay();
          mediaRecorder.start();
  
  }
  
  private class MediaProjectionCallback extends MediaProjection.Callback {
  
      @Override
      public void onStop() {
          if (btnToggle.isChecked())
          {
              btnToggle.setChecked(false);
              mediaRecorder.stop();
              mediaRecorder.reset();
  
          }
  
          mediaProjection = null;
          stopRecordScreen();
          super.onStop();
      }
  
  }
  private void stopRecordScreen() {
  
      if (virtualDisplay == null)
          return;
      virtualDisplay.release();
      destroyMediaProjection();
  }
  
  private void destroyMediaProjection() {
      if (mediaProjection != null)
      {
          mediaProjection.unregisterCallback(mediaProjectionCallback);
          mediaProjection.stop();
          mediaProjection = null;
      }
  }
  
  @Override
  public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
      super.onRequestPermissionsResult(requestCode, permissions, grantResults);
      switch (requestCode)
      {
          case REQUEST_CODE:
              if ((grantResults.length &gt; 0) &amp;&amp; (grantResults[0] + grantResults[1] == PackageManager.PERMISSION_GRANTED))
              {
                  toggleScreenShare(btnToggle);
              }
              else
              {
  
                  btnToggle.setChecked(false);
                  Snackbar.make(rootLayout, "Permissions", Snackbar.LENGTH_INDEFINITE)
                          .setAction("ENABLE", new View.OnClickListener() {
                              @Override
                              public void onClick(View v) {
                                  ActivityCompat.requestPermissions(MainActivity.this,
                                          new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE,
                                                  Manifest.permission.RECORD_AUDIO}, REQUEST_CODE);
                              }
                          }).show();
              }
              return;
      }
  }
  </code></pre>
  
  <p>}</p>
  
  <p>Below is Log_cat</p>
  
  <pre><code>    Process: com.aman.screenrecorderapp, PID: 32086
      java.lang.NullPointerException: Attempt to invoke virtual method 'android.hardware.display.VirtualDisplay android.media.projection.MediaProjection.createVirtualDisplay(java.lang.String, int, int, int, int, android.view.Surface, android.hardware.display.VirtualDisplay$Callback, android.os.Handler)' on a null object reference
          at com.aman.screenrecorderapp.MainActivity.createVirtualDisplay(MainActivity.java:146)
          at com.aman.screenrecorderapp.MainActivity.screenRecord(MainActivity.java:140)
          at com.aman.screenrecorderapp.MainActivity.toggleScreenShare(MainActivity.java:119)
          at com.aman.screenrecorderapp.MainActivity.access$200(MainActivity.java:36)
          at com.aman.screenrecorderapp.MainActivity$1.onClick(MainActivity.java:107)
          at android.view.View.performClick(View.java:4799)
          at android.widget.CompoundButton.performClick(CompoundButton.java:120)
          at android.view.View$PerformClick.run(View.java:20042)
          at android.os.Handler.handleCallback(Handler.java:739)
          at android.os.Handler.dispatchMessage(Handler.java:95)
          at android.os.Looper.loop(Looper.java:135)
          at android.app.ActivityThread.main(ActivityThread.java:5422)
          at java.lang.reflect.Method.invoke(Native Method)
          at java.lang.reflect.Method.invoke(Method.java:372)
          at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:914)
          at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:707)```
  
  </code></pre>