fix bug when long runing in background
[rtmpclient.git] / app / src / main / java / ai / suanzi / rtmpclient / MainActivity.java
1 package ai.suanzi.rtmpclient;
2
3 import android.app.Activity;
4 import android.graphics.ImageFormat;
5 import android.graphics.SurfaceTexture;
6 import android.support.v7.app.AppCompatActivity;
7 import android.os.Bundle;
8 import android.util.Log;
9 import android.view.SurfaceHolder;
10 import android.hardware.Camera;
11 import android.view.SurfaceView;
12 import android.view.View;
13 import android.widget.Button;
14 import android.widget.Toast;
15 import android.content.Context;
16 import android.content.pm.PackageManager;
17 import android.os.AsyncTask;
18 import java.util.List;
19 import java.io.IOException;
20 import java.util.concurrent.Executor;
21 import java.util.concurrent.ExecutorService;
22 import java.util.concurrent.Executors;
23 import android.content.Intent;
24 import java.io.OutputStream;
25
26
27
28 public class MainActivity extends AppCompatActivity implements SurfaceHolder.Callback, Camera.PreviewCallback{
29
30     private static final String TAG = "PENG";
31     private Ffmpeg ffmpeg = new Ffmpeg();
32     private Camera mCamera ;//= getCameraInstance();
33     private StreamTask mStreamTask;
34     private SurfaceHolder mHolder;
35     ExecutorService mExecutor = Executors.newSingleThreadExecutor();
36     //Intent it = new Intent(getApplicationContext(), MyService.class);
37     Intent intent = new Intent();
38
39
40     @Override
41     protected void onCreate(Bundle savedInstanceState) {
42         super.onCreate(savedInstanceState);
43         setContentView(R.layout.activity_main);
44         Log.e(TAG, "Ffmpeg Version: " + ffmpeg.getVersion());
45
46         final Button btn = findViewById(R.id.button);
47         btn.setText("Start");
48         /*btn.setOnClickListener(new View.OnClickListener() {
49             @Override
50             public void onClick(View v) {
51                 Log.e(TAG, "Button " + btn.getText() + " onClick");
52                 if (mCamera == null) return;
53                 if(btn.getText().equals("Start")){
54                     mCamera.startPreview();
55                     Camera.Parameters params = mCamera.getParameters();
56                     //params.setPreviewFpsRange(30000, 30000);
57                     //params.setPictureSize(320, 240);
58                     //params.setPictureFormat(ImageFormat.NV21);
59                     //mCamera.setParameters(params);
60
61
62
63
64                     ffmpeg.init(params.getPictureSize().width, params.getPictureSize().height);
65                 } else {
66                     mCamera.setPreviewCallback(null);
67                     Toast.makeText(MainActivity.this, "encode done", Toast.LENGTH_SHORT).show();
68                     ffmpeg.flush();
69                     ffmpeg.close();
70                 }
71                 btn.setText(btn.getText().equals("Start") ? "Stop" : "Start");
72             }
73         });*/
74
75         /*this.mCamera = getCameraInstance();
76         if(checkCameraHardware(this)) Log.e(TAG, "has cameras: " + Camera.getNumberOfCameras());
77 */
78         final SurfaceView surfaceView = findViewById(R.id.surfaceView);
79         mHolder = surfaceView.getHolder();
80         mHolder.addCallback(this);
81
82         intent.setPackage(this.getPackageName());
83         intent.setAction("ai.suanzi.rtmpclient.service");
84
85
86         final Button btn2 = findViewById(R.id.button);
87
88
89         btn2.setOnClickListener(new View.OnClickListener(){
90             @Override
91             public void onClick(View view){
92                 Log.e(TAG, "onclick2");
93                 //ffmpeg.play(mHolder.getSurface(),"/storage/sdcard0/output.flv");
94                 //ffmpeg.push(mHolder.getSurface());
95                 //ffmpeg.preview(mHolder.getSurface());
96                 // intent.putExtra("cmd",0);//0,开启前台服务,1,关闭前台服务
97                 startService(intent);
98             }
99
100         });
101
102         btn2.post(new Runnable(){
103             @Override
104             public void run() {
105                 btn2.performClick();
106
107             }
108         });
109
110         switchToBackground();
111     }
112
113     //SurfaceTexture st = new SurfaceTexture(0);
114
115
116     @Override
117     protected void onPause(){
118         super.onPause();
119         Log.e(TAG, "OnPause");
120         //ffmpeg.flush();
121         //ffmpeg.close();
122     }
123
124     @Override
125     protected void onResume() {
126         super.onResume();
127         Log.e(TAG, "OnResume");
128     }
129
130     @Override
131     protected void onStop() {
132         super.onStop();
133         Log.e(TAG,"onStop");
134     }
135
136     @Override
137     protected void onStart(){
138         super.onStart();
139         Log.e(TAG,"onStart");
140     }
141
142     @Override
143     protected void onDestroy(){
144         super.onDestroy();
145         Log.e(TAG,"onDestroy");
146     }
147
148     @Override
149     protected void onRestart(){
150         super.onStart();
151         Log.e(TAG,"onRestart");
152     }
153
154     // class StreamTask AsyncTask
155     private class StreamTask extends AsyncTask<Void, Void, Void>{
156         private byte[] data;
157
158         StreamTask(byte[] data){
159             this.data = data;
160         }
161
162         @Override
163         protected Void doInBackground(Void... params) {
164
165             if (this.data != null){
166                 Log.e(TAG, "fps: " + mCamera.getParameters().getPreviewFrameRate());
167                 ffmpeg.process(this.data);
168             }
169             return null;
170         }
171     }
172
173     // SurfaceHolder.Callback implementation
174     @Override
175     public void surfaceCreated(final SurfaceHolder holder){
176         Log.e(TAG,"SurfacedCreated");
177         /*try {
178             mCamera.setPreviewDisplay(holder);
179             mCamera.startPreview();
180         } catch (IOException e) {
181             Log.d(TAG, "Error setting camera preview: " + e.getMessage());
182         }*/
183     }
184
185     @Override
186     public void surfaceChanged(SurfaceHolder holder, int format, int widht, int height){
187         Log.e(TAG, "surfaceChanged");
188         //if(mCamera==null) return;
189         //Camera.Parameters parameters=mCamera.getParameters();
190         //parameters.setPreviewSize(640,480);
191         //parameters.setPictureSize(640,480);
192         //mCamera.setParameters(parameters);
193
194         //try{
195             //Thread.sleep(10000);
196             /*Log.e(TAG, "xxxxxxxxxxxxxx");
197             mExecutor.execute(new Runnable() {
198                 @Override
199                 public void run() {
200                     mCamera.startPreview();
201                     final Button btn = findViewById(R.id.button);
202                     Camera.Parameters params = mCamera.getParameters();
203                     ffmpeg.init(params.getPictureSize().width, params.getPictureSize().height);
204                 }
205             });*/
206
207             //btn.performClick();
208         //} catch (InterruptedException e){
209          //   e.printStackTrace();
210         //}
211
212
213
214         //Camera.Parameters params = mCamera.getParameters();
215         //ffmpeg.init(params.getPictureSize().width, params.getPictureSize().height);
216         /*Thread t = new Thread(new Runnable() {
217             @Override
218             public void run() {
219                 ffmpeg.play(mHolder.getSurface(),"/storage/emulated/0/Movies/output.flv");
220
221             }
222         });*/
223
224     }
225
226     @Override
227     public void surfaceDestroyed(SurfaceHolder holder){
228         Log.e(TAG, "surfaceDestroyed");
229     }
230
231     private long encodeCount = 0;
232     private long count = 0;
233     private long previewTime;
234     // Camera.PreviewCallback
235     @Override
236     public void  onPreviewFrame(final byte[] data, Camera camera){
237         /*if (null != mStreamTask){
238             switch (mStreamTask.getStatus()){
239                 case RUNNING:
240                     Log.e(TAG, "onPreviewFrame Running");
241                     return;
242                 case PENDING:
243                     Log.e(TAG,"OnPreviewFrame Pending");
244                     mStreamTask.cancel(false);
245                     break;
246             }
247         }
248         mStreamTask = new StreamTask(data);
249         mStreamTask.execute((Void)null);*/
250
251
252         /*long endTime = System.currentTimeMillis();
253         mExecutor.execute(new Runnable() {
254             @Override
255             public void run() {
256                 long encodeTime = System.currentTimeMillis();
257                 ffmpeg.process(data);
258                 Log.e(TAG, "编码第:" + (encodeCount++) + "帧,耗时:" + (System.currentTimeMillis() - encodeTime));
259             }
260         });
261         Log.e(TAG, "采集第:" + (++count) + "帧,距上一帧间隔时间:"
262                 + (endTime - previewTime) + "  " + Thread.currentThread().getName());
263         previewTime = endTime;*/
264
265     }
266
267     // private
268     private boolean checkCameraHardware(Context context) {
269         return context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA);
270     }
271
272     private static Camera getCameraInstance(){
273         Camera c = null;
274         try {
275             Log.e(TAG, "Open Camera");
276             c = Camera.open(0);
277             Camera.Parameters params = c.getParameters();
278             Log.e(TAG, "Camera parameters:  " + params.getPreviewSize().width + "x" + params.getPreviewSize().height);
279             Log.e(TAG, "Preview format (17 is NV21): " + params.getPreviewFormat() + ". Picture format(256 is JPEG): " + params.getPictureFormat());
280             List<int[]> fps = params.getSupportedPreviewFpsRange();
281             for(int[] i : fps){
282                 Log.e(TAG, "###  fps range : [" + i[0] + "," + i[1] + "]\n");
283             }
284
285
286
287             Camera.Parameters parameters = c.getParameters();
288
289             List<Camera.Size> sizes = parameters.getSupportedPictureSizes();
290             for (Camera.Size cc : sizes){
291                 Log.e(TAG, "=== width: " + cc.width + ". height:" + cc.height);
292             }
293             Camera.Size cs = sizes.get(3);
294             //params.setPreviewSize(cs.width, cs.height);
295             params.setPictureSize(cs.width, cs.height);
296             //params.setPictureFormat(ImageFormat.NV21);
297             c.setParameters(params);
298         }
299         catch (Exception e){
300             e.printStackTrace();
301         }
302         return c;
303     }
304
305     private void changeCameraPermission(){
306         Log.e(TAG, "change /dev/video0 permission");
307         try{
308             /*Process sh = Runtime.getRuntime().exec("su", null,null);
309             OutputStream  os = sh.getOutputStream();
310             os.write(("chmod 666 /dev/video0").getBytes("ASCII"));
311             os.flush();
312             os.close();
313             sh.waitFor();*/
314
315             Process sh = Runtime.getRuntime().exec(new String[]{"su", "-c", "system/bin/sh"});
316             sh = Runtime.getRuntime().exec(new String[]{"chmod", "666", "/dev/video0"});
317             sh.waitFor();
318         } catch (Exception e){
319             e.printStackTrace();
320         }
321     }
322
323     private void switchToBackground(){
324         Intent i = new Intent();
325         i.setAction(Intent.ACTION_MAIN);
326         i.addCategory(Intent.CATEGORY_HOME);
327         this.startActivity(i);
328     }
329
330 }