2014-11-03 26 views
6

Tôi đã tạo hoạt động camera sẽ chụp ảnh từ máy ảnh phía sau và phía trước. Nhưng tôi liên tục nhận được lỗi được đề cập ở trên, bất kỳ ai cũng có thể giúp tôi:Gọi startActivity() từ bên ngoài bối cảnh Hoạt động yêu cầu ngoại lệ cờ FLAG_ACTIVITY_NEW_TASK - Android

Có vẻ như tôi đang làm một số lỗi trong tệp Menifest trong mục đích gọi nhưng không thể hiểu được tôi đang làm gì.

Đây là tôi 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 

Trả lời

24

Vấn đề của bạn là ở đây:

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

Trong mã này, bạn cần phải thêm cờ nhiệm vụ mới cho Intent trước khi gọi startActivity() với:

intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
+1

@ David Wasser !!! Thankuuu Vì vậy, nhiều Devid .. u đã lưu công việc của tôi :) Cảm ơn rất nhiều lần nữa ... – user2014

0

Tôi nghĩ rằng tôi có vấn đề này là quá khứ.

Hãy thử uncommenting dòng này:

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

Tôi đã thử nó nhưng st bệnh tôi đang nhận được cùng một vấn đề. Tôi cũng đang thêm nhật ký logcate. – user2014

+0

Ý tưởng đúng, sai vị trí - điều này cần phải được trong (rõ ràng kiểm tra?) Mã mà gửi ý định từ một bối cảnh không hoạt động (có lẽ là một dịch vụ). Đặt cài đặt này trên Hoạt động trong tệp kê khai có thể là giải pháp thay thế, nhưng không rõ liệu nó có muốn nói chung hay không. –

+0

Xin chào Chris, Cảm ơn bạn đã trả lời nhanh. Tôi thực sự đấu tranh để khắc phục vấn đề này. nếu có thể, bạn có thể đề xuất mã có thể giúp tôi. – user2014

Các vấn đề liên quan