UVCCameraService.java 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209
  1. package com.easygbs.device;
  2. import android.app.Service;
  3. import android.arch.lifecycle.BuildConfig;
  4. import android.arch.lifecycle.LiveData;
  5. import android.content.Intent;
  6. import android.hardware.usb.UsbDevice;
  7. import android.os.Binder;
  8. import android.os.IBinder;
  9. import android.util.Log;
  10. import android.util.SparseArray;
  11. import android.widget.Toast;
  12. import com.serenegiant.usb.DeviceFilter;
  13. import com.serenegiant.usb.IButtonCallback;
  14. import com.serenegiant.usb.IStatusCallback;
  15. import com.serenegiant.usb.USBMonitor;
  16. import com.serenegiant.usb.UVCCamera;
  17. import java.nio.ByteBuffer;
  18. public class UVCCameraService extends Service {
  19. public static class UVCCameraLivaData extends LiveData<UVCCamera> {
  20. @Override
  21. protected void postValue(UVCCamera value) {
  22. super.postValue(value);
  23. }
  24. }
  25. public static final UVCCameraLivaData liveData = new UVCCameraLivaData();
  26. public static class MyUVCCamera extends UVCCamera {
  27. boolean prev = false;
  28. @Override
  29. public synchronized void startPreview() {
  30. if (prev)
  31. return;
  32. super.startPreview();
  33. prev = true;
  34. }
  35. @Override
  36. public synchronized void stopPreview() {
  37. if (!prev)
  38. return;
  39. super.stopPreview();
  40. prev = false;
  41. }
  42. @Override
  43. public synchronized void destroy() {
  44. prev = false;
  45. super.destroy();
  46. }
  47. }
  48. private static final String TAG = UVCCameraService.class.getSimpleName();
  49. private USBMonitor mUSBMonitor;
  50. private UVCCamera mUVCCamera;
  51. private SparseArray<UVCCamera> cameras = new SparseArray<>();
  52. public class MyBinder extends Binder {
  53. public UVCCameraService getService() {
  54. return UVCCameraService.this;
  55. }
  56. }
  57. MyBinder binder = new MyBinder();
  58. @Override
  59. public IBinder onBind(Intent intent) {
  60. return binder;
  61. }
  62. public UVCCamera getCamera() {
  63. return mUVCCamera;
  64. }
  65. private void releaseCamera() {
  66. if (mUVCCamera != null) {
  67. try {
  68. mUVCCamera.close();
  69. mUVCCamera.destroy();
  70. mUVCCamera = null;
  71. } catch (final Exception e) {
  72. //
  73. }
  74. }
  75. }
  76. @Override
  77. public void onCreate() {
  78. super.onCreate();
  79. mUSBMonitor = new USBMonitor(this, new USBMonitor.OnDeviceConnectListener() {
  80. @Override
  81. public void onAttach(final UsbDevice device) {
  82. Log.v(TAG, "onAttach:" + device);
  83. mUSBMonitor.requestPermission(device);
  84. }
  85. @Override
  86. public void onConnect(final UsbDevice device, final USBMonitor.UsbControlBlock ctrlBlock, final boolean createNew) {
  87. releaseCamera();
  88. if (BuildConfig.DEBUG)
  89. Log.v(TAG, "onConnect:");
  90. try {
  91. final UVCCamera camera = new MyUVCCamera();
  92. camera.open(ctrlBlock);
  93. camera.setStatusCallback(new IStatusCallback() {
  94. @Override
  95. public void onStatus(final int statusClass, final int event, final int selector, final int statusAttribute, final ByteBuffer data) {
  96. Log.i(TAG, "onStatus(statusClass=" + statusClass
  97. + "; " +
  98. "event=" + event + "; " +
  99. "selector=" + selector + "; " +
  100. "statusAttribute=" + statusAttribute + "; " +
  101. "data=...)");
  102. }
  103. });
  104. camera.setButtonCallback(new IButtonCallback() {
  105. @Override
  106. public void onButton(final int button, final int state) {
  107. Log.i(TAG, "onButton(button=" + button + "; " + "state=" + state + ")");
  108. }
  109. });
  110. // camera.setPreviewTexture(camera.getSurfaceTexture());
  111. mUVCCamera = camera;
  112. liveData.postValue(camera);
  113. Toast.makeText(UVCCameraService.this, "UVCCamera connected!", Toast.LENGTH_SHORT).show();
  114. if (device != null)
  115. cameras.append(device.getDeviceId(), camera);
  116. } catch (Exception ex) {
  117. ex.printStackTrace();
  118. }
  119. }
  120. @Override
  121. public void onDisconnect(final UsbDevice device, final USBMonitor.UsbControlBlock ctrlBlock) {
  122. Log.v(TAG, "onDisconnect:");
  123. // Toast.makeText(MainActivity.this, R.string.usb_camera_disconnected, Toast.LENGTH_SHORT).show();
  124. // releaseCamera();
  125. if (device != null) {
  126. UVCCamera camera = cameras.get(device.getDeviceId());
  127. if (mUVCCamera == camera) {
  128. mUVCCamera = null;
  129. Toast.makeText(UVCCameraService.this, "UVCCamera disconnected!", Toast.LENGTH_SHORT).show();
  130. liveData.postValue(null);
  131. }
  132. cameras.remove(device.getDeviceId());
  133. } else {
  134. Toast.makeText(UVCCameraService.this, "UVCCamera disconnected!", Toast.LENGTH_SHORT).show();
  135. mUVCCamera = null;
  136. liveData.postValue(null);
  137. }
  138. // if (mUSBMonitor != null) {
  139. // mUSBMonitor.destroy();
  140. // }
  141. //
  142. // mUSBMonitor = new USBMonitor(OutterCameraService.this, this);
  143. // mUSBMonitor.setDeviceFilter(DeviceFilter.getDeviceFilters(OutterCameraService.this, R.xml.device_filter));
  144. // mUSBMonitor.register();
  145. }
  146. @Override
  147. public void onCancel(UsbDevice usbDevice) {
  148. releaseCamera();
  149. }
  150. @Override
  151. public void onDettach(final UsbDevice device) {
  152. Log.v(TAG, "onDettach:");
  153. releaseCamera();
  154. // AppContext.getInstance().bus.post(new UVCCameraDisconnect());
  155. }
  156. });
  157. mUSBMonitor.setDeviceFilter(DeviceFilter.getDeviceFilters(this, R.xml.device_filter));
  158. mUSBMonitor.register();
  159. }
  160. @Override
  161. public void onDestroy() {
  162. releaseCamera();
  163. if (mUSBMonitor != null) {
  164. mUSBMonitor.unregister();
  165. }
  166. super.onDestroy();
  167. }
  168. }