android android.provider.MediaStore.ACTION_VIDEO_CAPTURE return null onActivityResult with nexus 7

I am using intent for record video.

so i use following code on recordVideo button's click

Videofilepath = "";
Intent intent = new Intent(android.provider.MediaStore.ACTION_VIDEO_CAPTURE);
startActivityForResult(intent,REQUEST_VIDEO_CAPTURED);

and in onActivityResult

protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (resultCode == Activity.RESULT_OK) { switch (requestCode) { case IMAGE_PICK: this.imageFromGallery(resultCode, data); break; case IMAGE_CAPTURE: this.imageFromCamera(resultCode, data); break; case REQUEST_VIDEO_CAPTURED: this.videoFromCamera(resultCode, data); break; default: break; } } }
private void videoFromCamera(int resultCode, Intent data) { uriVideo = data.getData(); uploadedFileName=""; Constant.IS_FILE_ATTACH = true; Toast.makeText(PDFActivity.this, uriVideo.getPath(), Toast.LENGTH_LONG) .show(); String[] filePathColumn = { MediaStore.Video.Media.DATA }; Cursor cursor = getContentResolver().query(uriVideo, filePathColumn, null, null, null); cursor.moveToFirst(); int columnIndex = cursor.getColumnIndex(filePathColumn[0]); String filePath = cursor.getString(columnIndex); Videofilepath = filePath; System.out.println("Videofilepath filepath from camera : " + Videofilepath); cursor.close(); File f = new File(filePath); System.out.println("file created ? : " + f.exists()); Bitmap bMap = null; do { try { // Simulate network access. Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } } while (!f.exists()); bMap = ThumbnailUtils.createVideoThumbnail(filePath, MediaStore.Video.Thumbnails.MICRO_KIND); do { try { // Simulate network access. Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } while (bMap == null); imageOrVideo = "video"; attachmentvalue.setImageBitmap(bMap); }

This code is working fine with samsung galaxy Tab. But not working with Nexus 7. May be Nexus 7 have front camera. but i got resultant data intent is null onActivityResult.

so in my Logcat i got the following exception :-

08-08 12:51:31.160: E/AndroidRuntime(10899): FATAL EXCEPTION: main
08-08 12:51:31.160: E/AndroidRuntime(10899): java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=200, result=-1, data=Intent { }} to activity { java.lang.NullPointerException
1

3 Answers

Finally I resolved this issue. Nexus 7 Stores the videos in DCIM directory but onActivityResults it returns null. Its an documented issue with Nexus 7 device.

so fix this issue with intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri);
the code is as :-

code on record button click:-

 intent = new Intent(android.provider.MediaStore.ACTION_VIDEO_CAPTURE); fileUri = getOutputMediaFile(MEDIA_TYPE_VIDEO); // create a file to save the video in specific folder (this works for video only) intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri); intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1); // set the video image quality to high // start the Video Capture Intent startActivityForResult(intent, REQUEST_VIDEO_CAPTURED_NEXUS);

code inside switch - case block of onActivityResult :-

protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (resultCode == Activity.RESULT_OK) { switch (requestCode) { case REQUEST_VIDEO_CAPTURED_NEXUS: this.videoFromCameraNexus(resultCode, data); break;
default: break; } } }

// videoFromCameraNexus method

private void videoFromCameraNexus(int resultCode, Intent data) { if(fileUri != null) { Log.d(TAG, "Video saved to:\n" + fileUri); Log.d(TAG, "Video path:\n" + fileUri.getPath()); Log.d(TAG, "Video name:\n" + getName(fileUri)); // use uri.getLastPathSegment() if store in folder //use the file Uri. } }

Get the output Media file uri with the following Method

public Uri getOutputMediaFile(int type) { // To be safe, you should check that the SDCard is mounted if(Environment.getExternalStorageState() != null) { // this works for Android 2.2 and above File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MOVIES), "SMW_VIDEO"); // 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(TAG, "failed to create directory"); return null; } } // Create a media file name String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); File mediaFile; if(type == MEDIA_TYPE_VIDEO) { mediaFile = new File(mediaStorageDir.getPath() + File.separator + "VID_"+ timeStamp + ".mp4"); } else { return null; } return Uri.fromFile(mediaFile); } return null; }

Its works for me.

4

Thanks for the workaround!

Here is more brushed and copy-paste usable code:

/** * Create intent to take video. */
public static Intent createTakeVideoIntent() { Intent intent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE); Uri uri = getOutputVideoUri(); // create a file to save the video in specific folder if (uri != null) { intent.putExtra(MediaStore.EXTRA_OUTPUT, uri); } intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1); // set the video image quality to high return intent;
}
@CheckForNull
private static Uri getOutputVideoUri() { if (Environment.getExternalStorageState() == null) { return null; } File mediaStorage = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM), "YOUR_APP_VIDEO"); if (!mediaStorage.exists() && !mediaStorage.mkdirs()) { Log.e(YourApplication.TAG, "failed to create directory: " + mediaStorage); return null; } // Create a media file name String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.US).format(new Date()); File mediaFile = new File(mediaStorage, "VID_" + timeStamp + ".mp4"); return Uri.fromFile(mediaFile);
}

Tested on Nexus 4 v4.3 JWR66Y

Made a fork and fixed the problem by storing to a permanent directory which will still be available after the result has been received.

Your Answer

Sign up or log in

Sign up using Google Sign up using Facebook Sign up using Email and Password

Post as a guest

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

You Might Also Like