title: Record Video to External SD Card on Android
body: <p>I am trying to record video to an external SD card. However, everytime I try and acutally record the data -- I always get a java.io.FileNotFound exception. I was wondering if anyone knew of any tutorials or could help correct my code.</p>
  
  <p>Here is the class in which tries to record video </p>
  
  <pre><code>public class VideoActivity extends Activity {
  
  private SurfaceView preview;
  private SurfaceHolder previewHolder;
  private String locationName;
  private String filepath;
  private File video;
  
  public void onCreate(Bundle videocawk) {
      super.onCreate(videocawk);
      setContentView(R.layout.video_layout);
      setSurface();
      locationName = getIntent().getStringExtra("locationName");
      filepath = getFilePath(locationName);
      try {
          MediaRecorder r = getMediaRecorder(filepath, previewHolder
                  .getSurface());
          setSurfaceCallback(preview,r);
          setButtonListeners(r);
      } catch (IllegalStateException e) {
          // TODO Auto-generated catch block
          e.printStackTrace();
      } catch (IOException e) {
          // TODO Auto-generated catch block
          e.printStackTrace();
      }
  }
  
  private String getFilePath(String locName) {
      String dir = Environment.getExternalStorageDirectory().getAbsolutePath();
      String add = "/test/data/video/";
      String name = locName + "--1";
      String total = dir + add + name;
      video = new File(total);
      return total;
  }
  
  private void setSurface() {
      preview = (SurfaceView) findViewById(R.id.preview);
      previewHolder = preview.getHolder();
      previewHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
  }
  
  private void setButtonListeners(final MediaRecorder r) {
      Button start = (Button) findViewById(R.id.start_video);
      Button end = (Button) findViewById(R.id.stop_video);
  
      start.setOnClickListener(new View.OnClickListener() {
  
          public void onClick(View v) {
              startRecording(r);
  
          }
      });
  
      end.setOnClickListener(new View.OnClickListener() {
  
          public void onClick(View v) {
              stopRecording(r);
              setPassPrefs();
              startActivity(setPassPrefs());
              finish();
  
          }
      });
  
  }
  
  private void setSurfaceCallback(SurfaceView s, final MediaRecorder r)
  {
  
  
  SurfaceHolder.Callback surfaceCallback = new SurfaceHolder.Callback() {
      public void surfaceCreated(SurfaceHolder holder) {
  
          try {
              r.setPreviewDisplay(previewHolder.getSurface());
          } catch (Throwable t) {
              Log.e("PictureDemo-surfaceCallback",
                      "Exception in setPreviewDisplay()", t);
              Toast.makeText(VideoActivity.this, t.getMessage(),
                      Toast.LENGTH_LONG).show();
          }
      }
  
      public void surfaceChanged(SurfaceHolder holder, int format, int width,
              int height) {
  
      }
  
      public void surfaceDestroyed(SurfaceHolder holder) {
          r.stop();
          r.release();
  
      }
  };
  
  previewHolder.addCallback(surfaceCallback); 
  }
  
  private Intent setPassPrefs() {
      AttachedImageAdapter adapter = new AttachedImageAdapter(locationName,
              VideoActivity.this);
      adapter.setVideoPath(filepath);
      Intent i = new Intent(VideoActivity.this, EnterTag.class);
      i.putExtras(getIntent());
      return i;
  
  }
  
  private void startRecording(MediaRecorder r) {
      r.start();
  }
  
  private void stopRecording(MediaRecorder r) {
      r.stop();
  }
  
  private MediaRecorder getMediaRecorder(String filepath, Surface s)
          throws IllegalStateException, IOException {
      MediaRecorder m_recorder = new MediaRecorder();
      m_recorder.setPreviewDisplay(s);
      m_recorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);
      m_recorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
      m_recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
      m_recorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
      m_recorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
      m_recorder.setMaxDuration(20000); // length of video in MS
      m_recorder.setVideoSize(320, 240);
      m_recorder.setVideoFrameRate(15);
      m_recorder.setOutputFile(video.getPath());
      m_recorder.prepare();
  
      return m_recorder;
  }
  </code></pre>
  
  <p>}</p>
  
  <p>Any help would be appreciated -- and thanks again in advance. Also, here is a <a href="http://pastebin.com/CR01YrCu" rel="nofollow noreferrer">pastebin</a> that has the layout that the video activity references. </p>
  
  <p><a href="http://pastebin.com/mKqkjvJA" rel="nofollow noreferrer">Here</a> is the PasteBin of my error log -- if it helps. </p>