android video app creating file storage
The android video app creating file storage tutorial describes the how to create the video folder and it’s files.
Support for android marshmallow write external storage runtime permissions is also added.
Get Code
The code to start this tutorial is on github here
https://github.com/mobapptuts/android_camera2_api_video_app.git Tag camera2-video-storage
or you can run this command
git clone https://github.com/mobapptuts/android_camera2_api_video_app.git –branch camera2-video-storage
Steps
Add write external storage to the android manifest file
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
Create members for the video folder & file names
private File mVideoFolder; private String mVideoFilename;
Create the storage directory for the video files
private void createVideoFolder() { File movieFile = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MOVIES); mVideoFolder = new File(movieFile, "camera2VideoImage"); if(!mVideoFolder.exists()) { mVideoFolder.mkdirs(); } }
Call the createVideoFolder in the onCreateMethod
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_camera2_video_image); createVideoFolder(); mTextureView = (TextureView) findViewById(R.id.textureView); mRecordImageButton = (ImageButton) findViewById(R.id.videoOnlineImageButton); mRecordImageButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (mIsRecordingVideo) { mIsRecordingVideo = false; mRecordImageButton.setImageResource(R.mipmap.btn_video_online); } else { mIsRecordingVideo = true; mRecordImageButton.setImageResource(R.mipmap.btn_video_busy); } } }); }
Create unique file name to save the video to
private File createVideoFileName() throws IOException { String timestamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); String prepend = "VIDEO_" + timestamp + "_"; File videoFile = File.createTempFile(prepend, ".mp4", mVideoFolder); mVideoFileName = videoFile.getAbsolutePath(); return videoFile; }
Add an activity member for the write storage permission request code
private static final int REQUEST_WRITE_EXTERNAL_STORAGE_PERMISSION_RESULT = 1;
Add a method to support runtime permissions for creating the video file
Note we have relocated the recording flag & set image resource code from the onCreate method.
private void checkWriteStoragePermission() { if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { if(ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) { mIsRecording = true; mRecordImageButton.setImageResource(R.mipmap.btn_video_busy); try { createVideoFileName(); } catch (IOException e) { e.printStackTrace(); } } else { if(shouldShowRequestPermissionRationale(Manifest.permission.WRITE_EXTERNAL_STORAGE)) { Toast.makeText(this, "app needs to be able to save videos", Toast.LENGTH_SHORT).show(); } requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_WRITE_EXTERNAL_STORAGE_PERMISSION_RESULT); } } else { mIsRecording = true; mRecordImageButton.setImageResource(R.mipmap.btn_video_busy); try { createVideoFileName(); } catch (IOException e) { e.printStackTrace(); } } }
In the request permissions result callback add support for write storage
Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if(requestCode == REQUEST_CAMERA_PERMISSION_RESULT) { if(grantResults[0] != PackageManager.PERMISSION_GRANTED) { Toast.makeText(getApplicationContext(), "Application will not run without camera services", Toast.LENGTH_SHORT).show(); } } if(requestCode == REQUEST_WRITE_EXTERNAL_STORAGE_PERMISSION_RESULT) { if(grantResults[0] == PackageManager.PERMISSION_GRANTED) { mIsRecording = true; mRecordImageButton.setImageResource(R.mipmap.btn_video_busy); try { createVideoFileName(); } catch (IOException e) { e.printStackTrace(); } Toast.makeText(this, "Permission successfully granted!", Toast.LENGTH_SHORT).show(); } else { Toast.makeText(this, "App needs to save video to run", Toast.LENGTH_SHORT).show(); } }
Call the checkWriteExternalStoragePermissions method in the image button onClickListener
mRecordImageButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if(mIsRecording) { mIsRecording = false; mRecordImageButton.setImageResource(R.mipmap.btn_video_online); } else { checkWriteStoragePermission(); } } });
Android video app creating file storage summary
In the android video app creating file storage tutorial we learned how to create folders and unique file names for the videos.
Because this app will developed on android marshmallow, runtime permissions were added for writeable external storage.