Video capture intent causing issues on low RAM device - android

The problem is pretty complex. Basically, I have a FragmentActivity (HomeActivity) that holds a fragment (CategoriesFragment) that holds another fragment (VideoFragment which covers the containing fragment completely when added) that I am using to record video which works great on most devices, but as I test on a SGH-T989 running android 4.1.2 the following happens. The VideoFragment that records video is gone when I am done recording and the underlying CategoriesFragment is visible. The onActivityResult() of the VideoFragment is not called, instead the HomeActivity onActivityResult() is called, but with a different request code than what I used to create the intent. I also get this warning in the log:
W/FragmentActivity﹕ Activity result fragment index out of range: 0x300c8
Both of these issues are probably caused by the fragment that sent the intent being destroyed for reason, and so it can't receive the intent result? Any ideas why this would happen?
Here is the code for creating the intent.
//Record Video
private void recordVideo() {
Intent intent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
fileUri = getOutputMediaFileUri(MEDIA_TYPE_VIDEO);
// set video quality
intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 0);
intent.putExtra(MediaStore.EXTRA_DURATION_LIMIT, mVideoLength);
intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri); // set the image file
// name
// start the video capture Intent
startActivityForResult(intent, CAMERA_CAPTURE_VIDEO_REQUEST_CODE);
}
I've searched for a long time on this one and any help, ideas or theories would be greatly appreciated

Here is what was happening. The activity that created the fragment that started the intent was destroyed on low RAM devices. The activity was then re-creating the fragment in its onCreate when the intent finished. You want to let Android OS handle the fragment re-creation if it was responsible for the destruction of the fragment so you just need to add this to your onCreate method
if (savedInstanceState == null) {
Create fragments
}else{
Let the OS create them
}

Related

Android camera removing fragment in onActivityResult

I have one parent activity, In which replacing the fragment. Now when I am doing startActivityForResult and launch camera. When come back from camera calling fragment get remove and previous fragment comes up.
Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
File photo = Utils.getImagePath();
clickImagePath = photo.getPath();
intent.putExtra(MediaStore.EXTRA_OUTPUT,
Uri.fromFile(photo));
startActivityForResult(intent, REQUEST_CODE_CAMERA);
Above code is using to call Camera Intent, now come back from camera, this fragment removed already and parent activity popup last fragment from backstack.
Please suggest.
Don't forget to add
android:configChanges="orientation|keyboardHidden|screenSize"
into your Activity component in manifest.xml as some of the camera application makes the origin activity(the activity who fires CAMERA intent) to lose their states.

It is necessary to create an camera to put it inside an fragment (android)?

I just need to put a camera inside one of the three fragments of my main activity, like ([f]-[f]-[C]), where () is my main activity, [] is a fragment, C is the camera and f are just a fragment (they are full screen swipable). I need to create a whole camera (coding , etc) just for it or it is possible to call android native camera app with intent to an fagment?
I need to create a whole camera (coding , etc) just for it
Yes, whether you write it yourself or use one from a library.
or it is possible to call android native camera app with intent to an fagment?
No, you cannot embed a third-party app in a fragment of your app.
If you need to take a picture, you can just use an intent to launch the system camera app. Doing so will make it a lot easier to code, but you won't be able to show a live preview, as you're actually handling control to the camera app through that intent.
Manually handling the entire camera lifecycle allows you to have control over the preview and show it real-time in your app. Also, if you need to have the live preview in your app, this is the way to go and can't be accomplished using just an Intent.
You might find the UltimateAndroidCameraGuide on GitHub very helpful for your problem, particularly the SimpleCameraIntentFragment and the NativeCameraFragment files in that repo.
You can use an Intent to launch the camara and it will launch the camara default app., just be careful to detect when your "C" fragment is displayed, here: How to determine when Fragment becomes visible in ViewPager
If you dont do that, android pre-caches fragment before showing it and your intent will fire.
On your activity use:
#Override public void onResume() {
super.onResume();
if(viewPager.getCurrentItem() == 2){
//Your code here. Executed when fragment is seen by user.
// create Intent to take a picture and return control to the calling application
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
fileUri = getOutputMediaFileUri(MEDIA_TYPE_IMAGE); // create a file to save the image
intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri); // set the image file name
// start the image capture Intent
startActivityForResult(intent, CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE);
}
}
See for camera launch with intent options: http://developer.android.com/guide/topics/media/camera.html#intent-image

Fragment Activity killed after using Camera

