So I had to go “full circle” with above mentioned Storage Access Framework.
Step 1: Request for file creation
Note: fileName below is literally name of a file itself, without full (desired) path to it. E.g. myvideo.mp4.
private void createFile(String fileName) {
String mimeType = "video/mp4";
Intent intent = new Intent(Intent.ACTION_CREATE_DOCUMENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType(mimeType);
intent.putExtra(Intent.EXTRA_TITLE, fileName);
startActivityForResult(intent, WRITE_REQUEST_CODE /* is some random int constant*/);
}
Step 2: Callback for handling directory choice
After calling createFile (cf. step 1) a user will be supplied with a system dialog for choosing a directory where file will be stored. After they makes their choice the handler will be fired with desired URI for the new file. We can turn it into FileDescriptor and use corresponding version of MediaRecorder.setOutputFile.
@Override
public void onActivityResult(int requestCode, int resultCode,
Intent resultData) {
if (requestCode == WRITE_REQUEST_CODE && resultCode == Activity.RESULT_OK) {
if (resultData != null) {
URI outputFileUri = resultData.getData();
FileDesriptor outputFileDescriptor = getContentResolver().openFileDescriptor(outputFileUri, "w").getFileDescriptor()
mMediaRecorder.setOutputFile(outputFileDescriptor);
mMediaRecorder.start();
}
}
}
This method should be implemented inside some Activity-class.
Room for improvement
So a user has to click Save in system menu each time they starts new video. It would be nice to restore pre-KitKat state when my application could decide the directory on its own. Considering my experience if using “professional” applications this indeed is possible. E.g. “ES Explorer” asks user to explicitly give permission for operations on SD card only once (using the alike system dialog).