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
@ David Wasser !!! Thankuuu Tanto Devid .. hai salvato il mio lavoro :) Grazie mille ancora ... – user2014