diff --git a/app/src/main/java/com/example/ueberwachungssystem/MainActivity.java b/app/src/main/java/com/example/ueberwachungssystem/MainActivity.java index e538369..8719e42 100644 --- a/app/src/main/java/com/example/ueberwachungssystem/MainActivity.java +++ b/app/src/main/java/com/example/ueberwachungssystem/MainActivity.java @@ -10,7 +10,6 @@ import androidx.camera.core.ExperimentalGetImage; import android.Manifest; import android.content.pm.PackageManager; import android.os.Bundle; -import android.os.Environment; import android.view.SurfaceView; import android.view.View; import android.widget.TextView; @@ -19,8 +18,7 @@ import android.widget.ToggleButton; import android.widget.VideoView; import java.io.File; -import java.io.IOException; -import java.lang.reflect.Array; +import java.net.URISyntaxException; import java.util.Arrays; @ExperimentalGetImage @@ -37,13 +35,14 @@ public class MainActivity extends AppCompatActivity { TextView textView = findViewById(R.id.textView); SurfaceView surfaceView = findViewById(R.id.surfaceView); VideoView videoView = findViewById(R.id.videoView); + PreviewView previewView = findViewById(R.id.previewView); File directory = getFilesDir(); - Recorder recorder = new Recorder(this); - recorder.setSurfaceView(surfaceView); + RecorderX recorderX = new RecorderX(this); + //recorderX.setPreviewView(previewView); ToggleButton toggleButton = findViewById(R.id.previewButton); toggleButton.setOnClickListener(new View.OnClickListener() { @@ -53,23 +52,16 @@ public class MainActivity extends AppCompatActivity { if (isRecordVideoAllowed() && toggleButton.isChecked()) { - //textView.setText(file.getAbsolutePath()); - recorder.startRecording(); - - File file = new File(directory, "file.txt"); - try { - file.createNewFile(); - } catch (IOException e) { + recorderX.startRecording(); + } catch (URISyntaxException e) { throw new RuntimeException(e); } - } else { + recorderX.stopRecording(); File[] files = directory.listFiles(); - //textView.setText(Arrays.toString(files)); - recorder.stopRecording(); - recorder.playVideo(videoView); + textView.setText(Arrays.toString(files)); } } }); diff --git a/app/src/main/java/com/example/ueberwachungssystem/RecorderX.java b/app/src/main/java/com/example/ueberwachungssystem/RecorderX.java new file mode 100644 index 0000000..a4603bb --- /dev/null +++ b/app/src/main/java/com/example/ueberwachungssystem/RecorderX.java @@ -0,0 +1,152 @@ +package com.example.ueberwachungssystem; + +import android.annotation.SuppressLint; +import android.content.ContentValues; +import android.content.Context; +import android.media.MediaPlayer; +import android.net.Uri; +import android.provider.MediaStore; +import android.util.Log; +import android.widget.Toast; +import android.widget.VideoView; + +import androidx.camera.core.Camera; +import androidx.camera.core.CameraSelector; +import androidx.camera.core.Preview; +import androidx.camera.lifecycle.ProcessCameraProvider; +import androidx.camera.video.FallbackStrategy; +import androidx.camera.video.MediaStoreOutputOptions; +import androidx.camera.video.Quality; +import androidx.camera.video.QualitySelector; +import androidx.camera.video.Recorder; +import androidx.camera.video.Recording; +import androidx.camera.video.VideoCapture; +import androidx.camera.video.VideoRecordEvent; +import androidx.camera.view.PreviewView; +import androidx.core.content.ContextCompat; +import androidx.core.util.Consumer; +import androidx.lifecycle.LifecycleOwner; + +import com.google.common.util.concurrent.ListenableFuture; + +import java.net.URISyntaxException; +import java.util.concurrent.ExecutionException; + +public class RecorderX { + + private final Context context; + private PreviewView previewView = null; + private ProcessCameraProvider cameraProvider; + + private Recording recording = null; + + public RecorderX(Context context) { + this.context = context; + } + + + @SuppressLint("MissingPermission") + public void startRecording() throws URISyntaxException { + + final ListenableFuture cameraProviderFuture = ProcessCameraProvider.getInstance(context); + try { + cameraProvider = cameraProviderFuture.get(); + } catch (ExecutionException | InterruptedException ignored) { + } + + + QualitySelector qualitySelector = QualitySelector + .from(Quality.HD, FallbackStrategy.higherQualityOrLowerThan(Quality.SD)); + + + Recorder.Builder recorderBuilder = new Recorder.Builder(); + recorderBuilder.setQualitySelector(qualitySelector); + Recorder recorder = recorderBuilder.build(); + + VideoCapture videoCapture = VideoCapture.withOutput(recorder); + + + // Create Preview + Preview preview = new Preview.Builder().build(); + // Specify which Camera to use + CameraSelector cameraSelector = new CameraSelector.Builder().requireLensFacing(CameraSelector.LENS_FACING_BACK).build(); + // Update PreviewView if set + if (previewView != null) + preview.setSurfaceProvider(previewView.getSurfaceProvider()); + + try { + Camera camera = cameraProvider.bindToLifecycle((LifecycleOwner) context, cameraSelector, videoCapture, preview); + } catch (Exception e) { + Log.e("Error", "Use case binding failed", e); + } + + String name = "recording.mp4"; + Uri filesDirURI = Uri.fromFile(context.getFilesDir()); + ContentValues contentValues = new ContentValues(); + contentValues.put(MediaStore.Video.Media.DISPLAY_NAME, name); + + MediaStoreOutputOptions mediaStoreOutput = new MediaStoreOutputOptions + .Builder(context.getContentResolver(), filesDirURI) + .setContentValues(contentValues) + .build(); + + + Consumer recordingListener = new Consumer() { + @Override + public void accept(VideoRecordEvent videoRecordEvent) { + if (videoRecordEvent instanceof VideoRecordEvent.Start) { + Toast.makeText(context, "Carture started", Toast.LENGTH_SHORT).show(); + } + else if (videoRecordEvent instanceof VideoRecordEvent.Finalize) { + VideoRecordEvent.Finalize finalize = (VideoRecordEvent.Finalize) videoRecordEvent; + + if (!finalize.hasError()) { + Toast.makeText(context, "Carture succeeded", Toast.LENGTH_SHORT).show(); + } + else { + recording.close(); + recording = null; + Toast.makeText(context, "Carture failed", Toast.LENGTH_SHORT).show(); + } + } + } + }; + + + recording = videoCapture.getOutput() + .prepareRecording(context, mediaStoreOutput) + .withAudioEnabled() + .start(ContextCompat.getMainExecutor(context), recordingListener); + + } + + + + + public void stopRecording() { + recording.stop(); + } + + + + /** Set PreviewView to show Image */ + public void setPreviewView(PreviewView previewView) { + this.previewView = previewView; + } + + private void playAudio() { + MediaPlayer mp = new MediaPlayer(); + try { + mp.setDataSource(context.getFilesDir() + "/audio.gpp"); + mp.prepare(); + mp.start(); + } catch (Exception e) { + e.printStackTrace(); + } + } + + public void playVideo(VideoView videoView) { + videoView.setVideoPath(context.getFilesDir() + "/video.mp4"); + videoView.start(); + } +} diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 754daf2..6d8ba14 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -30,7 +30,12 @@ + android:layout_height="200dp" /> + +