1
1
package com .aquaapps .readtorecite ;
2
2
3
- import android .Manifest ;
4
- import android .content .ClipData ;
5
- import android .content .ContentValues ;
6
- import android .content .pm .PackageManager ;
3
+ import android .content .Intent ;
4
+ import android .net .Uri ;
7
5
import android .os .Bundle ;
8
- import android .provider .MediaStore ;
9
- import android .util .Log ;
10
6
import android .view .Menu ;
11
7
import android .view .MenuItem ;
12
8
import android .view .View ;
9
+ import android .widget .Toast ;
13
10
14
11
import androidx .appcompat .app .AppCompatActivity ;
15
12
import androidx .appcompat .widget .Toolbar ;
16
- import androidx .camera .core .Camera ;
17
- import androidx .camera .core .CameraSelector ;
18
- import androidx .camera .core .Preview ;
19
- import androidx .camera .lifecycle .ProcessCameraProvider ;
20
- import androidx .camera .video .FallbackStrategy ;
21
- import androidx .camera .video .FileOutputOptions ;
22
- import androidx .camera .video .MediaStoreOutputOptions ;
23
- import androidx .camera .video .OutputOptions ;
24
- import androidx .camera .video .Quality ;
25
- import androidx .camera .video .QualitySelector ;
26
- import androidx .camera .video .Recorder ;
27
- import androidx .camera .video .Recording ;
28
- import androidx .camera .video .VideoCapture ;
13
+ import androidx .camera .video .OutputResults ;
29
14
import androidx .camera .video .VideoRecordEvent ;
30
- import androidx .camera .view .PreviewView ;
31
- import androidx .core .app .ActivityCompat ;
32
- import androidx .core .content .ContextCompat ;
33
15
34
16
import com .google .android .material .floatingactionbutton .FloatingActionButton ;
35
17
36
- import java .text .SimpleDateFormat ;
37
- import java .util .Date ;
38
- import java .util .Locale ;
39
- import java .util .concurrent .ExecutionException ;
18
+ import java .util .Arrays ;
40
19
41
20
public class MainActivity extends AppCompatActivity {
42
- public PreviewView previewView ;
43
- public ProcessCameraProvider cameraProvider ;
44
- public Recorder recorder ;
45
- public Recording recording =null ;
46
- public VideoCapture <Recorder > videoCapture ;
21
+ public CameraController cameraController ;
47
22
48
- public boolean isShowingPreview = true ;
23
+ public boolean isShowingPreview = true ;
49
24
50
25
@ Override
51
26
protected void onCreate (Bundle savedInstanceState ) {
@@ -55,63 +30,27 @@ protected void onCreate(Bundle savedInstanceState) {
55
30
setSupportActionBar (toolbar );
56
31
FloatingActionButton fab = findViewById (R .id .fab );
57
32
fab .setOnClickListener (view -> {
58
- if (recording ==null ) {
59
- // Start record
60
- ContentValues values = new ContentValues ();
61
- values .put (MediaStore .Video .Media .DISPLAY_NAME ,
62
- "ReadToRecite-" + new SimpleDateFormat ("yyyyMMdd-HHmmss" , Locale .ENGLISH ).format (new Date ()) + ".mp4" );
63
- MediaStoreOutputOptions options = new MediaStoreOutputOptions .Builder (
64
- this .getContentResolver (), MediaStore .Video .Media .EXTERNAL_CONTENT_URI )
65
- .setContentValues (values )
66
- .build ();
67
- if (ActivityCompat .checkSelfPermission (this , Manifest .permission .RECORD_AUDIO ) != PackageManager .PERMISSION_GRANTED ) {
68
- ActivityCompat .requestPermissions (this , new String []{Manifest .permission .RECORD_AUDIO }, 114514 );
69
- }
70
-
71
- recording = videoCapture .getOutput ().prepareRecording (this , options )
72
- .withAudioEnabled ()
73
- .start (ContextCompat .getMainExecutor (this ), videoRecordEvent -> {
74
- if (videoRecordEvent instanceof VideoRecordEvent .Finalize ){
75
- VideoRecordEvent .Finalize finalizeEvent = (VideoRecordEvent .Finalize ) videoRecordEvent ;
76
- Log .e ("Debug" , String .valueOf (finalizeEvent .getError ()));
77
- OutputOptions outputOptions =finalizeEvent .getOutputOptions ();
78
- if (outputOptions instanceof FileOutputOptions )
79
- Log .e ("Debug" ,((FileOutputOptions ) outputOptions ).getFile ().getAbsolutePath ());
80
- }
81
- });
82
-
83
- fab .setImageResource (android .R .drawable .ic_menu_save );
84
-
85
- } else { // Stop record
86
- recording .stop ();
87
- recording =null ;
33
+ if (cameraController .isRecording ()) {
34
+ cameraController .stopRecord ();
88
35
fab .setImageResource (android .R .drawable .ic_media_play ); // start
36
+ } else {
37
+ cameraController .startRecord (videoRecordEvent -> {
38
+ if (videoRecordEvent instanceof VideoRecordEvent .Finalize ) {
39
+ VideoRecordEvent .Finalize finalizeEvent = (VideoRecordEvent .Finalize ) videoRecordEvent ;
40
+ OutputResults outputResults = finalizeEvent .getOutputResults ();
41
+ int errorCode = finalizeEvent .getError ();
42
+ if (errorCode != VideoRecordEvent .Finalize .ERROR_NONE ) {
43
+ Toast .makeText (this , "错误: " + errorCode , Toast .LENGTH_LONG ).show ();
44
+ } else {
45
+ shareVideo (outputResults .getOutputUri ());
46
+ }
47
+ }
48
+ });
49
+ fab .setImageResource (android .R .drawable .ic_menu_save );
89
50
}
90
51
});
91
52
// Instance Camera
92
- try {
93
- cameraProvider =ProcessCameraProvider .getInstance (this ).get ();
94
- Preview preview =new Preview .Builder ().build ();
95
- previewView =findViewById (R .id .previewView );
96
- CameraSelector cameraSelector =new CameraSelector .Builder ()
97
- .requireLensFacing (CameraSelector .LENS_FACING_FRONT )
98
- .build ();
99
- preview .setSurfaceProvider (previewView .getSurfaceProvider ());
100
-
101
- QualitySelector qs =QualitySelector .fromOrderedList (
102
- QualitySelector .getSupportedQualities (
103
- cameraSelector .filter (cameraProvider .getAvailableCameraInfos ()).get (0 )),
104
- FallbackStrategy .higherQualityOrLowerThan (Quality .SD ));
105
- recorder =new Recorder .Builder ()
106
- .setQualitySelector (qs )
107
- .build ();
108
- videoCapture =VideoCapture .withOutput (recorder );
109
- Camera camera =cameraProvider .bindToLifecycle (this ,cameraSelector ,videoCapture ,preview );
110
-
111
- }
112
- catch (ExecutionException | InterruptedException e ){
113
- e .printStackTrace ();
114
- }
53
+ cameraController = new CameraController (this );
115
54
}
116
55
117
56
@@ -131,17 +70,32 @@ public boolean onOptionsItemSelected(MenuItem item) {
131
70
132
71
//noinspection SimplifiableIfStatement
133
72
if (id == R .id .action_preview ) {
134
- if (isShowingPreview ){
135
- previewView .setVisibility (View .INVISIBLE );
73
+ if (isShowingPreview ) {
74
+ cameraController . previewView .setVisibility (View .INVISIBLE );
136
75
item .setTitle (R .string .action_preview_enabled );
137
- } else {
138
- previewView .setVisibility (View .VISIBLE );
76
+ } else {
77
+ cameraController . previewView .setVisibility (View .VISIBLE );
139
78
item .setTitle (R .string .action_preview_disabled );
140
79
}
141
- isShowingPreview = !isShowingPreview ;
80
+ isShowingPreview = !isShowingPreview ;
142
81
return true ;
143
82
}
144
83
145
84
return super .onOptionsItemSelected (item );
146
85
}
86
+
87
+ public void shareVideo (Uri videoUri ) {
88
+ Intent intent = new Intent ();
89
+ intent .setAction (Intent .ACTION_SEND );
90
+ String [] splitResult = videoUri .getPath ().split ("\\ ." );
91
+ if (splitResult [splitResult .length - 1 ].equals ("3gp" )) {
92
+ intent .setType ("video/3gpp" );
93
+ } else {
94
+ intent .setType ("video/mp4" );
95
+ }
96
+
97
+ intent .putExtra (Intent .EXTRA_STREAM , videoUri );
98
+ startActivity (Intent .createChooser (intent , "分享..." ));
99
+ }
100
+
147
101
}
0 commit comments