I use the MediaStore.ACTION_VIDEO_CAPTURE
intent class to capture the video, the video stored in default location(gallery),i want to store the video in specific location with specific name.
I use MediaStore.EXTRA_MEDIA_TITLE
and MediaStore.EXTRA_MEDIA_OUTPUT
but I don`t get the video at correct location, at least I need the path of recorded video.
?方案一:
Trick is to insert media into database before recording:
String fileName = "captureTemp.mp4"; ??ContentValues values = new ContentValues(); ??values.put(MediaStore.Video.Media.TITLE, fileName); ??cameraVideoURI = getContentResolver().insert(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, values); ???Intent intent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE); ??intent.putExtra(MediaStore.EXTRA_OUTPUT, cameraVideoURI); ??intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 0);?intent.putExtra(MediaStore.EXTRA_SIZE_LIMIT, MAXIMUM_VIDEO_SIZE); ? ? ? ? ? ? ? ?startActivityForResult(intent, CAPTURE_VIDEO_INTENT);?
and then onActivityResult() use saved cameraVideoUri to reference recorded video:
? ? ? ?String[] projection = { MediaStore.Video.Media.DATA, MediaStore.Video.Media.SIZE ?}; ?? ? ? ?Cursor cursor = managedQuery(cameraVideoURI, projection, null, null, null); ?? ? ? ?int column_index_data = cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DATA); ?? ? ? ?int column_index_size = cursor.getColumnIndexOrThrow(MediaStore.Video.Media.SIZE); ?? ? ? ?cursor.moveToFirst(); ?? ? ? ?String recordedVideoFilePath = cursor.getString(column_index_data);?? ? ? ?int recordedVideoFileSize = cursor.getInt(column_index_size);?
方案二:
The solution from Zelimir doesn't work in my case (the videos were at the right location but had a size of zero bytes). So i've found another solution:
protected void onActivityResult(int requestCode, int resultCode, Intent intent) {?? super.onActivityResult(requestCode, resultCode, intent);??? if (resultCode != RESULT_OK) return;??? try {?? ? AssetFileDescriptor videoAsset = getContentResolver().openAssetFileDescriptor(intent.getData(), "r");?? ? FileInputStream fis = videoAsset.createInputStream();?? ? File tmpFile = new File(Environment.getExternalStorageDirectory(),"VideoFile.3gp"); ?? ? FileOutputStream fos = new FileOutputStream(tmpFile);??? ? byte[] buf = new byte[1024];?? ? int len;?? ? while ((len = fis.read(buf)) > 0) {?? ? ? ? fos.write(buf, 0, len);?? ? } ? ? ? ?? ? fis.close();?? ? fos.close();?? } catch (IOException io_e) {?? ? // TODO: handle error?? }?
}
The MediaStore.EXTRA_OUTPUT
and the Uri aren't necessary in this case.