我创建了一个相机活动,它将从后置和前置摄像头拍摄照片.但我一直得到上面提到的错误可以任何人帮助我:
似乎我在Menifest文件中在调用intent时犯了一些错误,但无法弄清楚我在做什么错误.
这是我的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",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