title: java.lang.IllegalStateException: failed to get surface
body: <p>I am trying to create an app which enables the user to record his smartphones's screen. 
  This is my starting code:</p>
  
  <pre><code>   import android.content.Context;
  import android.content.Intent;
  import android.hardware.display.DisplayManager;
  import android.hardware.display.VirtualDisplay;
  import android.media.MediaRecorder;
  import android.media.projection.MediaProjection;
  import android.media.projection.MediaProjectionManager;
  import android.os.Environment;
  import android.support.v7.app.AppCompatActivity;
  import android.os.Bundle;
  import android.util.DisplayMetrics;
  import android.util.Log;
  import android.widget.Button;
  import android.widget.Toast;
  
  import java.io.File;
  import java.text.SimpleDateFormat;
  import java.util.Date;
  
  public class MainActivity extends AppCompatActivity
  {
  
      private static final int CAST_PERMISSION_CODE = 22;
      private DisplayMetrics mDisplayMetrics = new DisplayMetrics();
      private MediaProjection mMediaProjection;
      private VirtualDisplay mVirtualDisplay;
      private MediaRecorder mMediaRecorder;
      private MediaProjectionManager mProjectionManager;
  
      private Button startButton;
  
      @Override
      protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_main);
  
          startButton = (Button) findViewById( R.id.recordButton );
  
          mMediaRecorder = new MediaRecorder();
  
          mProjectionManager = (MediaProjectionManager) getSystemService(Context.MEDIA_PROJECTION_SERVICE);
  
          getWindowManager().getDefaultDisplay().getMetrics(this.mDisplayMetrics);
  
          prepareRecording();
          startRecording();
      }
  
      private void startRecording() {
          // If mMediaProjection is null that means we didn't get a context, lets ask the user
          if (mMediaProjection == null) {
              // This asks for user permissions to capture the screen
              startActivityForResult(mProjectionManager.createScreenCaptureIntent(), CAST_PERMISSION_CODE);
              return;
          }
          mVirtualDisplay = getVirtualDisplay();
          mMediaRecorder.start();
      }
  
      private void stopRecording() {
          if (mMediaRecorder != null) {
              mMediaRecorder.stop();
              mMediaRecorder.reset();
          }
          if (mVirtualDisplay != null) {
              mVirtualDisplay.release();
          }
          if (mMediaProjection != null) {
              mMediaProjection.stop();
          }
          prepareRecording();
      }
  
      public String getCurSysDate() {
          return new SimpleDateFormat("yyyy-MM-dd_HH-mm-ss").format(new Date());
      }
  
      private void prepareRecording() {
          try {
              mMediaRecorder.prepare();
          } catch (Exception e) {
              e.printStackTrace();
              return;
          }
  
          final String directory = Environment.getExternalStorageDirectory() + File.separator + "Recordings";
          if (!Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())) {
              Toast.makeText(this, "Failed to get External Storage", Toast.LENGTH_SHORT).show();
              return;
          }
          final File folder = new File(directory);
          boolean success = true;
          if (!folder.exists()) {
              success = folder.mkdir();
          }
          String filePath;
          if (success) {
              String videoName = ("capture_" + getCurSysDate() + ".mp4");
              filePath = directory + File.separator + videoName;
          } else {
              Toast.makeText(this, "Failed to create Recordings directory", Toast.LENGTH_SHORT).show();
              return;
          }
  
          int width = mDisplayMetrics.widthPixels;
          int height = mDisplayMetrics.heightPixels;
  
          mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
          mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE);
          mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
          mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
          mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
          mMediaRecorder.setVideoEncodingBitRate(512 * 1000);
          mMediaRecorder.setVideoFrameRate(30);
          mMediaRecorder.setVideoSize(width, height);
          mMediaRecorder.setOutputFile(filePath);
      }
  
      @Override
      public void onActivityResult(int requestCode, int resultCode, Intent data) {
          if (requestCode != CAST_PERMISSION_CODE) {
              // Where did we get this request from ? -_-
              //Log.w(TAG, "Unknown request code: " + requestCode);
              return;
          }
          if (resultCode != RESULT_OK) {
              Toast.makeText(this, "Screen Cast Permission Denied :(", Toast.LENGTH_SHORT).show();
              return;
          }
          mMediaProjection = mProjectionManager.getMediaProjection(resultCode, data);
          // TODO Register a callback that will listen onStop and release &amp; prepare the recorder for next recording
          // mMediaProjection.registerCallback(callback, null);
          mVirtualDisplay = getVirtualDisplay();
          mMediaRecorder.start();
      }
  
      private VirtualDisplay getVirtualDisplay()
      {
          int screenDensity = mDisplayMetrics.densityDpi;
          int width = mDisplayMetrics.widthPixels;
          int height = mDisplayMetrics.heightPixels;
  
          return mMediaProjection.createVirtualDisplay(this.getClass().getSimpleName(), width, height, screenDensity, DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR, mMediaRecorder.getSurface(), null /*Callbacks*/, null /*Handler*/);
      }
  
  }
  </code></pre>
  
  <p>After showing a message that informs the user about the screen capture function, my app crushes.</p>
  
  <pre><code>java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=22, result=-1, data=Intent { (has extras) }} to activity {gr.awm.clrecorder/gr.awm.clrecorder.MainActivity}: java.lang.IllegalStateException: failed to get surface
                                                                     at android.app.ActivityThread.deliverResults(ActivityThread.java:3974)
                                                                     at android.app.ActivityThread.handleSendResult(ActivityThread.java:4017)
                                                                     at android.app.ActivityThread.access$1400(ActivityThread.java:172)
                                                                     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1471)
                                                                     at android.os.Handler.dispatchMessage(Handler.java:102)
                                                                     at android.os.Looper.loop(Looper.java:145)
                                                                     at android.app.ActivityThread.main(ActivityThread.java:5832)
                                                                     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:1399)
                                                                     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1194)
                                                                  Caused by: java.lang.IllegalStateException: failed to get surface
                                                                     at android.media.MediaRecorder.getSurface(Native Method)
                                                                     at gr.awm.clrecorder.MainActivity.getVirtualDisplay(MainActivity.java:148)
                                                                     at gr.awm.clrecorder.MainActivity.onActivityResult(MainActivity.java:135)
  </code></pre>
  
  <p>Is there a way to solve this issue? Any advice would be helpful and deeply appreciated.
  Thanks in advance</p>