add user input
[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.app.PendingIntent;
5 import android.content.BroadcastReceiver;
6 import android.content.IntentFilter;
7 import android.graphics.ImageFormat;
8 import android.graphics.SurfaceTexture;
9 import android.hardware.usb.UsbDevice;
10 import android.hardware.usb.UsbManager;
11 import android.os.Environment;
12 import android.support.design.widget.TextInputEditText;
13 import android.support.v7.app.AppCompatActivity;
14 import android.os.Bundle;
15 import android.util.Log;
16 import android.view.SurfaceHolder;
17 import android.hardware.Camera;
18 import android.view.SurfaceView;
19 import android.view.View;
20 import android.widget.Button;
21 import android.widget.Toast;
22 import android.content.Context;
23 import android.content.pm.PackageManager;
24 import android.os.AsyncTask;
25
26 import java.io.File;
27 import java.util.HashMap;
28 import java.util.Iterator;
29 import java.util.List;
30 import java.io.IOException;
31 import java.util.concurrent.Executor;
32 import java.util.concurrent.ExecutorService;
33 import java.util.concurrent.Executors;
34 import android.content.Intent;
35 import java.io.OutputStream;
36 import android.hardware.usb.UsbManager;
37 import android.hardware.usb.UsbDeviceConnection;
38
39 import de.mindpipe.android.logging.log4j.LogConfigurator;
40 import org.apache.log4j.Level;
41 import org.apache.log4j.Logger;
42 import android.net.wifi.WifiManager;
43 import android.net.wifi.WifiInfo;
44
45 public class MainActivity extends AppCompatActivity implements SurfaceHolder.Callback, Camera.PreviewCallback{
46
47     private static final String TAG = "PENG";
48     private Ffmpeg ffmpeg;// = Ffmpeg.getInstance();
49     private Camera mCamera ;//= getCameraInstance();
50     private StreamTask mStreamTask;
51     private SurfaceHolder mHolder;
52     private UVCCamera uvcCamera;
53     ExecutorService mExecutor = Executors.newSingleThreadExecutor();
54     //Intent it = new Intent(getApplicationContext(), MyService.class);
55     Intent intent = new Intent();
56
57     private UsbManager usbManager;
58     private UsbDevice usbCamera;
59
60     private Logger gLogger;
61
62     private Button mBtnStart;
63     private TextInputEditText mTextServer;
64     private TextInputEditText mTextUser;
65     private TextInputEditText mTextCamera;
66     private String mMacAddr = "";
67
68     private void configLog(){
69         try {
70             final LogConfigurator logConfigurator = new LogConfigurator();
71             //logConfigurator.setFileName(Environment.getExternalStorageDirectory() + File.separator + "myc" + File.separator + "log" + File.separator + "test.log");
72             String fname = getExternalFilesDir(null) + File.separator + "log.txt";
73             logConfigurator.setFileName(fname);
74             Log.e(TAG, "Log file is located at: " + fname);
75             logConfigurator.setRootLevel(Level.DEBUG);
76             logConfigurator.setLevel("org.apache", Level.ERROR);
77             logConfigurator.setMaxFileSize(1024 * 1024 * 10);
78             logConfigurator.configure();
79             gLogger = Logger.getLogger(getClass());
80         } catch (Exception e){
81             e.printStackTrace();
82         }
83     }
84
85
86
87     @Override
88     protected void onCreate(Bundle savedInstanceState) {
89         super.onCreate(savedInstanceState);
90         setContentView(R.layout.activity_main);
91         configLog();
92         UserInfo.setConfigPath(getExternalFilesDir(null) + File.separator + "config");
93         this.mMacAddr = getMacAddr();
94         gLogger.debug("#######################################");
95
96         ffmpeg = Ffmpeg.getInstance();
97
98         gLogger.debug(" this ia argument " + 3 + "fjeiofjei");
99
100         uvcCamera = new UVCCamera();
101
102         mBtnStart = findViewById(R.id.button);
103         mTextServer = findViewById(R.id.textServer);
104         mTextUser = findViewById(R.id.textUser);
105         mTextCamera = findViewById(R.id.textCamera);
106
107         loadConfig();
108
109
110         final SurfaceView surfaceView = findViewById(R.id.surfaceView);
111         mHolder = surfaceView.getHolder();
112         mHolder.addCallback(this);
113
114         intent.setPackage(this.getPackageName());
115         intent.setAction("ai.suanzi.rtmpclient.service");
116
117
118
119         final String macAddr = getMacAddr();
120         final Context context = getApplicationContext();
121         mBtnStart.setOnClickListener(new View.OnClickListener(){
122             @Override
123             public void onClick(View view){
124                 Log.e(TAG, "onclick2");
125                 String url = mTextServer.getText().toString() + "/" + mTextUser.getText().toString() + "_" + macAddr + "_" + mTextCamera.getText().toString();
126                 gLogger.error("Url " + url);
127                 intent.putExtra("url", url);
128                 startService(intent);
129                 saveConfig();
130             }
131         });
132
133         /*btn2.post(new Runnable(){
134             @Override
135             public void run() {
136                 btn2.performClick();
137
138             }
139         });
140
141         switchToBackground();*/
142
143
144         usbManager = (UsbManager) getSystemService(Context.USB_SERVICE);
145
146         HashMap<String, UsbDevice> deviceList = usbManager.getDeviceList();
147         Log.e(TAG, "device list size : " + deviceList.size());
148         Iterator<UsbDevice> deviceIterator = deviceList.values().iterator();
149         PendingIntent mPermissionIntent = PendingIntent.getBroadcast(this, 0, new Intent(ACTION_USB_PERMISSION), 0);
150
151         IntentFilter filter = new IntentFilter(UsbManager.ACTION_USB_DEVICE_DETACHED);
152         registerReceiver(mUsbReceiver, filter);
153         filter = new IntentFilter(UsbManager.ACTION_USB_DEVICE_ATTACHED);
154         registerReceiver(mUsbReceiver, filter);
155         filter = new IntentFilter(ACTION_USB_PERMISSION);
156         registerReceiver(mUsbReceiver, filter);
157
158         while(deviceIterator.hasNext()){
159             UsbDevice device = deviceIterator.next();
160             Log.e(TAG, device.toString());
161             Log.e(TAG, device.getDeviceName() + " manufacture name: " + device.getManufacturerName() + " " + device.getSerialNumber() + " " + device.getDeviceId());
162
163             if (device.getVendorId() == 6257){
164                 usbManager.requestPermission(device, mPermissionIntent);
165
166                 usbCamera = device;
167             }
168
169             //Log.e(TAG, device.)
170             //device.getInterface()
171         }
172
173
174
175
176
177     }
178
179     //SurfaceTexture st = new SurfaceTexture(0);
180
181     private static final String ACTION_USB_PERMISSION =
182             "com.android.example.USB_PERMISSION";
183     private final BroadcastReceiver mUsbReceiver = new BroadcastReceiver() {
184
185         public void onReceive(Context context, Intent intent) {
186             String action = intent.getAction();
187             if (ACTION_USB_PERMISSION.equals(action)) {
188                 synchronized (this) {
189                     UsbDevice device = (UsbDevice)intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);
190
191                     if (intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, true)) {
192                         if(device != null){
193                             Log.e(TAG, "extra permission granted");
194                             //call method to set up device communication
195
196
197                             new Thread(new Runnable() {
198                                 @Override
199                                 public void run() {
200                                     Log.e("device","MyThread3");//bhw
201                                     UsbDeviceConnection connection = usbManager.openDevice(usbCamera);
202                                     int fd = connection.getFileDescriptor();//获取文件描述符
203                                     //ffmpeg.test(fd);
204                                     int ret = uvcCamera.open();
205                                     Log.e(TAG, "uvcCamera open return code:" + ret);
206
207                                     Log.e("device","MyThread3  "+fd);
208                                 }
209                             }).start();
210
211                         }
212                     }
213                     else {
214                         Log.e(TAG, "permission denied for device. " + device);
215                     }
216                 }
217             } else if (UsbManager.ACTION_USB_DEVICE_DETACHED.equals(action)){
218                 UsbDevice device = (UsbDevice)intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);
219                 if (device != null){
220                     Log.e(TAG, "==== device out");
221                 }
222             } else if (UsbManager.ACTION_USB_DEVICE_ATTACHED.equals(action)) {
223                 Log.e(TAG, "==== device in =====");
224             }
225         }
226     };
227
228
229
230
231     @Override
232     protected void onPause(){
233         super.onPause();
234         Log.e(TAG, "OnPause");
235     }
236
237     @Override
238     protected void onResume() {
239         super.onResume();
240         Log.e(TAG, "OnResume");
241     }
242
243     @Override
244     protected void onStop() {
245         super.onStop();
246         Log.e(TAG,"onStop");
247     }
248
249     @Override
250     protected void onStart(){
251         super.onStart();
252         Log.e(TAG,"onStart");
253     }
254
255     @Override
256     protected void onDestroy(){
257         super.onDestroy();
258         Log.e(TAG,"onDestroy");
259     }
260
261     @Override
262     protected void onRestart(){
263         super.onStart();
264         Log.e(TAG,"onRestart");
265     }
266
267     // class StreamTask AsyncTask
268     private class StreamTask extends AsyncTask<Void, Void, Void>{
269         private byte[] data;
270
271         StreamTask(byte[] data){
272             this.data = data;
273         }
274
275         @Override
276         protected Void doInBackground(Void... params) {
277
278             if (this.data != null){
279                 Log.e(TAG, "fps: " + mCamera.getParameters().getPreviewFrameRate());
280                 ffmpeg.process(this.data);
281             }
282             return null;
283         }
284     }
285
286     // SurfaceHolder.Callback implementation
287     @Override
288     public void surfaceCreated(final SurfaceHolder holder){
289         Log.e(TAG,"SurfacedCreated");
290         /*try {
291             mCamera.setPreviewDisplay(holder);
292             mCamera.startPreview();
293         } catch (IOException e) {
294             Log.d(TAG, "Error setting camera preview: " + e.getMessage());
295         }*/
296     }
297
298     @Override
299     public void surfaceChanged(SurfaceHolder holder, int format, int widht, int height){
300         Log.e(TAG, "surfaceChanged");
301         //if(mCamera==null) return;
302         //Camera.Parameters parameters=mCamera.getParameters();
303         //parameters.setPreviewSize(640,480);
304         //parameters.setPictureSize(640,480);
305         //mCamera.setParameters(parameters);
306
307         //try{
308             //Thread.sleep(10000);
309             /*Log.e(TAG, "xxxxxxxxxxxxxx");
310             mExecutor.execute(new Runnable() {
311                 @Override
312                 public void run() {
313                     mCamera.startPreview();
314                     final Button btn = findViewById(R.id.button);
315                     Camera.Parameters params = mCamera.getParameters();
316                     ffmpeg.init(params.getPictureSize().width, params.getPictureSize().height);
317                 }
318             });*/
319
320             //btn.performClick();
321         //} catch (InterruptedException e){
322          //   e.printStackTrace();
323         //}
324
325
326
327         //Camera.Parameters params = mCamera.getParameters();
328         //ffmpeg.init(params.getPictureSize().width, params.getPictureSize().height);
329         /*Thread t = new Thread(new Runnable() {
330             @Override
331             public void run() {
332                 ffmpeg.play(mHolder.getSurface(),"/storage/emulated/0/Movies/output.flv");
333
334             }
335         });*/
336
337     }
338
339     @Override
340     public void surfaceDestroyed(SurfaceHolder holder){
341         Log.e(TAG, "surfaceDestroyed");
342     }
343
344     private long encodeCount = 0;
345     private long count = 0;
346     private long previewTime;
347     // Camera.PreviewCallback
348     @Override
349     public void  onPreviewFrame(final byte[] data, Camera camera){
350         /*if (null != mStreamTask){
351             switch (mStreamTask.getStatus()){
352                 case RUNNING:
353                     Log.e(TAG, "onPreviewFrame Running");
354                     return;
355                 case PENDING:
356                     Log.e(TAG,"OnPreviewFrame Pending");
357                     mStreamTask.cancel(false);
358                     break;
359             }
360         }
361         mStreamTask = new StreamTask(data);
362         mStreamTask.execute((Void)null);*/
363
364
365         /*long endTime = System.currentTimeMillis();
366         mExecutor.execute(new Runnable() {
367             @Override
368             public void run() {
369                 long encodeTime = System.currentTimeMillis();
370                 ffmpeg.process(data);
371                 Log.e(TAG, "编码第:" + (encodeCount++) + "帧,耗时:" + (System.currentTimeMillis() - encodeTime));
372             }
373         });
374         Log.e(TAG, "采集第:" + (++count) + "帧,距上一帧间隔时间:"
375                 + (endTime - previewTime) + "  " + Thread.currentThread().getName());
376         previewTime = endTime;*/
377
378     }
379
380     // private
381     private boolean checkCameraHardware(Context context) {
382         return context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA);
383     }
384
385     private static Camera getCameraInstance(){
386         Camera c = null;
387         try {
388             Log.e(TAG, "Open Camera");
389             c = Camera.open(0);
390             Camera.Parameters params = c.getParameters();
391             Log.e(TAG, "Camera parameters:  " + params.getPreviewSize().width + "x" + params.getPreviewSize().height);
392             Log.e(TAG, "Preview format (17 is NV21): " + params.getPreviewFormat() + ". Picture format(256 is JPEG): " + params.getPictureFormat());
393             List<int[]> fps = params.getSupportedPreviewFpsRange();
394             for(int[] i : fps){
395                 Log.e(TAG, "###  fps range : [" + i[0] + "," + i[1] + "]\n");
396             }
397
398
399
400             Camera.Parameters parameters = c.getParameters();
401
402             List<Camera.Size> sizes = parameters.getSupportedPictureSizes();
403             for (Camera.Size cc : sizes){
404                 Log.e(TAG, "=== width: " + cc.width + ". height:" + cc.height);
405             }
406             Camera.Size cs = sizes.get(3);
407             //params.setPreviewSize(cs.width, cs.height);
408             params.setPictureSize(cs.width, cs.height);
409             //params.setPictureFormat(ImageFormat.NV21);
410             c.setParameters(params);
411         }
412         catch (Exception e){
413             e.printStackTrace();
414         }
415         return c;
416     }
417
418     private void switchToBackground(){
419         Intent i = new Intent();
420         i.setAction(Intent.ACTION_MAIN);
421         i.addCategory(Intent.CATEGORY_HOME);
422         this.startActivity(i);
423     }
424
425     private String getMacAddr() {
426         WifiManager manager = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE);
427         WifiInfo info = manager.getConnectionInfo();
428         return info.getMacAddress().replace(":", ""); //02:00:00:00:00:00 - 020000000000
429     }
430
431     private void loadConfig() {
432         UserInfo info = UserInfo.getConfig();
433         mTextServer.setText(info.server);
434         mTextUser.setText(info.user);
435         mTextCamera.setText(info.cameraId);
436         mMacAddr = info.macAddr;
437         gLogger.error("loadConfig " + info.toString());
438     }
439
440     private void saveConfig() {
441         UserInfo info = UserInfo.getConfig();
442         info.update(mTextServer.getText().toString(), mTextUser.getText().toString(), mMacAddr, mTextCamera.getText().toString());
443         if(info.saveConfig()) {
444             gLogger.error("saveConfig: " + info.toString());
445             Toast.makeText(getApplicationContext(), "Wring config succeed ", Toast.LENGTH_LONG).show();
446         }
447     }
448 }