| | |
| | | NONE, |
| | | USB_PUSH, |
| | | USB_RECORD, |
| | | ANDROID_RECORD, |
| | | P2_USB_PUSH, |
| | | P2_USB_RECORD |
| | | ANDROID_RECORD |
| | | } |
| | | |
| | | // AIDL Binder |
| | |
| | | } |
| | | |
| | | @Override |
| | | public void stopMedia() throws RemoteException { |
| | | public void stopMedia(MediaArgu media) throws RemoteException { |
| | | Timber.d("stopMedia called via AIDL"); |
| | | FloatingService.this.stopMedia(); |
| | | FloatingService.this.stopMedia(media); |
| | | } |
| | | |
| | | @Override |
| | |
| | | return; |
| | | } |
| | | |
| | | // usbCameraId == 2:走 P2 跨进程服务,支持两路 USB 同时工作 |
| | | // usbCameraId == 2:走 P2 跨进程服务,支持两路 USB 同时工作(本 Service 不再跟踪其状态) |
| | | if (media.isUsedOutCamera() && media.getUsbCameraId() == 2) { |
| | | stopCurrentManager(); |
| | | ensureP2Bound(); |
| | | if (p2Service != null) { |
| | | try { |
| | | p2Service.startMedia(media); |
| | | currentManagerType = media.isPush() ? ManagerType.P2_USB_PUSH : ManagerType.P2_USB_RECORD; |
| | | } catch (RemoteException e) { |
| | | Timber.e(e, "startMedia forward to P2 failed"); |
| | | notifyCallback(1, -3, "启动P2服务失败: " + e.getMessage()); |
| | |
| | | } else { |
| | | // 等待连接完成后执行 |
| | | pendingP2StartMedia = media; |
| | | currentManagerType = media.isPush() ? ManagerType.P2_USB_PUSH : ManagerType.P2_USB_RECORD; |
| | | } |
| | | return; |
| | | } |
| | |
| | | } |
| | | |
| | | /** |
| | | * 停止当前管理器 |
| | | * 停止当前本地管理器(仅管理本进程中的 USB(P1)/Android 录像或推流) |
| | | */ |
| | | private void stopCurrentManager() { |
| | | switch (currentManagerType) { |
| | |
| | | androidCameraRecordManager.stopRecord(); |
| | | } |
| | | break; |
| | | case P2_USB_PUSH: |
| | | case P2_USB_RECORD: |
| | | if (p2Service != null) { |
| | | try { |
| | | p2Service.stopMedia(); |
| | | } catch (RemoteException e) { |
| | | Timber.e(e, "stopMedia forward to P2 failed"); |
| | | } |
| | | } else { |
| | | pendingP2StartMedia = null; |
| | | } |
| | | break; |
| | | case NONE: |
| | | break; |
| | | } |
| | |
| | | } |
| | | |
| | | /** |
| | | * 停止媒体 |
| | | * 停止媒体(通过 AIDL 调用,带 MediaArgu,用于区分 P1/P2) |
| | | */ |
| | | private void stopMedia() { |
| | | Timber.d("stopMedia called"); |
| | | stopCurrentManager(); |
| | | private void stopMedia(MediaArgu media) { |
| | | Timber.d("stopMedia called, media=%s", media); |
| | | if (media != null && media.isUsedOutCamera() && media.getUsbCameraId() == 2) { |
| | | // P2 USB 摄像头由 P2UsbCameraVideoService 管理 |
| | | ensureP2Bound(); |
| | | if (p2Service != null) { |
| | | try { |
| | | p2Service.stopMedia(media); |
| | | } catch (RemoteException e) { |
| | | Timber.e(e, "stopMedia forward to P2 failed"); |
| | | } |
| | | } else { |
| | | pendingP2StartMedia = null; |
| | | } |
| | | } else { |
| | | // 其他情况(包括 P1 USB 与 Android 相机)由本 Service 自己管理 |
| | | stopCurrentManager(); |
| | | } |
| | | } |
| | | |
| | | @Override |
| | |
| | | @Override |
| | | public void onDestroy() { |
| | | super.onDestroy(); |
| | | stopMedia(); |
| | | stopCurrentManager(); |
| | | mCallbacks.kill(); |
| | | if (p2Bound) { |
| | | try { |