Remove '@override' annotation解决方法

本文介绍了如何解决在Java开发过程中遇到的@override注解导致的编译错误问题,并提供了具体的解决方案,包括更新JDK版本及调整IDE配置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

把之前开发过的代码拿出来重新运行下,编译总是@override报错,把@override去掉就好了,但不能从根本上解决问题,因为有时候有@override的地方超级多。

这是jdk本身的问题,@Override是JDK5就已经有了,但是不支持对接口的实现,也就是说使用@Override的时候其父类必须是一个类,而不能是接口,否则会报错。JDK6修正了这个Bug,无论是对父类的方法覆盖还是对接口的实现都可以加上@Override。

要解决该问题,首先要确保机器上安装了jdk 1.6以上版本,然后,选择MyEclipse/Eclipse菜单Windows->Preferences–>java->Compiler–>compiler compliance level选择 1.6,刷新工程,重新编译。

如果问题还没解决,就在报错的工程上,鼠标右键选择 Properties–>Java Compiler–>compiler compliance level 中选择 1.6,刷新工程,重新编译。

private static final AnnotationMatcher AUTOWIRED_ANNOTATION_MATCHER = new AnnotationMatcher("@org.springframework.beans.factory.annotation.Autowired(true)"); @Override public String getDisplayName() { return "Remove the `@Autowired` annotation on inferred constructor"; } @Override public String getDescription() { return "Spring can infer an autowired constructor when there is a single constructor on the bean. " + "This recipe removes unneeded `@Autowired` annotations on constructors."; } @Override public TreeVisitor<?, ExecutionContext> getVisitor() { return Preconditions.check(new UsesType<>("org.springframework.beans.factory.annotation.Autowired", false), new JavaIsoVisitor<ExecutionContext>() { @Override public J.ClassDeclaration visitClassDeclaration(J.ClassDeclaration classDecl, ExecutionContext ctx) { J.ClassDeclaration cd = super.visitClassDeclaration(classDecl, ctx); int constructorCount = 0; for (Statement s : cd.getBody().getStatements()) { if (isConstructor(s)) { constructorCount++; if (constructorCount > 1) { return cd; } } } // Lombok can also provide a constructor, so keep `@Autowired` on constructors if found if (!FindAnnotations.find(cd, "@lombok.*Constructor").isEmpty()) { return cd; } // `@ConfigurationProperties` classes usually use field injection, so keep `@Autowired` on constructors if (!FindAnnotations.find(cd, "@org.springframework.boot.context.properties.ConfigurationProperties").isEmpty()) { return cd; } return cd.withBody(cd.getBody().withStatements( ListUtils.map(cd.getBody().getStatements(), s -> { if (!isConstructor(s)) { return s; } maybeRemoveImport("org.springframework.beans.factory.annotation.Autowired"); return (Statement) new RemoveAnnotationVisitor(AUTOWIRED_ANNOTATION_MATCHER).visit(s, ctx, getCursor()); }) )); } }); } 同理推断写法判断当前类中是否被包含 @Autowired 方式注入的字段
最新发布
07-05
package com.example.test360; import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import android.Manifest; import android.hardware.usb.UsbDevice; import android.os.Bundle; import android.os.ConditionVariable; import android.os.Handler; import android.os.HandlerThread; import android.util.Log; import android.view.SurfaceHolder; import android.widget.TextView; import com.herohan.uvcapp.CameraHelper; import com.herohan.uvcapp.ICameraHelper; import com.hjq.permissions.XXPermissions; import com.serenegiant.usb.Size; import com.serenegiant.usb.UVCCamera; import com.serenegiant.usb.UVCParam; import com.serenegiant.widget.AspectRatioSurfaceView; import java.util.ArrayList; import java.util.List; import java.util.concurrent.ConcurrentLinkedQueue; public class MainActivity extends AppCompatActivity { private static final boolean DEBUG = true; private static final String TAG = MainActivity.class.getSimpleName(); private static final int DEFAULT_WIDTH = 320; private static final int DEFAULT_HEIGHT = 240; private TextView mCameraNameLeft,mCameraNameRight, mCameraNameCenter; private UsbDevice mUsbDeviceLeft,mUsbDeviceRight, mUsbDeviceCenter; private ICameraHelper mCameraHelperLeft, mCameraHelperRight, mCameraHelperCenter; private AspectRatioSurfaceView svCameraViewLeft, svCameraViewRight, svCameraViewCenter; private ConcurrentLinkedQueue<UsbDevice> mReadyUsbDeviceList = new ConcurrentLinkedQueue<>(); private ConditionVariable mReadyDeviceConditionVariable = new ConditionVariable(); private final Object mSync = new Object(); private HandlerThread mHandlerThread; private Handler mAsyncHandler; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //setTitle(R.string.entry_multi_camera_new); if (DEBUG) Log.d(TAG, "huahua--onCreate:"); mCameraNameLeft = findViewById(R.id.textViewLeft); mCameraNameRight = findViewById(R.id.textViewRight); mCameraNameCenter = findViewById(R.id.textViewCenter); List<String> needPermissions = new ArrayList<>(); initViews(); mHandlerThread = new HandlerThread(TAG); mHandlerThread.start(); mAsyncHandler = new Handler(mHandlerThread.getLooper()); initCameraHelper(); needPermissions.add(Manifest.permission.CAMERA); XXPermissions.with(this) .permission(needPermissions) .request((permissions, all) -> { if (!all) { return; } initViews(); mHandlerThread = new HandlerThread(TAG); mHandlerThread.start(); mAsyncHandler = new Handler(mHandlerThread.getLooper()); initCameraHelper(); }); } @Override protected void onDestroy() { super.onDestroy(); mHandlerThread.quitSafely(); mAsyncHandler.removeCallbacksAndMessages(null); } private void initViews() { setCameraViewLeft(); setCameraViewRight(); setCameraViewCenter(); } private void setCameraViewLeft() { svCameraViewLeft = findViewById(R.id.svCameraViewLeft); svCameraViewLeft.setAspectRatio(DEFAULT_WIDTH, DEFAULT_HEIGHT); svCameraViewLeft.getHolder().addCallback(new SurfaceHolder.Callback() { @Override public void surfaceCreated(@NonNull SurfaceHolder holder) { if (mCameraHelperLeft != null) { mCameraHelperLeft.addSurface(holder.getSurface(), false); } } @Override public void surfaceChanged(@NonNull SurfaceHolder holder, int format, int width, int height) { } @Override public void surfaceDestroyed(@NonNull SurfaceHolder holder) { if (mCameraHelperLeft != null) { mCameraHelperLeft.removeSurface(holder.getSurface()); } } }); } private void setCameraViewRight() { svCameraViewRight = findViewById(R.id.svCameraViewRight); svCameraViewRight.setAspectRatio(DEFAULT_WIDTH, DEFAULT_HEIGHT); svCameraViewRight.getHolder().addCallback(new SurfaceHolder.Callback() { @Override public void surfaceCreated(@NonNull SurfaceHolder holder) { if (mCameraHelperRight != null) { mCameraHelperRight.addSurface(holder.getSurface(), false); } } @Override public void surfaceChanged(@NonNull SurfaceHolder holder, int format, int width, int height) { } @Override public void surfaceDestroyed(@NonNull SurfaceHolder holder) { if (mCameraHelperRight != null) { mCameraHelperRight.removeSurface(holder.getSurface()); } } }); } private void setCameraViewCenter() { svCameraViewCenter = findViewById(R.id.svCameraViewCenter); svCameraViewCenter.setAspectRatio(DEFAULT_WIDTH, DEFAULT_HEIGHT); svCameraViewCenter.getHolder().addCallback(new SurfaceHolder.Callback() { @Override public void surfaceCreated(@NonNull SurfaceHolder holder) { if (mCameraHelperCenter != null) { mCameraHelperCenter.addSurface(holder.getSurface(), false); } } @Override public void surfaceChanged(@NonNull SurfaceHolder holder, int format, int width, int height) { } @Override public void surfaceDestroyed(@NonNull SurfaceHolder holder) { if (mCameraHelperCenter != null) { mCameraHelperCenter.removeSurface(holder.getSurface()); } } }); } @Override protected void onStart() { if (DEBUG) Log.d(TAG, "huahua--onStart:"); super.onStart(); } @Override protected void onStop() { if (DEBUG) Log.d(TAG, "onStop:"); super.onStop(); clearCameraHelper(); } public void initCameraHelper() { if (DEBUG) Log.d(TAG, "initCameraHelper:"); if (mCameraHelperLeft == null) { mCameraHelperLeft = new CameraHelper(); mCameraHelperLeft.setStateCallback(mStateListenerLeft); } if (mCameraHelperRight == null) { mCameraHelperRight = new CameraHelper(); mCameraHelperRight.setStateCallback(mStateListenerRight); } if (mCameraHelperCenter == null) { mCameraHelperCenter = new CameraHelper(); mCameraHelperCenter.setStateCallback(mStateListenerCenter); } } private void clearCameraHelper() { if (DEBUG) Log.d(TAG, "clearCameraHelper:"); if (mCameraHelperLeft != null) { mCameraHelperLeft.release(); mCameraHelperLeft = null; } if (mCameraHelperRight != null) { mCameraHelperRight.release(); mCameraHelperRight = null; } if (mCameraHelperCenter != null) { mCameraHelperCenter.release(); mCameraHelperCenter = null; } } private void selectDeviceLeft(final UsbDevice device) { if (DEBUG) Log.v(TAG, "selectDeviceLeft:device=" + device.getDeviceName()); mUsbDeviceLeft = device; mAsyncHandler.post(() -> { waitCanSelectDevice(device); if (mCameraHelperLeft != null) { mCameraHelperLeft.selectDevice(device); } }); } private void selectDeviceRight(final UsbDevice device) { if (DEBUG) Log.v(TAG, "selectDeviceRight:device=" + device.getDeviceName()); mUsbDeviceRight = device; mAsyncHandler.post(() -> { waitCanSelectDevice(device); if (mCameraHelperRight != null) { mCameraHelperRight.selectDevice(device); } }); } private void selectDeviceCenter(final UsbDevice device) { if (DEBUG) Log.v(TAG, "selectDeviceCenter:device=" + device.getDeviceName()); mUsbDeviceCenter = device; mAsyncHandler.post(() -> { waitCanSelectDevice(device); if (mCameraHelperCenter != null) { mCameraHelperCenter.selectDevice(device); } }); } /** * wait for only one camera need request permission * * @param device */ private void waitCanSelectDevice(UsbDevice device) { mReadyUsbDeviceList.add(device); while (mReadyUsbDeviceList.size() > 1) { mReadyDeviceConditionVariable.block(); mReadyDeviceConditionVariable.close(); } } /** * remove ready camera that wait for select * * @param device */ private void removeSelectedDevice(UsbDevice device) { mReadyUsbDeviceList.remove(device); mReadyDeviceConditionVariable.open(); } private final ICameraHelper.StateCallback mStateListenerLeft = new ICameraHelper.StateCallback() { private final String LOG_PREFIX = "ListenerLeft#"; @Override public void onAttach(UsbDevice device) { if (DEBUG) Log.v(TAG, LOG_PREFIX + "onAttach:"); synchronized (mSync) { if (mUsbDeviceLeft == null && !device.equals(mUsbDeviceRight) && !device.equals(mUsbDeviceCenter)) { selectDeviceLeft(device); mCameraNameLeft.setText("左相机("+device.getDeviceName()+")"); } } } @Override public void onDeviceOpen(UsbDevice device, boolean isFirstOpen) { if (DEBUG) Log.v(TAG, LOG_PREFIX + "onDeviceOpen:"); if (mCameraHelperLeft != null && device.equals(mUsbDeviceLeft)) { UVCParam param = new UVCParam(); // param.setQuirks(UVCCamera.PIXEL_FORMAT_NV12); param.setPreviewSize(new Size(DEFAULT_HEIGHT, 320, 240, 30, null)); mCameraHelperLeft.openCamera(param); } removeSelectedDevice(device); } @Override public void onCameraOpen(UsbDevice device) { if (DEBUG) Log.v(TAG, LOG_PREFIX + "onCameraOpen:"); if (mCameraHelperLeft != null && device.equals(mUsbDeviceLeft)) { mCameraHelperLeft.stopRecording(); mCameraHelperLeft.startPreview(); Size size = mCameraHelperLeft.getPreviewSize(); if (size != null) { int width = size.width; int height = size.height; //auto aspect ratio svCameraViewLeft.setAspectRatio(width, height); } mCameraHelperLeft.addSurface(svCameraViewLeft.getHolder().getSurface(), false); } } @Override public void onCameraClose(UsbDevice device) { if (DEBUG) Log.v(TAG, LOG_PREFIX + "onCameraClose:"); if (device.equals(mUsbDeviceLeft)) { if (mCameraHelperLeft != null) { mCameraHelperLeft.removeSurface(svCameraViewLeft.getHolder().getSurface()); } } } @Override public void onDeviceClose(UsbDevice device) { if (DEBUG) Log.v(TAG, LOG_PREFIX + "onDeviceClose:"); } @Override public void onDetach(UsbDevice device) { if (DEBUG) Log.v(TAG, LOG_PREFIX + "onDetach:"); if (device.equals(mUsbDeviceLeft)) { // mUsbDeviceLeft = null; } removeSelectedDevice(device); } @Override public void onCancel(UsbDevice device) { if (DEBUG) Log.v(TAG, LOG_PREFIX + "onCancel:"); if (device.equals(mUsbDeviceLeft)) { // mUsbDeviceLeft = null; } removeSelectedDevice(device); } }; private final ICameraHelper.StateCallback mStateListenerRight = new ICameraHelper.StateCallback() { private final String LOG_PREFIX = "ListenerRight#"; @Override public void onAttach(UsbDevice device) { if (DEBUG) Log.v(TAG, LOG_PREFIX + "onAttach:"); synchronized (mSync) { if (mUsbDeviceRight == null && !device.equals(mUsbDeviceLeft) && !device.equals(mUsbDeviceCenter)) { selectDeviceRight(device); mCameraNameRight.setText("右相机("+device.getDeviceName()+")"); } } } @Override public void onDeviceOpen(UsbDevice device, boolean isFirstOpen) { if (DEBUG) Log.v(TAG, LOG_PREFIX + "onDeviceOpen:"); if (mCameraHelperRight != null && device.equals(mUsbDeviceRight)) { UVCParam param = new UVCParam(); // param.setQuirks(UVCCamera.PIXEL_FORMAT_NV12); param.setPreviewSize(new Size(5, 320, 240, 30, null)); mCameraHelperRight.openCamera(param); } removeSelectedDevice(device); } @Override public void onCameraOpen(UsbDevice device) { if (DEBUG) Log.v(TAG, LOG_PREFIX + "onCameraOpen:"); if (mCameraHelperRight != null && device.equals(mUsbDeviceRight)) { mCameraHelperRight.startPreview(); Size size = mCameraHelperRight.getPreviewSize(); if (size != null) { int width = size.width; int height = size.height; //auto aspect ratio svCameraViewRight.setAspectRatio(width, height); } mCameraHelperRight.addSurface(svCameraViewRight.getHolder().getSurface(), false); } } @Override public void onCameraClose(UsbDevice device) { if (DEBUG) Log.v(TAG, LOG_PREFIX + "onCameraClose:"); if (device.equals(mUsbDeviceRight)) { if (mCameraHelperRight != null) { mCameraHelperRight.removeSurface(svCameraViewRight.getHolder().getSurface()); } } } @Override public void onDeviceClose(UsbDevice device) { if (DEBUG) Log.v(TAG, LOG_PREFIX + "onDeviceClose:"); } @Override public void onDetach(UsbDevice device) { if (DEBUG) Log.v(TAG, LOG_PREFIX + "onDetach:"); if (device.equals(mUsbDeviceRight)) { // mUsbDeviceRight = null; } removeSelectedDevice(device); } @Override public void onCancel(UsbDevice device) { if (DEBUG) Log.v(TAG, LOG_PREFIX + "onCancel:"); if (device.equals(mUsbDeviceRight)) { // mUsbDeviceRight = null; } removeSelectedDevice(device); } }; private final ICameraHelper.StateCallback mStateListenerCenter = new ICameraHelper.StateCallback() { private final String LOG_PREFIX = "ListenerCenter#"; @Override public void onAttach(UsbDevice device) { if (DEBUG) Log.v(TAG, LOG_PREFIX + "onAttach:"); synchronized (mSync) { if (mUsbDeviceCenter == null && !device.equals(mUsbDeviceRight) && !device.equals(mUsbDeviceLeft)) { selectDeviceCenter(device); mCameraNameCenter.setText("中间相机("+device.getDeviceName()+")"); } } } @Override public void onDeviceOpen(UsbDevice device, boolean isFirstOpen) { if (DEBUG) Log.v(TAG, LOG_PREFIX + "onDeviceOpen:"); if (mCameraHelperCenter != null && device.equals(mUsbDeviceCenter)) { UVCParam param = new UVCParam(); // param.setQuirks(UVCCamera.PIXEL_FORMAT_NV12); param.setPreviewSize(new Size(5, 320, 240, 30, null)); mCameraHelperCenter.openCamera(param); } removeSelectedDevice(device); } @Override public void onCameraOpen(UsbDevice device) { if (DEBUG) Log.v(TAG, LOG_PREFIX + "onCameraOpen:"); if (mCameraHelperCenter != null && device.equals(mUsbDeviceCenter)) { mCameraHelperCenter.startPreview(); Size size = mCameraHelperCenter.getPreviewSize(); if (size != null) { int width = size.width; int height = size.height; //auto aspect ratio svCameraViewCenter.setAspectRatio(width, height); } mCameraHelperCenter.addSurface(svCameraViewCenter.getHolder().getSurface(), false); } } @Override public void onCameraClose(UsbDevice device) { if (DEBUG) Log.v(TAG, LOG_PREFIX + "onCameraClose:"); if (device.equals(mUsbDeviceCenter)) { if (mCameraHelperCenter != null) { mCameraHelperCenter.removeSurface(svCameraViewCenter.getHolder().getSurface()); } } } @Override public void onDeviceClose(UsbDevice device) { if (DEBUG) Log.v(TAG, LOG_PREFIX + "onDeviceClose:"); } @Override public void onDetach(UsbDevice device) { if (DEBUG) Log.v(TAG, LOG_PREFIX + "onDetach:"); if (device.equals(mUsbDeviceCenter)) { // mUsbDeviceCenter = null; } removeSelectedDevice(device); } @Override public void onCancel(UsbDevice device) { if (DEBUG) Log.v(TAG, LOG_PREFIX + "onCancel:"); if (device.equals(mUsbDeviceCenter)) { // mUsbDeviceCenter = null; } removeSelectedDevice(device); } }; } 请分析我的代码我的摄像头回传的画面存储再那写变量种
07-04
现在有三个相同的摄像头要调用但是我之前的代码在调用时只调用第一个,其他的显示已占用,请运用你的知识帮我解决 package com.example.test360; import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import android.Manifest; import android.content.Context; import android.content.Intent; import android.hardware.usb.UsbDevice; import android.hardware.usb.UsbDeviceConnection; import android.hardware.usb.UsbManager; import android.os.Bundle; import android.os.ConditionVariable; import android.os.Handler; import android.os.HandlerThread; import android.util.Log; import android.view.SurfaceHolder; import android.widget.TextView; import com.herohan.uvcapp.CameraHelper; import com.herohan.uvcapp.ICameraHelper; import com.hjq.permissions.XXPermissions; import com.serenegiant.usb.Size; import com.serenegiant.usb.UVCCamera; import com.serenegiant.usb.UVCParam; import com.serenegiant.widget.AspectRatioSurfaceView; import java.util.ArrayList; import java.util.List; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentLinkedQueue; public class MainActivity extends AppCompatActivity { private static final boolean DEBUG = true; private static final String TAG = MainActivity.class.getSimpleName(); private static final int DEFAULT_WIDTH = 640; private static final int DEFAULT_HEIGHT = 480; private TextView mCameraNameLeft,mCameraNameRight, mCameraNameCenter; private UsbDevice mUsbDeviceLeft,mUsbDeviceRight, mUsbDeviceCenter; private ICameraHelper mCameraHelperLeft, mCameraHelperRight, mCameraHelperCenter; private AspectRatioSurfaceView svCameraViewLeft, svCameraViewRight, svCameraViewCenter; private ConcurrentLinkedQueue<UsbDevice> mReadyUsbDeviceList = new ConcurrentLinkedQueue<>(); private ConditionVariable mReadyDeviceConditionVariable = new ConditionVariable(); private final Object mSync = new Object(); private HandlerThread mHandlerThread; private Handler mAsyncHandler; private final ConcurrentHashMap<UsbDevice, String> mDeviceSerials = new ConcurrentHashMap<>(); // 存储各摄像头当前使用的序列号 private final String[] mAssignedSerials = new String[3]; // 0:Left, 1:Right, 2:Center @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //setTitle(R.string.entry_multi_camera_new); if (DEBUG) Log.d(TAG, "huahua--onCreate:"); mCameraNameLeft = findViewById(R.id.textViewLeft); mCameraNameRight = findViewById(R.id.textViewRight); mCameraNameCenter = findViewById(R.id.textViewCenter); List<String> needPermissions = new ArrayList<>(); needPermissions.add(Manifest.permission.CAMERA); XXPermissions.with(this) .permission(needPermissions) .request((permissions, all) -> { if (!all) { return; } initViews(); mHandlerThread = new HandlerThread(TAG); mHandlerThread.start(); mAsyncHandler = new Handler(mHandlerThread.getLooper()); initCameraHelper(); }); } private void getDeviceSerialAsync(UsbDevice device, SerialNumberCallback callback) { new Thread(() -> { UsbManager usbManager = (UsbManager) getSystemService(Context.USB_SERVICE); String serial = null; UsbDeviceConnection connection = null; try { connection = usbManager.openDevice(device); if (connection != null) { serial = connection.getSerial(); if (serial == null) { serial = "path_" + device.getDeviceName().hashCode(); } } } catch (Exception e) { Log.e(TAG, "获取序列号失败", e); } finally { if (connection != null) { connection.close(); // 手动关闭连接 } } final String finalSerial = serial; runOnUiThread(() -> callback.onSerialNumberReceived(device, finalSerial)); }).start(); } @Override protected void onDestroy() { super.onDestroy(); mHandlerThread.quitSafely(); mAsyncHandler.removeCallbacksAndMessages(null); } private void setCameraViewLeft() { svCameraViewLeft = findViewById(R.id.svCameraViewLeft); svCameraViewLeft.setAspectRatio(DEFAULT_WIDTH, DEFAULT_HEIGHT); svCameraViewLeft.getHolder().addCallback(new SurfaceHolder.Callback() { @Override public void surfaceCreated(@NonNull SurfaceHolder holder) { if (mCameraHelperLeft != null) { mCameraHelperLeft.addSurface(holder.getSurface(), false); } } @Override public void surfaceChanged(@NonNull SurfaceHolder holder, int format, int width, int height) { } @Override public void surfaceDestroyed(@NonNull SurfaceHolder holder) { if (mCameraHelperLeft != null) { mCameraHelperLeft.removeSurface(holder.getSurface()); } } }); } private void initViews() { setCameraViewLeft(); setCameraViewRight(); setCameraViewCenter(); } private void setCameraViewRight() { svCameraViewRight = findViewById(R.id.svCameraViewRight); svCameraViewRight.setAspectRatio(DEFAULT_WIDTH, DEFAULT_HEIGHT); svCameraViewRight.getHolder().addCallback(new SurfaceHolder.Callback() { @Override public void surfaceCreated(@NonNull SurfaceHolder holder) { if (mCameraHelperRight != null) { mCameraHelperRight.addSurface(holder.getSurface(), false); } } @Override public void surfaceChanged(@NonNull SurfaceHolder holder, int format, int width, int height) { } @Override public void surfaceDestroyed(@NonNull SurfaceHolder holder) { if (mCameraHelperRight != null) { mCameraHelperRight.removeSurface(holder.getSurface()); } } }); } private void setCameraViewCenter() { svCameraViewCenter = findViewById(R.id.svCameraViewCenter); svCameraViewCenter.setAspectRatio(DEFAULT_WIDTH, DEFAULT_HEIGHT); svCameraViewCenter.getHolder().addCallback(new SurfaceHolder.Callback() { @Override public void surfaceCreated(@NonNull SurfaceHolder holder) { if (mCameraHelperCenter != null) { mCameraHelperCenter.addSurface(holder.getSurface(), false); } } @Override public void surfaceChanged(@NonNull SurfaceHolder holder, int format, int width, int height) { } @Override public void surfaceDestroyed(@NonNull SurfaceHolder holder) { if (mCameraHelperCenter != null) { mCameraHelperCenter.removeSurface(holder.getSurface()); } } }); } @Override protected void onStart() { if (DEBUG) Log.d(TAG, "huahua--onStart:"); super.onStart(); } @Override protected void onStop() { if (DEBUG) Log.d(TAG, "onStop:"); super.onStop(); clearCameraHelper(); } public void initCameraHelper() { if (DEBUG) Log.d(TAG, "initCameraHelper:"); if (mCameraHelperLeft == null) { mCameraHelperLeft = new CameraHelper(); mCameraHelperLeft.setStateCallback(mStateListenerLeft); } if (mCameraHelperRight == null) { mCameraHelperRight = new CameraHelper(); mCameraHelperRight.setStateCallback(mStateListenerRight); } if (mCameraHelperCenter == null) { mCameraHelperCenter = new CameraHelper(); mCameraHelperCenter.setStateCallback(mStateListenerCenter); } } private void clearCameraHelper() { if (DEBUG) Log.d(TAG, "clearCameraHelper:"); if (mCameraHelperLeft != null) { mCameraHelperLeft.release(); mCameraHelperLeft = null; } if (mCameraHelperRight != null) { mCameraHelperRight.release(); mCameraHelperRight = null; } if (mCameraHelperCenter != null) { mCameraHelperCenter.release(); mCameraHelperCenter = null; } } private void selectDeviceLeft(final UsbDevice device) { if (DEBUG) Log.v(TAG, "selectDeviceLeft:device=" + device.getDeviceName()); mUsbDeviceLeft = device; mAsyncHandler.post(() -> { waitCanSelectDevice(device); if (mCameraHelperLeft != null) { mCameraHelperLeft.selectDevice(device); } }); } private void selectDeviceRight(final UsbDevice device) { if (DEBUG) Log.v(TAG, "selectDeviceRight:device=" + device.getDeviceName()); mUsbDeviceRight = device; mAsyncHandler.post(() -> { waitCanSelectDevice(device); if (mCameraHelperRight != null) { mCameraHelperRight.selectDevice(device); } }); } private void selectDeviceCenter(final UsbDevice device) { if (DEBUG) Log.v(TAG, "selectDeviceCenter:device=" + device.getDeviceName()); mUsbDeviceCenter = device; mAsyncHandler.post(() -> { waitCanSelectDevice(device); if (mCameraHelperCenter != null) { mCameraHelperCenter.selectDevice(device); } }); } /** * wait for only one camera need request permission * * @param device */ private void waitCanSelectDevice(UsbDevice device) { mReadyUsbDeviceList.add(device); while (mReadyUsbDeviceList.size() > 1) { mReadyDeviceConditionVariable.block(); mReadyDeviceConditionVariable.close(); } } /** * remove ready camera that wait for select * * @param device */ private void removeSelectedDevice(UsbDevice device) { mReadyUsbDeviceList.remove(device); mReadyDeviceConditionVariable.open(); } private final ICameraHelper.StateCallback mStateListenerLeft = new ICameraHelper.StateCallback() { private final String LOG_PREFIX = "ListenerLeft#"; @Override public void onAttach(UsbDevice device) { getDeviceSerialAsync(device, (usbDevice, serial) -> { synchronized (mSync) { // 检查是否已被占用 for (String assigned : mAssignedSerials) { if (serial.equals(assigned)) { Log.w(TAG, "设备已被占用: " + serial); return; } } // 分配给第一个可用位置 if (mUsbDeviceLeft == null) { assignCamera(0, usbDevice, serial, "左相机"); } else if (mUsbDeviceRight == null) { assignCamera(1, usbDevice, serial, "右相机"); } else if (mUsbDeviceCenter == null) { assignCamera(2, usbDevice, serial, "中相机"); } } }); } private void assignCamera(int position, UsbDevice device, String serial, String prefix) { switch (position) { case 0: mUsbDeviceLeft = device; mCameraHelperLeft.selectDevice(device); break; case 1: mUsbDeviceRight = device; mCameraHelperRight.selectDevice(device); break; case 2: mUsbDeviceCenter = device; mCameraHelperCenter.selectDevice(device); break; } mDeviceSerials.put(device, serial); mAssignedSerials[position] = serial; // 更新UI TextView targetView = position == 0 ? mCameraNameLeft : position == 1 ? mCameraNameRight : mCameraNameCenter; // targetView.setText(prefix + "-" + shortSerial(serial)); } @Override public void onDeviceOpen(UsbDevice device, boolean isFirstOpen) { if (DEBUG) Log.v(TAG, LOG_PREFIX + "onDeviceOpen:"); if (mCameraHelperLeft != null && device.equals(mUsbDeviceLeft)) { UVCParam param = new UVCParam(); param.setQuirks(UVCCamera.UVC_QUIRK_FIX_BANDWIDTH); mCameraHelperLeft.openCamera(param); } removeSelectedDevice(device); } @Override public void onCameraOpen(UsbDevice device) { if (DEBUG) Log.v(TAG, LOG_PREFIX + "onCameraOpen:"); if (mCameraHelperLeft != null && device.equals(mUsbDeviceLeft)) { mCameraHelperLeft.startPreview(); Size size = mCameraHelperLeft.getPreviewSize(); if (size != null) { int width = size.width; int height = size.height; //auto aspect ratio svCameraViewLeft.setAspectRatio(width, height); } mCameraHelperLeft.addSurface(svCameraViewLeft.getHolder().getSurface(), false); } } @Override public void onCameraClose(UsbDevice device) { if (DEBUG) Log.v(TAG, LOG_PREFIX + "onCameraClose:"); if (device.equals(mUsbDeviceLeft)) { if (mCameraHelperLeft != null) { mCameraHelperLeft.removeSurface(svCameraViewLeft.getHolder().getSurface()); } } } @Override public void onDeviceClose(UsbDevice device) { if (DEBUG) Log.v(TAG, LOG_PREFIX + "onDeviceClose:"); } @Override public void onDetach(UsbDevice device) { if (DEBUG) Log.v(TAG, LOG_PREFIX + "onDetach:"); if (device.equals(mUsbDeviceLeft)) { mUsbDeviceLeft = null; } removeSelectedDevice(device); } @Override public void onCancel(UsbDevice device) { if (DEBUG) Log.v(TAG, LOG_PREFIX + "onCancel:"); if (device.equals(mUsbDeviceLeft)) { mUsbDeviceLeft = null; } removeSelectedDevice(device); } }; private final ICameraHelper.StateCallback mStateListenerRight = new ICameraHelper.StateCallback() { private final String LOG_PREFIX = "ListenerRight#"; @Override public void onAttach(UsbDevice device) { if (DEBUG) Log.v(TAG, LOG_PREFIX + "onAttach:"); synchronized (mSync) { // 获取设备物理路径(如 "/dev/bus/usb/001/002") String devicePath = device.getDeviceName(); // 检查是否已被其他摄像头占用 boolean isUsedByOthers = (mUsbDeviceLeft != null && mUsbDeviceLeft.getDeviceName().equals(devicePath)) || (mUsbDeviceCenter != null && mUsbDeviceCenter.getDeviceName().equals(devicePath)); if (mUsbDeviceRight == null && !isUsedByOthers) { selectDeviceRight(device); mCameraNameRight.setText("右相机(" + devicePath + ")"); // 显示物理路径 } } } @Override public void onDeviceOpen(UsbDevice device, boolean isFirstOpen) { if (DEBUG) Log.v(TAG, LOG_PREFIX + "onDeviceOpen:"); if (mCameraHelperRight != null && device.equals(mUsbDeviceRight)) { UVCParam param = new UVCParam(); param.setQuirks(UVCCamera.UVC_QUIRK_FIX_BANDWIDTH); mCameraHelperRight.openCamera(param); } removeSelectedDevice(device); } @Override public void onCameraOpen(UsbDevice device) { if (DEBUG) Log.v(TAG, LOG_PREFIX + "onCameraOpen:"); if (mCameraHelperRight != null && device.equals(mUsbDeviceRight)) { mCameraHelperRight.startPreview(); Size size = mCameraHelperRight.getPreviewSize(); if (size != null) { int width = size.width; int height = size.height; //auto aspect ratio svCameraViewRight.setAspectRatio(width, height); } mCameraHelperRight.addSurface(svCameraViewRight.getHolder().getSurface(), false); } } @Override public void onCameraClose(UsbDevice device) { if (DEBUG) Log.v(TAG, LOG_PREFIX + "onCameraClose:"); if (device.equals(mUsbDeviceRight)) { if (mCameraHelperRight != null) { mCameraHelperRight.removeSurface(svCameraViewRight.getHolder().getSurface()); } } } @Override public void onDeviceClose(UsbDevice device) { if (DEBUG) Log.v(TAG, LOG_PREFIX + "onDeviceClose:"); } @Override public void onDetach(UsbDevice device) { if (DEBUG) Log.v(TAG, LOG_PREFIX + "onDetach:"); if (device.equals(mUsbDeviceRight)) { mUsbDeviceRight = null; } removeSelectedDevice(device); } @Override public void onCancel(UsbDevice device) { if (DEBUG) Log.v(TAG, LOG_PREFIX + "onCancel:"); if (device.equals(mUsbDeviceRight)) { mUsbDeviceRight = null; } removeSelectedDevice(device); } }; private final ICameraHelper.StateCallback mStateListenerCenter = new ICameraHelper.StateCallback() { private final String LOG_PREFIX = "ListenerCenter#"; @Override public void onAttach(UsbDevice device) { if (DEBUG) Log.v(TAG, LOG_PREFIX + "onAttach:"); synchronized (mSync) { if (mUsbDeviceCenter == null && !device.equals(mUsbDeviceRight) && !device.equals(mUsbDeviceLeft)) { selectDeviceCenter(device); mCameraNameCenter.setText("中间相机("+device.getDeviceName()+")"); } } } @Override public void onDeviceOpen(UsbDevice device, boolean isFirstOpen) { if (DEBUG) Log.v(TAG, LOG_PREFIX + "onDeviceOpen:"); if (mCameraHelperCenter != null && device.equals(mUsbDeviceCenter)) { UVCParam param = new UVCParam(); param.setQuirks(UVCCamera.UVC_QUIRK_FIX_BANDWIDTH); mCameraHelperCenter.openCamera(param); } removeSelectedDevice(device); } @Override public void onCameraOpen(UsbDevice device) { if (DEBUG) Log.v(TAG, LOG_PREFIX + "onCameraOpen:"); if (mCameraHelperCenter != null && device.equals(mUsbDeviceCenter)) { mCameraHelperCenter.startPreview(); Size size = mCameraHelperCenter.getPreviewSize(); if (size != null) { int width = size.width; int height = size.height; //auto aspect ratio svCameraViewCenter.setAspectRatio(width, height); } mCameraHelperCenter.addSurface(svCameraViewCenter.getHolder().getSurface(), false); } } @Override public void onCameraClose(UsbDevice device) { if (DEBUG) Log.v(TAG, LOG_PREFIX + "onCameraClose:"); if (device.equals(mUsbDeviceCenter)) { if (mCameraHelperCenter != null) { mCameraHelperCenter.removeSurface(svCameraViewCenter.getHolder().getSurface()); } } } @Override public void onDeviceClose(UsbDevice device) { if (DEBUG) Log.v(TAG, LOG_PREFIX + "onDeviceClose:"); } @Override public void onDetach(UsbDevice device) { if (DEBUG) Log.v(TAG, LOG_PREFIX + "onDetach:"); if (device.equals(mUsbDeviceCenter)) { mUsbDeviceCenter = null; } removeSelectedDevice(device); } @Override public void onCancel(UsbDevice device) { if (DEBUG) Log.v(TAG, LOG_PREFIX + "onCancel:"); if (device.equals(mUsbDeviceCenter)) { mUsbDeviceCenter = null; } removeSelectedDevice(device); } }; }
07-03
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值