1 package ai.suanzi.rtmpclient;
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;
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;
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;
45 public class MainActivity extends AppCompatActivity implements SurfaceHolder.Callback, Camera.PreviewCallback{
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();
57 private UsbManager usbManager;
58 private UsbDevice usbCamera;
60 private Logger gLogger;
62 private Button mBtnStart;
63 private TextInputEditText mTextServer;
64 private TextInputEditText mTextUser;
65 private TextInputEditText mTextCamera;
66 private String mMacAddr = "";
68 private void configLog(){
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){
88 protected void onCreate(Bundle savedInstanceState) {
89 super.onCreate(savedInstanceState);
90 setContentView(R.layout.activity_main);
92 UserInfo.setConfigPath(getExternalFilesDir(null) + File.separator + "config");
93 this.mMacAddr = getMacAddr();
94 gLogger.debug("#######################################");
96 ffmpeg = Ffmpeg.getInstance();
98 gLogger.debug(" this ia argument " + 3 + "fjeiofjei");
100 uvcCamera = new UVCCamera();
102 mBtnStart = findViewById(R.id.button);
103 mTextServer = findViewById(R.id.textServer);
104 mTextUser = findViewById(R.id.textUser);
105 mTextCamera = findViewById(R.id.textCamera);
110 final SurfaceView surfaceView = findViewById(R.id.surfaceView);
111 mHolder = surfaceView.getHolder();
112 mHolder.addCallback(this);
114 intent.setPackage(this.getPackageName());
115 intent.setAction("ai.suanzi.rtmpclient.service");
119 final String macAddr = getMacAddr();
120 final Context context = getApplicationContext();
121 mBtnStart.setOnClickListener(new View.OnClickListener(){
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);
133 /*btn2.post(new Runnable(){
141 switchToBackground();*/
144 usbManager = (UsbManager) getSystemService(Context.USB_SERVICE);
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);
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);
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());
163 if (device.getVendorId() == 6257){
164 usbManager.requestPermission(device, mPermissionIntent);
169 //Log.e(TAG, device.)
170 //device.getInterface()
179 //SurfaceTexture st = new SurfaceTexture(0);
181 private static final String ACTION_USB_PERMISSION =
182 "com.android.example.USB_PERMISSION";
183 private final BroadcastReceiver mUsbReceiver = new BroadcastReceiver() {
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);
191 if (intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, true)) {
193 Log.e(TAG, "extra permission granted");
194 //call method to set up device communication
197 new Thread(new Runnable() {
200 Log.e("device","MyThread3");//bhw
201 UsbDeviceConnection connection = usbManager.openDevice(usbCamera);
202 int fd = connection.getFileDescriptor();//获取文件描述符
204 int ret = uvcCamera.open();
205 Log.e(TAG, "uvcCamera open return code:" + ret);
207 Log.e("device","MyThread3 "+fd);
214 Log.e(TAG, "permission denied for device. " + device);
217 } else if (UsbManager.ACTION_USB_DEVICE_DETACHED.equals(action)){
218 UsbDevice device = (UsbDevice)intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);
220 Log.e(TAG, "==== device out");
222 } else if (UsbManager.ACTION_USB_DEVICE_ATTACHED.equals(action)) {
223 Log.e(TAG, "==== device in =====");
232 protected void onPause(){
234 Log.e(TAG, "OnPause");
238 protected void onResume() {
240 Log.e(TAG, "OnResume");
244 protected void onStop() {
250 protected void onStart(){
252 Log.e(TAG,"onStart");
256 protected void onDestroy(){
258 Log.e(TAG,"onDestroy");
262 protected void onRestart(){
264 Log.e(TAG,"onRestart");
267 // class StreamTask AsyncTask
268 private class StreamTask extends AsyncTask<Void, Void, Void>{
271 StreamTask(byte[] data){
276 protected Void doInBackground(Void... params) {
278 if (this.data != null){
279 Log.e(TAG, "fps: " + mCamera.getParameters().getPreviewFrameRate());
280 ffmpeg.process(this.data);
286 // SurfaceHolder.Callback implementation
288 public void surfaceCreated(final SurfaceHolder holder){
289 Log.e(TAG,"SurfacedCreated");
291 mCamera.setPreviewDisplay(holder);
292 mCamera.startPreview();
293 } catch (IOException e) {
294 Log.d(TAG, "Error setting camera preview: " + e.getMessage());
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);
308 //Thread.sleep(10000);
309 /*Log.e(TAG, "xxxxxxxxxxxxxx");
310 mExecutor.execute(new Runnable() {
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);
320 //btn.performClick();
321 //} catch (InterruptedException e){
322 // e.printStackTrace();
327 //Camera.Parameters params = mCamera.getParameters();
328 //ffmpeg.init(params.getPictureSize().width, params.getPictureSize().height);
329 /*Thread t = new Thread(new Runnable() {
332 ffmpeg.play(mHolder.getSurface(),"/storage/emulated/0/Movies/output.flv");
340 public void surfaceDestroyed(SurfaceHolder holder){
341 Log.e(TAG, "surfaceDestroyed");
344 private long encodeCount = 0;
345 private long count = 0;
346 private long previewTime;
347 // Camera.PreviewCallback
349 public void onPreviewFrame(final byte[] data, Camera camera){
350 /*if (null != mStreamTask){
351 switch (mStreamTask.getStatus()){
353 Log.e(TAG, "onPreviewFrame Running");
356 Log.e(TAG,"OnPreviewFrame Pending");
357 mStreamTask.cancel(false);
361 mStreamTask = new StreamTask(data);
362 mStreamTask.execute((Void)null);*/
365 /*long endTime = System.currentTimeMillis();
366 mExecutor.execute(new Runnable() {
369 long encodeTime = System.currentTimeMillis();
370 ffmpeg.process(data);
371 Log.e(TAG, "编码第:" + (encodeCount++) + "帧,耗时:" + (System.currentTimeMillis() - encodeTime));
374 Log.e(TAG, "采集第:" + (++count) + "帧,距上一帧间隔时间:"
375 + (endTime - previewTime) + " " + Thread.currentThread().getName());
376 previewTime = endTime;*/
381 private boolean checkCameraHardware(Context context) {
382 return context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA);
385 private static Camera getCameraInstance(){
388 Log.e(TAG, "Open Camera");
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();
395 Log.e(TAG, "### fps range : [" + i[0] + "," + i[1] + "]\n");
400 Camera.Parameters parameters = c.getParameters();
402 List<Camera.Size> sizes = parameters.getSupportedPictureSizes();
403 for (Camera.Size cc : sizes){
404 Log.e(TAG, "=== width: " + cc.width + ". height:" + cc.height);
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);
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);
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
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());
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();