2014-11-03 21 views
6

Ho creato un'attività della fotocamera che scatta foto dalla fotocamera posteriore e anteriore. Ma continuo a ricevere l'errore sopra menzionato, nessuno può darmi una mano:Chiamare startActivity() dall'esterno di un contesto Attività richiede l'eccezione flag FLAG_ACTIVITY_NEW_TASK - Android

Sembra che sto facendo qualche errore nel file di manifest nel tentativo di chiamare ma non in grado di capire quale errore sto facendo.

Ecco il mio CameraActivity.java

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 < 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 < 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<=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 :** 

    <?xml version="1.0" encoding="utf-8"?> 
    <manifest xmlns:android="http://schemas.android.com/apk/res/android" 
     package="com.TestCase.TestCase" 
     android:versionCode="1" 
     android:versionName="1.0" > 

     <uses-sdk 
      android:maxSdkVersion="21" 
      android:minSdkVersion="14" 
      android:targetSdkVersion="21" /> 

     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
     <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> 
     <uses-permission android:name="android.permission.INTERACT_ACROSS_USERS_FULL" /> 
     <uses-permission android:name="android.permission.INTERNET" /> 
     <uses-permission android:name="android.permission.NFC" /> 
     <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/
     <uses-feature android:name="android.hardware.camera" /> 
     <uses-feature android:name="android.hardware.camera.flash" /> 

     <uses-permission android:name="android.permission.RECORD_AUDIO" /> 

     <application 
      android:allowBackup="true" 
      android:icon="@drawable/ic_launcher" 
      android:label="@string/app_name" 
      android:theme="@style/AppTheme" > 
      <activity 
       android:name=".main_activities.TestCaseActivity" 
       android:label="@style/AppTheme" > 
       <intent-filter> 
        <action android:name="android.intent.action.MAIN" /> 

        <category android:name="android.intent.category.LAUNCHER" /> 
       </intent-filter> 
      </activity> 
      <activity 
       android:name="com.TestCase.TestCase.core.util.CameraActivity" 
       android:label="@string/title_activity_camera" > 
      </activity> 

      <activity android:name=".main_activities.SetPreferenceActivity" /> 
      <activity 
       android:name=".main_activities.SummaryActivity" 
       android:label="@string/title_activity_summary" > 
      </activity> 

      <activity 
       android:name="com.TestCase.TestCase.main_activities.AboutActivity" 
       android:label="@string/title_activity_about" > 
      </activity> 

      <service android:name=".services.MasterService" /> 
      <service android:name=".services.TestCaseBootService" /> 
      <service android:name=".services.ActivityLauncherService" /> 

      <receiver android:name=".recievers.BootReciever" > 
       <intent-filter> 
        <action android:name="android.intent.action.BOOT_COMPLETED" /> 
       </intent-filter> 
      </receiver> 
      <receiver android:name="com.TestCase.TestCase.framework.TestActionEndBroadcastReceiver" > 
      </receiver> 
      <receiver android:name="com.TestCase.TestCase.system.TestProgressUpdater$UpdateBroadcast" > 
      </receiver> 
     </application> 

    </manifest> 

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 

risposta

24

Il tuo problema è qui:

at com.qualcomm.post.core.multimedia.LaunchRearCameraTestAction.start(LaunchRearCameraTestAction.java:24)

In questo codice è necessario aggiungere la nuova bandiera compito al Intent prima di chiamare startActivity() con:

intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
+1

@ David Wasser !!! Thankuuu Tanto Devid .. hai salvato il mio lavoro :) Grazie mille ancora ... – user2014

0

Penso di aver avuto questo problema è il passato.

Prova decommentando questa linea:

//localIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
+0

Ho provato ma st sto ricevendo lo stesso problema. Sto aggiungendo anche log logate. – user2014

+0

Giusta idea, posizione errata - questo deve essere nel codice (apparentemente test?) Che invia l'intento da un contesto di non attività (forse un servizio). L'impostazione di questa attività su manifest nel file manifest potrebbe essere una soluzione, ma non è chiaro se si desideri ottenerlo in generale. –

+0

Ciao Chris, grazie per una rapida risposta. Sto davvero lottando per risolvere questo problema. se possibile, puoi suggerire il codice che può aiutarmi. – user2014