大佬教程收集整理的这篇文章主要介绍了从Activity上下文外部调用startActivity()需要FLAG_ACTIVITY_NEW_TASK标志异常 – Android,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
似乎我在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://scheR_755_11845@as.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 @R_574_10586@l 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
以上是大佬教程为你收集整理的从Activity上下文外部调用startActivity()需要FLAG_ACTIVITY_NEW_TASK标志异常 – Android全部内容,希望文章能够帮你解决从Activity上下文外部调用startActivity()需要FLAG_ACTIVITY_NEW_TASK标志异常 – Android所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。