Dana
3 天以前 de7368d08258b80af017bc3a0ac891b314f01e36
1.录像、推流 回调,关联摄像头
2.推流 startPush主线程(P2
3.
4个文件已修改
57 ■■■■ 已修改文件
app/src/main/java/com/safeluck/floatwindow/FloatingService.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/safeluck/floatwindow/ResponseVO.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/safeluck/floatwindow/manager/UsbCameraPushManager.java 27 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/safeluck/floatwindow/manager/UsbCameraRecordManager.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/safeluck/floatwindow/FloatingService.java
@@ -198,7 +198,7 @@
    private void startMedia(MediaArgu media) {
        if (media == null) {
            Timber.w("startMedia: media is null");
            notifyCallback(1, -1, "MediaArgu is null");
            notifyCallback(1, -1, "MediaArgu is null",1);
            return;
        }
@@ -210,7 +210,7 @@
                    p2Service.startMedia(media);
                } catch (RemoteException e) {
                    Timber.e(e, "startMedia forward to P2 failed");
                    notifyCallback(1, -3, "启动P2服务失败: " + e.getMessage());
                    notifyCallback(1, -3, "启动P2服务失败: " + e.getMessage(),2);
                }
            } else {
                // 等待连接完成后执行
@@ -232,7 +232,7 @@
                usbCameraPushManager.startPush(media);
            } else {
                Timber.w("推流仅支持USB摄像头");
                notifyCallback(1, -4, "推流仅支持USB摄像头");
                notifyCallback(1, -4, "推流仅支持USB摄像头",1);
            }
        } else {
            // 录像
@@ -353,10 +353,12 @@
     * @param type 类型:0-录像 1-推流 2-文件名类型等
     * @param errCode 错误码:0-成功,其他为错误码
     * @param message 消息内容
     * @param cameraId 0-android camera 1-P1 usb 2-P2 usb
     */
    private void notifyCallback(int type, int errCode, String message) {
    private void notifyCallback(int type, int errCode, String message,int cameraId) {
        ResponseVO response = new ResponseVO();
        response.setType(type);
        response.setCameraId(cameraId);
        response.setErrCode(errCode);
        response.setMessage(message);
        notifyCallback(response);
app/src/main/java/com/safeluck/floatwindow/ResponseVO.java
@@ -11,6 +11,8 @@
 */
public class ResponseVO implements Parcelable {
    private int type;//0-luxiang 1-推流 2-文件名类型(在message里面就是文件名)
    private int cameraId;// @param cameraId 0-内置摄像头(android camera) 1-P1 2-P2
    private String message;//提示信息
    private int errCode;//0-成功(正在推流或正在录像)   1,没有外置sd卡 2.长时间断网 3.短时间断网和网络切换 4.推流结束、或录像结束 -1usbCamera打不开,6-usbCamera实际使用的分辨率(包含在message) 7Dev(本机摄像)分辨率 8.录像时长  5-录像片段结束  err:-3 msg:SystemError
@@ -30,6 +32,14 @@
        this.type = type;
    }
    public int getCameraId() {
        return cameraId;
    }
    public void setCameraId(int cameraId) {
        this.cameraId = cameraId;
    }
    public String getMessage() {
        return message;
    }
@@ -46,6 +56,7 @@
    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeInt(this.type);
        dest.writeInt(this.cameraId);
        dest.writeString(this.message);
        dest.writeInt(this.errCode);
    }
@@ -55,6 +66,7 @@
    protected ResponseVO(Parcel in) {
        this.type = in.readInt();
        this.cameraId = in.readInt();
        this.message = in.readString();
        this.errCode = in.readInt();
    }
@@ -75,6 +87,7 @@
    public String toString() {
        return "ResponseVO{" +
                "type=" + type +
                "cameraId=" + cameraId +
                ", message='" + message + '\'' +
                ", errCode=" + errCode +
                '}';
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);
        }
    }
app/src/main/java/com/safeluck/floatwindow/manager/UsbCameraRecordManager.java
@@ -1011,6 +1011,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);
        }
    }