I have android application ,the main activity is fragment activity then one of the fragment takes to another activity that leads to screen that has image views and button with intent to call android camera and set the pictures in those image views.
the problem is when I access the camera many times to take pictures and return back to the activity and set the images.
when i click on the back button to return back to the fragment activity it returns me to the phone home screen .
I hope this will simplify activity flows
fragment activity-->activity--->using camera
after using camera many times fragment activity is not there any more.
This is the code I am using
Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
File imagesFolder = new File(Environment.getExternalStorageDirectory(),"MyImages");
imagesFolder.mkdir();
File image = new File(imagesFolder,"incident"+incidentId+"("+1+").jpg");
Uri fileUri = Uri.fromFile(image);
cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT,fileUri);
startActivityForResult(cameraIntent,CAMERA_REQUEST);
Thanks in advance,

Activity gets killed after returned from the camera

In my app I call the system camera to take a picture, and then handle the result in onActivityResult. It used to work, but now my calling activity gets killed sometimes,
sometimes it works well.I need the big picture,so I must use intent.putExtra(MediaStore.EXTRA_OUTPUT, output),if without this(like use the intent data to get a bitmap) ,it works fine.
after take a pic, and onclick the 'OK' button, I need it return to the activity
which start the camera,but sometime it works fine,sometimes the parent activity is finished. after search,I set android:alwaysRetainTaskState="true",but this not work.
my system is Galaxy S I9000,I also test this on other phone,but it works well.
did anybody know why?
here is my code
private void startTakePhoto(){
App.fileNameWithPath = Environment.getExternalStorageDirectory().getAbsolutePath()+ File.separator + System.currentTimeMillis()+".jpg";
File file = new File(App.fileNameWithPath);
Uri output = Uri.fromFile(file);
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(MediaStore.EXTRA_OUTPUT, output);
boolean flag = BaseUtil.hasImageCaptureBug();
System.out.println(flag);
//intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(fileNameWithPath)));
//BaseUtil.saveImagePath(App.fileNameWithPath, this);
startActivityForResult(intent, REQUEST_TAKE_PHOTO);
}
It like this :
I want is
1. A start B (stack: A,B)
2. B start camera activity and wait For Result (stack:A,B,camera)
3. save picture,return B activity (stack: A,B)
but on step 3, it not return to B,but A.
It seems like B is finished by the system, why?
http://developer.android.com/reference/android/app/Activity.html
The reason is because memory menagement in Android. As i know your phone has about 100mb free operative memory, if your activity is not on foreground it can be destroyed. So that's why you should implement some methods of you activity to start it is onPause, onDestroy and on Resume methods. Just save all your info in Bundle and start Activity propelly.

Camera or Gallery intent destroys old activity on some devices

I am working on app which uses WebView to display its content. However, it needs to open camera or gallery in order to choose picture:
Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(cameraIntent, 1);
Intent galleryIntent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(galleryIntent, 2);
It's working fine on most devices, but on HTC One and few others both intents destroys my activity, so webview is being reloaded while going back. I don't have noHistory flag in AndroidManifest.xml. What might be causing that issue? Can I avoid destroying my activity here?
It is normally, that Android kills your Activity when other app runs.
You must save Activity state in onSaveInstanceState and when activity will be recreated restore state in onRestoreInstanceState or in onCreate.
To restore state of WebView you may use cookies and sessions and save last opened url. When activity will be recreated just navigate WebView last saved url and process result from camera.
Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(cameraIntent, 1);
By seeing your code I can judge that your motto is to capture the image and use it later on.
This is a known bug, The solution is that you need to create a separate folder for your application and before capturing you need to be sure that file is created and the same path you are giving to camera intent
Uri uriSavedImage=Uri.fromFile(new File("/sdcard/seperate/newImage.png"));
Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
cameraIntent.putExtra("output", uriSavedImage);
startActivityForResult(cameraIntent, 1);
Reference: image from camera intent issue in android
Maybe a stupid sugestion.
But since it's destroyed, it means the device was low on memory.
If the only annoyance is that the webview reloads, maybe you can solve this by caching the content?
For example in the onStop() method of you activity get the content of the webview and store it somewhere. temporary file, sqlite,... . and in onCreate check if there is a cache (and maybe how old it is) and if needed put that in the webview.
Tutorial to get html code from webview: http://lexandera.com/2009/01/extracting-html-from-a-webview/
If i m not wrong you are opening camera from device.Have you check that other app is not aquired the camera? you must acquire camera before starting camera activity may be some other app using camera instance.You must release the camera instance in on destroy or onstop method of activity so that next time it will available fr other app to use it or for your app to use.

Categories

Resources