From 844ae590788b6c622c790d623f29527c990a53a9 Mon Sep 17 00:00:00 2001 From: NaveenVenturi1203 Date: Tue, 18 Feb 2025 17:39:09 +0000 Subject: [PATCH] Coverity fixes for MultiCameraApplication Coverity Issues identified due to resource leakages and use of undeprecated apis Made use of correct apis to fix security issues and also resolved other coverity issues Tracked-On:OAM-129876 Signed-off-by: NaveenVenturi1203 --- .../AndroidManifest.xml | 1 + .../com/intel/multicamera/CameraBase.java | 59 +++++-- .../com/intel/multicamera/PhotoPreview.java | 2 +- .../com/intel/multicamera/QuickActivity.java | 3 +- .../java/com/intel/multicamera/Utils.java | 155 +++++------------- .../com/intel/multicamera/VideoRecord.java | 55 +++++-- 6 files changed, 124 insertions(+), 151 deletions(-) diff --git a/camera/MultiCameraApplication/AndroidManifest.xml b/camera/MultiCameraApplication/AndroidManifest.xml index 3ef62a1..5ee674a 100644 --- a/camera/MultiCameraApplication/AndroidManifest.xml +++ b/camera/MultiCameraApplication/AndroidManifest.xml @@ -8,6 +8,7 @@ + diff --git a/camera/MultiCameraApplication/java/com/intel/multicamera/CameraBase.java b/camera/MultiCameraApplication/java/com/intel/multicamera/CameraBase.java index 2f1e9be..2b289f5 100644 --- a/camera/MultiCameraApplication/java/com/intel/multicamera/CameraBase.java +++ b/camera/MultiCameraApplication/java/com/intel/multicamera/CameraBase.java @@ -21,6 +21,7 @@ import android.app.Dialog; import android.content.ContentValues; import android.content.Context; +import android.content.ContentResolver; import android.content.Intent; import android.content.SharedPreferences; import android.graphics.Bitmap; @@ -85,6 +86,10 @@ public class CameraBase { private SharedPreferences settings; private SurfaceTexture mSurfaceTexture; private String Capture_Key, Video_key, SettingsKey; + private Uri mImageUri; + private String mPictureFileName; + private ContentValues mCurrentPictureValues; + private ImageReader mCaptureImageReader; private CameraBase mCameraBase; private static final String SIZE_HD = "HD 720p"; @@ -137,6 +142,7 @@ public CameraBase(Activity activity, AutoFitTextureView mtextureView, ImageButto RecordingTimeView, SettingsKey); mCameraBase = this; + mCaptureImageReader = null; } private void ClickListeners(ImageButton PictureButton, ImageButton RecordButton, @@ -436,12 +442,13 @@ private Size getSelectedDimension(String Key) { } public void createCameraPreview() { + Surface surface = null; try { mRecord.closePreviewSession(); SurfaceTexture texture = textureView.getSurfaceTexture(); if (texture == null) return; - Surface surface = new Surface(texture); + surface = new Surface(texture); String Key = GetChnagedPrefKey(); if (Key == null) @@ -496,6 +503,8 @@ public void onConfigureFailed(CameraCaptureSession cameraCaptureSession) { }, null); } catch (CameraAccessException e) { e.printStackTrace(); + } finally { + surface.release(); } } @@ -607,7 +616,6 @@ public void takePicture() { Log.e(TAG, "cameraDevice is null"); return; } - try { final Size imageDimension = getSelectedDimension(Capture_Key); if (imageDimension == null) { @@ -618,15 +626,15 @@ public void takePicture() { Log.i(TAG, "Still Capture imageDimension " + imageDimension.getWidth() + " x " + imageDimension.getHeight()); - ImageReader reader = ImageReader.newInstance( + mCaptureImageReader = ImageReader.newInstance( imageDimension.getWidth(), imageDimension.getHeight(), ImageFormat.JPEG, 1); List outputSurfaces = new ArrayList<>(2); - outputSurfaces.add(reader.getSurface()); + outputSurfaces.add(mCaptureImageReader.getSurface()); captureRequestBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE); - captureRequestBuilder.addTarget(reader.getSurface()); + captureRequestBuilder.addTarget(mCaptureImageReader.getSurface()); captureRequestBuilder.set(CaptureRequest.CONTROL_MODE, CameraMetadata.CONTROL_MODE_AUTO); // Orientation @@ -639,9 +647,17 @@ public void takePicture() { Log.e(TAG, "takePicture Invalid file details"); return; } - String mPictureFilename = ImageFileDetails[3]; - final File ImageFile = new File(mPictureFilename); + Context mContext = mActivity.getApplicationContext(); + ContentResolver resolver = mContext.getContentResolver(); + Uri collection = MediaStore.Images.Media.getContentUri(MediaStore.VOLUME_EXTERNAL_PRIMARY); + mCurrentPictureValues = Utils.getContentValues(Utils.MEDIA_TYPE_IMAGE, ImageFileDetails,imageDimension.getWidth(), + imageDimension.getHeight(),0,0); + + mImageUri = resolver.insert(collection,mCurrentPictureValues); + mPictureFileName = Utils.getRealPathFromURI(mContext,mImageUri); + + final File ImageFile = new File(mPictureFileName); ImageReader.OnImageAvailableListener readerListener = new ImageReader.OnImageAvailableListener() { @@ -669,8 +685,10 @@ public void onImageAvailable(ImageReader reader) { private void save(byte[] bytes) throws IOException { OutputStream output = null; try { - output = new FileOutputStream(ImageFile); + output = resolver.openOutputStream(mImageUri); output.write(bytes); + } catch (IOException e) { + e.printStackTrace(); } finally { if (null != output) { output.close(); @@ -678,7 +696,7 @@ private void save(byte[] bytes) throws IOException { } } }; - reader.setOnImageAvailableListener(readerListener, null); + mCaptureImageReader.setOnImageAvailableListener(readerListener, null); final CameraCaptureSession.CaptureCallback captureListener = new CameraCaptureSession.CaptureCallback() { @Override @@ -716,21 +734,26 @@ public void onConfigureFailed(CameraCaptureSession session) { } private void saveImage(Size imageDimension, File ImageFile) { - ContentValues mCurrentPictureValues; - Uri uri; + Context mContext = mActivity.getApplicationContext(); + ContentResolver resolver = mContext.getContentResolver(); + File imageFile = new File(mPictureFileName); + if(!imageFile.exists() || imageFile.length() == 0) + { + Log.e(TAG,"Image File Does not exist "+mPictureFileName); + return; + } + mCurrentPictureValues.put(MediaStore.Video.Media.SIZE,imageFile.length()); - mCurrentPictureValues = Utils.getContentValues( - Utils.MEDIA_TYPE_IMAGE, ImageFileDetails, imageDimension.getWidth(), - imageDimension.getHeight(), 0, ImageFile.length()); + resolver.update(mImageUri,mCurrentPictureValues,null,null); - uri = Utils.broadcastNewPicture(mActivity.getApplicationContext(), mCurrentPictureValues); + Utils.broadcastNewPicture(mContext, mImageUri); - ic_camera.setCurrentUri(uri); - ic_camera.setImagePath(ImageFile.getAbsolutePath()); + ic_camera.setCurrentUri(mImageUri); + ic_camera.setImagePath(mPictureFileName); ic_camera.setCurrentFileInfo(mCurrentPictureValues); - Log.i(TAG, "Image saved @ " + ImageFile.getAbsolutePath()); + Log.i(TAG, "Image saved @ " + mPictureFileName); } private void showDetailsDialog(ContentValues info) { diff --git a/camera/MultiCameraApplication/java/com/intel/multicamera/PhotoPreview.java b/camera/MultiCameraApplication/java/com/intel/multicamera/PhotoPreview.java index 59c508c..35720d3 100644 --- a/camera/MultiCameraApplication/java/com/intel/multicamera/PhotoPreview.java +++ b/camera/MultiCameraApplication/java/com/intel/multicamera/PhotoPreview.java @@ -216,7 +216,7 @@ private int getOrientation(int rotation) { public void showVideoThumbnail() { - final Uri videoUri = Uri.fromFile(new File(ic_camera.getImagePath())); + final Uri videoUri = ic_camera.getCurrentUri(); mRoundedThumbnailView.startRevealThumbnailAnimation("Video taken"); final Optional bitmap = diff --git a/camera/MultiCameraApplication/java/com/intel/multicamera/QuickActivity.java b/camera/MultiCameraApplication/java/com/intel/multicamera/QuickActivity.java index f76647b..3600821 100644 --- a/camera/MultiCameraApplication/java/com/intel/multicamera/QuickActivity.java +++ b/camera/MultiCameraApplication/java/com/intel/multicamera/QuickActivity.java @@ -138,8 +138,7 @@ protected final void onResume() { mMainHandler.removeCallbacks(mOnResumeTasks); if (mSkippedFirstOnResume == false) { - long delay = mSkippedFirstOnResume ? ON_RESUME_DELAY_SECURE_MILLIS - : ON_RESUME_DELAY_NON_SECURE_MILLIS; + long delay = ON_RESUME_DELAY_NON_SECURE_MILLIS; // Skipping onResumeTasks; set to true. mSkippedFirstOnResume = true; Log.v(TAG, "onResume() --> postDelayed(mOnResumeTasks," + delay + ")"); diff --git a/camera/MultiCameraApplication/java/com/intel/multicamera/Utils.java b/camera/MultiCameraApplication/java/com/intel/multicamera/Utils.java index eed662a..7fbc4ba 100644 --- a/camera/MultiCameraApplication/java/com/intel/multicamera/Utils.java +++ b/camera/MultiCameraApplication/java/com/intel/multicamera/Utils.java @@ -36,6 +36,7 @@ import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; +import java.io.IOException; import java.io.InputStream; import java.text.DateFormat; import java.text.SimpleDateFormat; @@ -47,9 +48,8 @@ public class Utils { private static final String TAG = "Utils"; - public static final String DCIM = - Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM).toString(); - public static final String DIRECTORY = DCIM + "/MultiCamera"; + public static final String DCIM = "DCIM"; + public static final String DIRECTORY = "MultiCamera"; public static final int MEDIA_TYPE_IMAGE = 0; public static final int MEDIA_TYPE_VIDEO = 1; @@ -81,68 +81,12 @@ public class Utils { private static final int DOWN_SAMPLE_FACTOR = 4; - @SuppressLint("SimpleDateFormat") - public static File createOutputmediaStorageDir() { - // To be safe, you should check that the SDCard is mounted - // using Environment.getExternalStorageState() before doing this. - - String state = Environment.getExternalStorageState(); - if (!Environment.MEDIA_MOUNTED.equals(state)) { - Log.e(TAG, "getExternalStorageState failed"); - return null; - } - - File mediaStorageDir = new File(DIRECTORY); - // 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.e(TAG, "Failed to create directory for " + DIRECTORY); - return null; - } - } - - return mediaStorageDir; - } - - public static Uri broadcastNewPicture(Context context, ContentValues values) { - Uri uri = null; - ContentResolver resolver = context.getContentResolver(); - try { - uri = resolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, - new ContentValues(values)); - } catch (Throwable th) { - // This can happen when the external volume is already mounted, but - // MediaScanner has not notify MediaProvider to add that volume. - // The picture is still safe and MediaScanner will find it and - // insert it into MediaProvider. The only problem is that the user - // cannot click the thumbnail to review the picture. - Log.e(TAG, "Failed to write MediaStore" + th); - } finally { - Log.v(TAG, "Current Picture URI: " + uri); - } + public static void broadcastNewPicture(Context context, Uri uri) { context.sendBroadcast(new Intent(ACTION_NEW_PICTURE, uri)); - return uri; } - public static Uri broadcastNewVideo(Context context, ContentValues values) { - Uri uri = null; - ContentResolver resolver = context.getContentResolver(); - try { - Uri videoTable = Uri.parse(VIDEO_BASE_URI); - uri = resolver.insert(videoTable, new ContentValues(values)); - } catch (Exception e) { - // We failed to insert into the database. This can happen if - // the SD card is unmounted. - Log.e(TAG, "failed to add video to media store", e); - uri = null; - } finally { - Log.v(TAG, "Current video URI: " + uri); - } + public static void broadcastNewVideo(Context context, Uri uri) { context.sendBroadcast(new Intent(ACTION_NEW_VIDEO, uri)); - return uri; } public static String getFileNameFromUri(Uri uri) { @@ -156,11 +100,6 @@ public static String getFileNameFromUri(Uri uri) { } public static String[] generateFileDetails(int type) { - File mediaStorageDir = createOutputmediaStorageDir(); - if (mediaStorageDir == null) { - Log.e(TAG, "createOutputmediaStorageDir failed"); - return null; - } long dateTaken = System.currentTimeMillis(); Date date = new Date(dateTaken); @@ -180,8 +119,7 @@ public static String[] generateFileDetails(int type) { Log.e(TAG, "Invalid Media Type: " + type); return null; } - - fileDetails[3] = mediaStorageDir.getPath() + '/' + fileDetails[1]; + fileDetails[3] = DCIM + '/' + DIRECTORY + '/' + fileDetails[1]; fileDetails[4] = Long.toString(dateTaken); Log.v(TAG, "Generated filename: " + fileDetails[3]); return fileDetails; @@ -189,43 +127,34 @@ public static String[] generateFileDetails(int type) { public static ContentValues getContentValues(int type, String[] fileDetails, int width, int height, long duration, long size) { - if (fileDetails.length < 5) { - Log.e(TAG, "Invalid file details"); - return null; - } - - File file = new File(fileDetails[3]); - long dateModifiedSeconds = TimeUnit.MILLISECONDS.toSeconds(file.lastModified()); - ContentValues contentValue = null; + ContentValues contentValue = new ContentValues(); if (MEDIA_TYPE_IMAGE == type) { - contentValue = new ContentValues(9); - contentValue.put(MediaStore.Images.ImageColumns.TITLE, fileDetails[0]); - contentValue.put(MediaStore.Images.ImageColumns.DISPLAY_NAME, fileDetails[1]); - contentValue.put(MediaStore.Images.ImageColumns.DATE_TAKEN, - Long.valueOf(fileDetails[4])); - contentValue.put(MediaStore.Images.ImageColumns.MIME_TYPE, fileDetails[2]); - contentValue.put(MediaStore.Images.ImageColumns.DATE_MODIFIED, dateModifiedSeconds); - contentValue.put(MediaStore.Images.ImageColumns.DATA, fileDetails[3]); - contentValue.put(MediaStore.MediaColumns.WIDTH, width); - contentValue.put(MediaStore.MediaColumns.HEIGHT, height); - contentValue.put(MediaStore.Images.ImageColumns.SIZE, size); + contentValue.put(MediaStore.Images.Media.TITLE, fileDetails[0]); + contentValue.put(MediaStore.Images.Media.DISPLAY_NAME, fileDetails[1]); + contentValue.put(MediaStore.Images.Media.DATE_TAKEN, + Long.parseLong(fileDetails[4])); + contentValue.put(MediaStore.Images.Media.MIME_TYPE, fileDetails[2]); + contentValue.put(MediaStore.Images.Media.DATE_MODIFIED, System.currentTimeMillis() / 1000); + contentValue.put(MediaStore.Images.Media.WIDTH, width); + contentValue.put(MediaStore.Images.Media.HEIGHT, height); + contentValue.put(MediaStore.Images.Media.SIZE, size); + contentValue.put(MediaStore.Images.Media.RELATIVE_PATH,Environment.DIRECTORY_DCIM+"/"+DIRECTORY); } else if (MEDIA_TYPE_VIDEO == type) { - contentValue = new ContentValues(9); contentValue.put(MediaStore.Video.Media.TITLE, fileDetails[0]); contentValue.put(MediaStore.Video.Media.DISPLAY_NAME, fileDetails[1]); - contentValue.put(MediaStore.Video.Media.DATE_TAKEN, Long.valueOf(fileDetails[4])); - contentValue.put(MediaStore.MediaColumns.DATE_MODIFIED, - Long.valueOf(fileDetails[4]) / 1000); + contentValue.put(MediaStore.Video.Media.DATE_TAKEN, Long.parseLong(fileDetails[4])); + contentValue.put(MediaStore.Video.Media.DATE_MODIFIED, + System.currentTimeMillis() / 1000); contentValue.put(MediaStore.Video.Media.MIME_TYPE, fileDetails[2]); - contentValue.put(MediaStore.Video.Media.DATA, fileDetails[3]); contentValue.put(MediaStore.Video.Media.WIDTH, width); contentValue.put(MediaStore.Video.Media.HEIGHT, height); contentValue.put(MediaStore.Video.Media.RESOLUTION, Integer.toString(width) + "x" + Integer.toString(height)); contentValue.put(MediaStore.Video.Media.DURATION, duration); contentValue.put(MediaStore.Video.Media.SIZE, size); + contentValue.put(MediaStore.Video.Media.RELATIVE_PATH, Environment.DIRECTORY_DCIM+"/"+DIRECTORY); } return contentValue; } @@ -395,10 +324,9 @@ public static Optional generateThumbnail(File path, int boundingWidthPx, try { stream.close(); - } catch (Exception e) { + } catch (IOException e) { Log.e(TAG, "Fail to close stream"); } - return Optional.ofNullable(bitmap); //} } @@ -485,7 +413,7 @@ public static Bitmap rotateAndMirror(Bitmap b, int degrees, boolean mirror) { public static Optional getVideoThumbnail(ContentResolver mContentResolver, Uri uri) { Bitmap bitmap = null; - ParcelFileDescriptor mVideoFileDescriptor; + ParcelFileDescriptor mVideoFileDescriptor = null; try { mVideoFileDescriptor = mContentResolver.openFileDescriptor(uri, "r"); @@ -494,6 +422,14 @@ public static Optional getVideoThumbnail(ContentResolver mContentResolve } catch (java.io.FileNotFoundException ex) { // invalid uri Log.e(TAG, ex.toString()); + } finally { + if(mVideoFileDescriptor != null) { + try { + mVideoFileDescriptor.close(); + } catch (IOException e) { + Log.e(TAG,"Video File Close Failed"); + } + } } if (bitmap != null) { @@ -513,6 +449,7 @@ public static void playVideo(Activity activity, Uri uri, String title) { Intent intent = getVideoPlayerIntent(uri) .putExtra(Intent.EXTRA_TITLE, title) .putExtra(KEY_TREAT_UP_AS_BACK, true); + intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); activity.startActivity(intent); } catch (ActivityNotFoundException e) { @@ -614,28 +551,14 @@ public static Optional getMediaDetails(Context mContext, ContentVa } public static long getAvailableSpace() { - String state = Environment.getExternalStorageState(); - Log.d(TAG, "External storage state=" + state); - if (Environment.MEDIA_CHECKING.equals(state)) { - return PREPARING; - } - if (!Environment.MEDIA_MOUNTED.equals(state)) { - return UNAVAILABLE; + File directory = new File(Environment.getExternalStorageDirectory(),"DCIM/MultiCamera"); + if(!directory.exists()) { + directory.mkdirs(); } + StatFs statFs = new StatFs(directory.getAbsolutePath()); + long availableBlocks = statFs.getAvailableBlocksLong(); + long blocksize = statFs.getBlockSizeLong(); - File dir = createOutputmediaStorageDir(); - if (dir == null) - return UNAVAILABLE; - if (!dir.isDirectory() || !dir.canWrite()) { - return UNAVAILABLE; - } - - try { - StatFs stat = new StatFs(DIRECTORY); - return stat.getAvailableBlocksLong() * stat.getBlockSizeLong(); - } catch (Exception e) { - Log.i(TAG, "Fail to access external storage", e); - } - return UNKNOWN_SIZE; + return availableBlocks * blocksize; } } diff --git a/camera/MultiCameraApplication/java/com/intel/multicamera/VideoRecord.java b/camera/MultiCameraApplication/java/com/intel/multicamera/VideoRecord.java index 6c366a4..1ee19a9 100644 --- a/camera/MultiCameraApplication/java/com/intel/multicamera/VideoRecord.java +++ b/camera/MultiCameraApplication/java/com/intel/multicamera/VideoRecord.java @@ -20,6 +20,7 @@ import android.app.Activity; import android.content.ContentValues; import android.content.Context; +import android.content.ContentResolver; import android.content.SharedPreferences; import android.graphics.Matrix; import android.graphics.RectF; @@ -85,6 +86,7 @@ public class VideoRecord implements MediaRecorder.OnErrorListener, MediaRecorder private long mRecordingStartTime; private TextView mRecordingTimeView; private String mVideoKey, mSettingsKey; + private Uri mVideoUri; private CameraBase mCameraBase; private MultiCamera ic_camera; @@ -146,6 +148,7 @@ public void onInfo(MediaRecorder mr, int what, int extra) { if (what == MediaRecorder.MEDIA_RECORDER_INFO_MAX_FILESIZE_APPROACHING) { Toast.makeText(mActivity, R.string.video_reach_size_limit, Toast.LENGTH_SHORT).show(); + Context mContext = mActivity.getApplicationContext(); if (mIsRecordingVideo) { saveVideo(); String[] VideofileDetails; @@ -154,17 +157,21 @@ public void onInfo(MediaRecorder mr, int what, int extra) { Log.e(TAG, "setUpMediaRecorder Invalid file details"); return; } + ContentResolver resolver = mContext.getContentResolver(); - mVideoFilename = VideofileDetails[3]; + Uri collection = MediaStore.Video.Media.getContentUri(MediaStore.VOLUME_EXTERNAL_PRIMARY); CamcorderProfile mProfile = getSelectedCamorderProfile(); + mCurrentVideoValues = + Utils.getContentValues(Utils.MEDIA_TYPE_VIDEO, VideofileDetails, + mProfile.videoFrameWidth, mProfile.videoFrameHeight, 0, 0); + + mVideoUri = resolver.insert(collection,mCurrentVideoValues); - mCurrentVideoValues = Utils.getContentValues( - Utils.MEDIA_TYPE_VIDEO, VideofileDetails, mProfile.videoFrameWidth, - mProfile.videoFrameHeight, 0, 0); + mVideoFilename = Utils.getRealPathFromURI(mContext,mVideoUri); try { - mMediaRecorder.setNextOutputFile(new File(VideofileDetails[3])); + mMediaRecorder.setNextOutputFile(mContext.getContentResolver().openFileDescriptor(mVideoUri,"rw").getFileDescriptor()); } catch (IOException e) { e.printStackTrace(); } @@ -209,6 +216,7 @@ private Size getSelectedDimension(String Key) { } public void createCameraPreview() { + Surface surface = null; try { closePreviewSession(); @@ -216,8 +224,6 @@ public void createCameraPreview() { SurfaceTexture texture = mTextureView.getSurfaceTexture(); if (texture == null) return; - Surface surface = new Surface(texture); - String key = GetChnagedPrefKey(); if (key == null) return; @@ -241,6 +247,8 @@ public void createCameraPreview() { captureRequestBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW); + surface = new Surface(texture); + captureRequestBuilder.addTarget(surface); mCameraDevice.createCaptureSession( @@ -266,6 +274,10 @@ public void onConfigureFailed(CameraCaptureSession cameraCaptureSession) { }, null); } catch (CameraAccessException e) { e.printStackTrace(); + } finally { + if(surface != null) { + surface.release(); + } } } @@ -428,8 +440,8 @@ private void setUpMediaRecorder(CamcorderProfile mProfile) throws IOException { mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER); mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE); + Context mContext = mActivity.getApplicationContext(); { - Context mContext = mActivity.getApplicationContext(); AudioManager mAudioManager = (AudioManager)mContext.getSystemService(Context.AUDIO_SERVICE); AudioDeviceInfo[] deviceList = @@ -453,17 +465,23 @@ private void setUpMediaRecorder(CamcorderProfile mProfile) throws IOException { return; } + ContentResolver resolver = mContext.getContentResolver(); + + Uri collection = MediaStore.Video.Media.getContentUri(MediaStore.VOLUME_EXTERNAL_PRIMARY); + mCurrentVideoValues = Utils.getContentValues(Utils.MEDIA_TYPE_VIDEO, VideofileDetails, mProfile.videoFrameWidth, mProfile.videoFrameHeight, 0, 0); - mVideoFilename = VideofileDetails[3]; + mVideoUri = resolver.insert(collection,mCurrentVideoValues); + mVideoFilename = Utils.getRealPathFromURI(mContext,mVideoUri); mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); /** * set output file in media recorder */ - mMediaRecorder.setOutputFile(mVideoFilename); + + mMediaRecorder.setOutputFile(mContext.getContentResolver().openFileDescriptor(mVideoUri,"rw").getFileDescriptor()); mMediaRecorder.setVideoEncodingBitRate(10000000); @@ -718,14 +736,23 @@ private String getString(String key, String defaultValue) { private void saveVideo() { long duration = SystemClock.uptimeMillis() - mRecordingStartTime; Log.w(TAG, "Video duration <= 0 : " + duration); - Uri uri; + Context mContext = mActivity.getApplicationContext(); + ContentResolver resolver = mContext.getContentResolver(); + File videoFile = new File(mVideoFilename); + if(!videoFile.exists() || videoFile.length() == 0) + { + Log.e(TAG,"Video File Does not exist "+mVideoFilename); + return; + } mCurrentVideoValues.put(MediaStore.Video.Media.DURATION, duration); - mCurrentVideoValues.put(MediaStore.Video.Media.SIZE, new File(mVideoFilename).length()); + mCurrentVideoValues.put(MediaStore.Video.Media.SIZE,videoFile.length()); + + resolver.update(mVideoUri,mCurrentVideoValues,null,null); - uri = Utils.broadcastNewVideo(mActivity.getApplicationContext(), mCurrentVideoValues); + Utils.broadcastNewVideo(mContext, mVideoUri); - ic_camera.setCurrentUri(uri); + ic_camera.setCurrentUri(mVideoUri); ic_camera.setImagePath(mVideoFilename); ic_camera.setCurrentFileInfo(mCurrentVideoValues);