title: Calling startActivity() from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK flag exception - Android
body: <p>I have created a camera activity which will take pic from rear and front camera. But I am keep getting above mentioned error can any one help me out : </p>
  
  <p>Seems like i am doing some mistake in Menifest file in calling intent but not able to figure it out what mistake i am doing. </p>
  
  <p>Here is my <strong>CameraActivity.java</strong> </p>
  
  <pre><code>    public class CameraActivity extends Activity {
  
          private static CameraActivity inst;
  
          private Camera mCamera;
          private CameraPreview mPreview;
          private MediaRecorder mMediaRecorder;
          private FrameLayout preview;
          private boolean isRecording = false;
  
          private static final int CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE = 100;
          private static final int CAPTURE_VIDEO_ACTIVITY_REQUEST_CODE = 200;
          public static final int MEDIA_TYPE_IMAGE = 1;
          public static final int MEDIA_TYPE_VIDEO = 2;
          private static boolean isPictureTaken = false;
          private static int cameraCount = 0;
  
          @Override
          protected void onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
              setContentView(R.layout.activity_camera);
  
              Log.d("TestCase", "in camera activity on create");
  
              inst = this;
  
              Intent localIntent = getIntent();
              //Intent localIntent = new Intent("com.test.TestCase.core.util.CameraActivity");
              //localIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
              String cameraMode = localIntent.getExtras().getString("Camera");
              Log.d("TestCase", "CameraMode" + cameraMode);
              if (cameraMode.equals("FrontCamera"))
                  inst.mCamera = openFrontFacingCamera();
              else
                  inst.mCamera = openRearFacingCamera();
  
              setCameraView();
  
          }
  
          private void setCameraView() {
  
              if (inst.mCamera != null) {
                  Log.d("TestCase", "Got the Camera Instance");
              } else {
                  Log.d("TestCase", "Camera Instance obtained is null");
              }
  
              // Create our Preview view and set it as the content of our activity.
              inst.mPreview = new CameraPreview(this, mCamera);
              inst.preview = (FrameLayout) findViewById(R.id.camera_preview);
              inst.preview.addView(mPreview);
  
          }
  
          private Camera openRearFacingCamera() {
              Camera cam = null;
              Camera.CameraInfo cameraInfo = new Camera.CameraInfo();
              cameraCount = Camera.getNumberOfCameras();
              Log.d("Camera", "Camera COunt : " + cameraCount);
  
              for (int camIdx = 0; camIdx &lt; cameraCount; camIdx++) {
  
                  Log.d("Camera", " CamIdx : " + camIdx);
  
                  Camera.getCameraInfo(camIdx, cameraInfo);
  
                  if (cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_BACK) {
                      try {
                          cam = Camera.open(camIdx);
                          break;
                      } catch (RuntimeException e) {
                          for (StackTraceElement st : e.getStackTrace())
                              Log.d("Camera", st.toString());
                          // Log.e("Camera failed to open: " +
                          // e.getLocalizedMessage());
                      }
                  }
              }
  
              return cam;
          }
  
          @Override
          protected void onActivityResult(int requestCode, int resultCode, Intent data) {
              if (requestCode == CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE) {
                  if (resultCode == RESULT_OK) {
                      // Image captured and saved to fileUri specified in the Intent
                      Toast.makeText(this, "Image saved to:\n" + data.getData(),
                              Toast.LENGTH_LONG).show();
                  } else if (resultCode == RESULT_CANCELED) {
                      // User cancelled the image capture
                  } else {
                      // Image capture failed, advise user
                  }
              }
  
              if (requestCode == CAPTURE_VIDEO_ACTIVITY_REQUEST_CODE) {
                  if (resultCode == RESULT_OK) {
                      // Video captured and saved to fileUri specified in the Intent
                      Toast.makeText(this, "Video saved to:\n" + data.getData(),
                              Toast.LENGTH_LONG).show();
                  } else if (resultCode == RESULT_CANCELED) {
                      // User cancelled the video capture
                  } else {
                      // Video capture failed, advise user
                  }
              }
          }
  
          /** A safe way to get an instance of the Camera object. */
          private Camera openFrontFacingCamera() {
              // int cameraCount = 0;
              Camera cam = null;
              Camera.CameraInfo cameraInfo = new Camera.CameraInfo();
              cameraCount = Camera.getNumberOfCameras();
              Log.d("Camera", "Camera COunt : " + cameraCount);
  
              for (int camIdx = 0; camIdx &lt; cameraCount; camIdx++) {
  
                  Log.d("Camera", " CamIdx : " + camIdx);
  
                  Camera.getCameraInfo(camIdx, cameraInfo);
  
                  if (cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
                      try {
                          cam = Camera.open(camIdx);
                          break;
                      } catch (RuntimeException e) {
                          for (StackTraceElement st : e.getStackTrace())
                              Log.d("Camera", st.toString());
                          // Log.e("Camera failed to open: " +
                          // e.getLocalizedMessage());
                      }
                  }
              }
  
              return cam;
          }
  
          @Override
          public void onStart() {
              try {
                  super.onStart();
  
              } catch (Exception localException) {
                  Log.d("TestCase", localException.getMessage());
              }
          }
  
          @Override
          public boolean onCreateOptionsMenu(Menu menu) {
              // Inflate the menu; this adds items to the action bar if it is present.
              getMenuInflater().inflate(R.menu.camera, menu);
              return true;
          }
  
          @Override
          public boolean onOptionsItemSelected(MenuItem item) {
              // Handle action bar item clicks here. The action bar will
              // automatically handle clicks on the Home/Up button, so long
              // as you specify a parent activity in AndroidManifest.xml.
              int id = item.getItemId();
              if (id == R.id.action_settings) {
                  return true;
              }
              return super.onOptionsItemSelected(item);
          }
  
          private PictureCallback mPicture = new PictureCallback() {
  
              @Override
              public void onPictureTaken(byte[] data, Camera camera) {
  
                  File pictureFile = getOutputMediaFile(MEDIA_TYPE_IMAGE);
                  if (pictureFile == null) {
                      Log.d("TestCase",
                              "Error creating media file, check storage permissions: ");
                      return;
                  }
  
                  try {
                      Log.d("TestCase", "Picture taken");
                      FileOutputStream fos = new FileOutputStream(pictureFile);
                      fos.write(data);
                      fos.close();
  
                      Log.d("TestCase", "Picture saved");
                      CameraActivity.isPictureTaken = true;
  
                  } catch (FileNotFoundException e) {
                      Log.d("TestCase", "File not found: " + e.getMessage());
                  } catch (IOException e) {
                      Log.d("TestCase", "Error accessing file: " + e.getMessage());
                  }
  
                  try {
                      inst.mCamera.stopPreview();
  
                  } catch (Exception e) {
                      // ignore: tried to stop a non-existent preview
                  }
  
                  // inst.mCamera.release();
  
                  // set preview size and make any resize, rotate or
                  // reformatting changes here
  
                  // start preview with new settings
                  try {
                      inst.mCamera.setPreviewDisplay(mPreview.getHolder());
                      inst.mCamera.startPreview();
  
                  } catch (Exception e) {
                      Log.d("TestCase",
                              "Error starting camera preview: " + e.getMessage());
                  }
              }
          };
  
          public void onCameraClick(View view) {
              try {
  
                  takePicture();
  
              } catch (Exception localException) {
                  Log.d("TestCase", localException.getMessage());
              }
          }
  
          private void takePicture() {
  
              inst.mCamera.takePicture(null, null, mPicture);
          }
  
          /** Create a File for saving an image or video */
          private static File getOutputMediaFile(int type) {
              // To be safe, you should check that the SDCard is mounted
              // using Environment.getExternalStorageState() before doing this.
  
              File mediaStorageDir = new File(
                      Environment
                              .getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES),
                      "TestCase_CamMedia");
              // This location works best if you want the created images to be shared
              // between applications and persist after your app has been uninstalled.
  
              // Create the storage directory if it does not exist
              if (!mediaStorageDir.exists()) {
                  if (!mediaStorageDir.mkdirs()) {
                      Log.d("TestCase", "failed to create directory");
                      return null;
                  }
              }
  
              // Create a media file name
              String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss",
                      Locale.getDefault()).format(new Date());
              File mediaFile;
              if (type == MEDIA_TYPE_IMAGE) {
                  mediaFile = new File(mediaStorageDir.getPath() + File.separator
                          + "IMG_" + timeStamp + ".jpg");
              } else if (type == MEDIA_TYPE_VIDEO) {
                  mediaFile = new File(mediaStorageDir.getPath() + File.separator
                          + "VID_" + timeStamp + ".mp4");
              } else {
                  return null;
              }
  
              return mediaFile;
          }
  
          private boolean prepareVideoRecorder() {
  
              // mCamera = getCameraInstance();
              inst.mMediaRecorder = new MediaRecorder();
              // Step 1: Unlock and set camera to MediaRecorder
              inst.mCamera.unlock();
  
              inst.mMediaRecorder.setCamera(mCamera);
  
              // Step 2: Set sources
              inst.mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);
              inst.mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
  
              // Step 3: Set a CamcorderProfile (requires API Level 8 or higher)
              inst.mMediaRecorder.setProfile(CamcorderProfile
                      .get(CamcorderProfile.QUALITY_HIGH));
  
              // Step 4: Set output file
              inst.mMediaRecorder.setOutputFile(getOutputMediaFile(MEDIA_TYPE_VIDEO)
                      .toString());
  
              // Step 5: Set the preview output
              inst.mMediaRecorder
                      .setPreviewDisplay(mPreview.getHolder().getSurface());
  
              // Step 6: Prepare configured MediaRecorder
              try {
  
                  mMediaRecorder.prepare();
              } catch (IllegalStateException e) {
                  Log.d("TestCase",
                          "IllegalStateException preparing MediaRecorder: "
                                  + e.getMessage());
                  inst.releaseMediaRecorder();
                  return false;
              } catch (IOException e) {
                  Log.d("TestCase",
                          "IOException preparing MediaRecorder: " + e.getMessage());
                  inst.releaseMediaRecorder();
                  return false;
              }
              return true;
  
          }
  
          @Override
          protected void onPause() {
              super.onPause();
              inst.releaseMediaRecorder(); // if you are using MediaRecorder, release
                                              // it first
              inst.releaseCamera(); // release the camera immediately on pause event
          }
  
          private void releaseMediaRecorder() {
              if (inst.mMediaRecorder != null) {
                  inst.mMediaRecorder.reset(); // clear recorder configuration
                  inst.mMediaRecorder.release(); // release the recorder object
                  inst.mMediaRecorder = null;
                  inst.mCamera.lock(); // lock camera for later use
              }
          }
  
          private void releaseCamera() {
              if (inst.mCamera != null) {
                  inst.mCamera.release(); // release the camera for other applications
                  inst.mCamera = null;
              }
          }
  
          public void recordVideo() {
              if (!inst.isRecording) {
                  if (inst.prepareVideoRecorder()) {
                      // Camera is available and unlocked, MediaRecorder is prepared,
                      // now you can start recording
                      inst.mMediaRecorder.start();
                      Log.d("TestCase", "started video recording");
                      // inform the user that recording has started
  
                      inst.isRecording = true;
                  } else
                      inst.releaseMediaRecorder();
              }
          }
  
          public void stopRecording() {
              if (inst.isRecording) {
                  // stop recording and release camera
                  inst.mMediaRecorder.stop(); // stop the recording
                  Log.d("TestCase", "stopped video recording");
                  inst.releaseMediaRecorder(); // release the MediaRecorder object
                  inst.mCamera.lock(); // take camera access back from MediaRecorder
  
                  // inform the user that recording has stopped
                  inst.isRecording = false;
              }
          }
  
          public void onRecordVideo(View view) {
              try {
                  inst.recordVideo();
              } catch (Exception localException) {
                  Log.d("TestCase", localException.getMessage());
              }
          }
  
          public void onStopRecording(View view) {
              try {
                  inst.stopRecording();
              } catch (Exception localException) {
                  Log.d("TestCase", localException.getMessage());
              }
          }
  
          public static boolean TakePicture() {
              inst.takePicture();
              return CameraActivity.isPictureTaken;
          }
  
          public static boolean RecordVideo() {
              inst.recordVideo();
              return inst.isRecording;
          }
  
          public static boolean StopVideo() {
              inst.stopRecording();
              return !inst.isRecording;
          }
  
          public static void CloseCamera() {
              inst.finish();
          }
  
          public static boolean ToggleCamera() throws Exception {
  
              for(int i=1; i&lt;=3 ; i++) {
                  if(i%2==0)
                      inst.mCamera = inst.openRearFacingCamera();
                  else
                      inst.mCamera = inst.openFrontFacingCamera();
  
                  if (inst.mCamera != null) {
                      Log.d("TestCase", "Got the Camera Instance");
                  } else {
                      Log.d("TestCase", "Camera Instance obtained is null");
                  }
                  inst.setCameraView();
                  Thread.sleep(10000L);
              }
              return true;
  
          }
      }
  
  
  
  **Here is ManifestFile :**
  
      &lt;?xml version="1.0" encoding="utf-8"?&gt;
      &lt;manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.TestCase.TestCase"
          android:versionCode="1"
          android:versionName="1.0" &gt;
  
          &lt;uses-sdk
              android:maxSdkVersion="21"
              android:minSdkVersion="14"
              android:targetSdkVersion="21" /&gt;
  
          &lt;uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /&gt;
          &lt;uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /&gt;
          &lt;uses-permission android:name="android.permission.INTERACT_ACROSS_USERS_FULL" /&gt;
          &lt;uses-permission android:name="android.permission.INTERNET" /&gt;
          &lt;uses-permission android:name="android.permission.NFC" /&gt;
          &lt;uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /
          &lt;uses-feature android:name="android.hardware.camera" /&gt;
          &lt;uses-feature android:name="android.hardware.camera.flash" /&gt;
  
          &lt;uses-permission android:name="android.permission.RECORD_AUDIO" /&gt;
  
          &lt;application
              android:allowBackup="true"
              android:icon="@drawable/ic_launcher"
              android:label="@string/app_name"
              android:theme="@style/AppTheme" &gt;
              &lt;activity
                  android:name=".main_activities.TestCaseActivity"
                  android:label="@style/AppTheme" &gt;
                  &lt;intent-filter&gt;
                      &lt;action android:name="android.intent.action.MAIN" /&gt;
  
                      &lt;category android:name="android.intent.category.LAUNCHER" /&gt;
                  &lt;/intent-filter&gt;
              &lt;/activity&gt;
              &lt;activity
                  android:name="com.TestCase.TestCase.core.util.CameraActivity"
                  android:label="@string/title_activity_camera" &gt;
              &lt;/activity&gt;
  
              &lt;activity android:name=".main_activities.SetPreferenceActivity" /&gt;
              &lt;activity
                  android:name=".main_activities.SummaryActivity"
                  android:label="@string/title_activity_summary" &gt;
              &lt;/activity&gt;
  
              &lt;activity
                  android:name="com.TestCase.TestCase.main_activities.AboutActivity"
                  android:label="@string/title_activity_about" &gt;
              &lt;/activity&gt;
  
              &lt;service android:name=".services.MasterService" /&gt;
              &lt;service android:name=".services.TestCaseBootService" /&gt;
              &lt;service android:name=".services.ActivityLauncherService" /&gt;
  
              &lt;receiver android:name=".recievers.BootReciever" &gt;
                  &lt;intent-filter&gt;
                      &lt;action android:name="android.intent.action.BOOT_COMPLETED" /&gt;
                  &lt;/intent-filter&gt;
              &lt;/receiver&gt;
              &lt;receiver android:name="com.TestCase.TestCase.framework.TestActionEndBroadcastReceiver" &gt;
              &lt;/receiver&gt;
              &lt;receiver android:name="com.TestCase.TestCase.system.TestProgressUpdater$UpdateBroadcast" &gt;
              &lt;/receiver&gt;
          &lt;/application&gt;
  
      &lt;/manifest&gt;
  
  Logcat : 
  
   11-03 19:31:21.782: D/TestCase(11635): [11.03.14_19:31:021]    came back from thread starting itest action 
      11-03 19:31:21.782: D/TestCase(11635): [11.03.14_19:31:021] Came back after starting action thread
      11-03 19:31:21.804: D/TestCase(11635): [11.03.14_19:31:021] from thread starting itest action 
      11-03 19:31:21.806: D/TestCase(11635): [11.03.14_19:31:021] Recieved onFinishPrepare
      11-03 19:31:21.834: D/TestCase(11635): [11.03.14_19:31:021] Error found when test is running: android.util.AndroidRuntimeException: Calling startActivity() from outside of an Activity  context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?
      11-03 19:31:21.834: D/TestCase(11635):  at android.app.ContextImpl.startActivity(ContextImpl.java:1232)
      11-03 19:31:21.834: D/TestCase(11635):  at android.app.ContextImpl.startActivity(ContextImpl.java:1219)
      11-03 19:31:21.834: D/TestCase(11635):  at android.content.ContextWrapper.startActivity(ContextWrapper.java:322)
      11-03 19:31:21.834: D/TestCase(11635):  at com.originatorTestCase.TestCase.core.multimedia.LaunchRearCameraTestAction.start(LaunchRearCameraTestAction.java:24)
      11-03 19:31:21.834: D/TestCase(11635):  at com.originatorTestCase.TestCase.framework.TestActionExecutor.startAction(TestActionExecutor.java:54)
      11-03 19:31:21.834: D/TestCase(11635):  at com.originatorTestCase.TestCase.framework.TestActionExecutor.access$1(TestActionExecutor.java:49)
      11-03 19:31:21.834: D/TestCase(11635):  at com.originatorTestCase.TestCase.framework.TestActionExecutor$ActionThread.run(TestActionExecutor.java:166)
      11-03 19:31:21.837: D/TestCase(11635): [11.03.14_19:31:021] TestAction Execution Finished : LaunchRearCamera id : 3
      11-03 19:31:21.838: D/TestCase(11635): [11.03.14_19:31:021] TestRunner onFinish(ITestAction) : [null]nullnull(null):
      11-03 19:31:21.862: D/TestCase(11635): [11.03.14_19:31:021] Completed [LaunchRearCamera TestAction] iteration : 1
      11-03 19:31:21.862: D/TestCase(11635): RESULT = [action="LaunchRearCamera" status="FAIL" iteration="1" startTime="11.03.14 19:31:21" duration="0" endTime="11.03.14 19:31:21" failedReason=" [null]nullnull(null): Executing error : android.util.AndroidRuntimeException: Calling startActivity() from outside of an Activity  context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want? ""]
      11-03 19:31:21.863: D/TestCase(11635): [11.03.14_19:31:021] Has errors so stop test case RearCameraTakePictureTest
      11-03 19:31:21.886: D/TestCase(11635): [11.03.14_19:31:021] Completed total 1 iterations for action LaunchRearCamera.
      11-03 19:31:21.888: D/TestCase(11635): [11.03.14_19:31:021] ==========================================================
      11-03 19:31:21.906: D/TestCase(11635): [11.03.14_19:31:021] ==========================================================
      11-03 19:31:21.912: D/TestCase(11635): [11.03.14_19:31:021] Start Test Action TakePicture
      11-03 19:31:21.922: D/TestCase(11635): [11.03.14_19:31:021] Preparing for test action TakePicture
      11-03 19:31:21.925: D/TestCase(11635): [11.03.14_19:31:021] Begin [TakePicture TestAction] iteration : 1
      11-03 19:31:21.928: D/TestCase(11635): [11.03.14_19:31:021] Next random TakePicture-duration = 15
      11-03 19:31:21.947: D/TestCase(11635): [11.03.14_19:31:021] triggering schedule Task
      11-03 19:31:21.966: D/TestCase(11635): [11.03.14_19:31:021] initializing task infor
      11-03 19:31:21.968: D/TestCase(11635): [11.03.14_19:31:021] initializing thread
      11-03 19:31:21.974: D/TestCase(11635): [11.03.14_19:31:021] adding thread to task info
      11-03 19:31:21.976: D/TestCase(11635): [11.03.14_19:31:021] putting thread refrence in concurrent hash map
      11-03 19:31:21.977: D/TestCase(11635): [11.03.14_19:31:021] starting thread
      11-03 19:31:21.979: D/TestCase(11635): [11.03.14_19:31:021] came back after starting thread
      11-03 19:31:21.991: D/TestCase(11635): [11.03.14_19:31:021] in Action thread. 
      11-03 19:31:21.991: D/TestCase(11635): [11.03.14_19:31:021] Acquire WL for TakePicture
      11-03 19:31:21.995: D/TestCase(11635): [11.03.14_19:31:021] came back after triggering schedule Task
      11-03 19:31:21.996: D/TestCase(11635): [11.03.14_19:31:021] Came back after call back of testAction : LaunchRearCamera
      11-03 19:31:21.996: D/TestCase(11635): [11.03.14_19:31:021] Came back after starting action thread
      11-03 19:31:22.014: D/TestCase(11635): [11.03.14_19:31:022] from thread starting itest action 
      11-03 19:31:22.015: D/TestCase(11635): [11.03.14_19:31:022] Recieved onFinishPrepare
      11-03 19:31:22.024: D/TestCase(11635): [11.03.14_19:31:022] Error found when test is running: java.lang.NullPointerException: Attempt to invoke direct method 'void com..core.util.CameraActivity.takePicture()' on a null object reference
      11-03 19:31:22.024: D/TestCase(11635):  at core.util.CameraActivity.TakePicture(CameraActivity.java:403)
      11-03 19:31:22.024: D/TestCase(11635):  at 
  </code></pre>