Dana
3 天以前 de7368d08258b80af017bc3a0ac891b314f01e36
app/src/main/java/com/safeluck/floatwindow/manager/UsbCameraPushManager.java
@@ -97,9 +97,24 @@
    }
    /**
     * 开始推流
     * 开始推流(对外接口)
     * 注意:AlivcLivePusher 必须在主线程初始化,否则会抛出
     * "Can't create handler inside thread that has not called Looper.prepare()"
     */
    public void startPush(MediaArgu media) {
        // 确保在主线程执行实际的启动逻辑
        if (Looper.myLooper() == Looper.getMainLooper()) {
            startPushInternal(media);
        } else {
            // 当前是 Binder 线程或其他后台线程,切到主线程
            mainHandler.post(() -> startPushInternal(media));
        }
    }
    /**
     * 真正的启动推流逻辑,必须在主线程调用
     */
    private void startPushInternal(MediaArgu media) {
        if (media == null) {
            notifyCallback(1, -1, "MediaArgu is null");
            return;
@@ -121,7 +136,7 @@
        }
        try {
            // 初始化推流SDK
            // 初始化推流SDK(此时已保证在主线程)
            initAlivcPusher();
            setWaterMask();
            pushStarted = false;
@@ -135,7 +150,6 @@
            cameraExists = true;
            Timber.d("USB摄像头打开成功");
            notifyCallback(1, 0, "推流线程已启动,等待推流状态就绪");
        } catch (Exception e) {
@@ -767,6 +781,13 @@
            response.setType(type);
            response.setErrCode(errCode);
            response.setMessage(message);
            // 设置 cameraId:根据 usbCameraId 区分 P1(1) 和 P2(2)
            if (mediaArgu != null) {
                int usbCameraId = mediaArgu.getUsbCameraId();
                response.setCameraId(usbCameraId == 2 ? 2 : 1); // 2 -> P2, 其他 -> P1
            } else {
                response.setCameraId(1); // 默认 P1
            }
            callback.onResult(response);
        }
    }