美文网首页Android开发Android技术知识Android开发经验谈
增加属性标识摄像头的vid与pid,以便知道摄像头与设备文件的对

增加属性标识摄像头的vid与pid,以便知道摄像头与设备文件的对

作者: 爱因私谈 | 来源:发表于2018-12-28 16:42 被阅读2次

    Android 在使用多个USB摄像头时,根据加载顺序不同他们的设备文件顺序不同,比如:“video0, video1, video2”,每次启动它们的顺序都可能不同,这样APP就无法知道哪个设备文件对应的是哪个摄像头,因此下面方案增加属性来标识设备文件与摄像头vid、pid的关系,这样就解决了上面的问题。

    移植下面代码

    diff --git a/frameworks/base/services/usb/java/com/android/server/usb/UsbDeviceManager.java b/frameworks/base/serv
    index 26d5ac9..ce48b25 100755
    --- a/frameworks/base/services/usb/java/com/android/server/usb/UsbDeviceManager.java
    +++ b/frameworks/base/services/usb/java/com/android/server/usb/UsbDeviceManager.java
    @@ -61,8 +61,10 @@ import com.android.internal.os.SomeArgs;
     import com.android.internal.util.IndentingPrintWriter;
     import com.android.server.FgThread;
     
    +import java.io.BufferedReader;
     import java.io.File;
     import java.io.FileNotFoundException;
    +import java.io.FileReader;
     import java.io.IOException;
     import java.util.HashMap;
     import java.util.HashSet;
    @@ -215,15 +217,29 @@ public class UsbDeviceManager {
                 if (devPath != null && devPath.contains("/devices/platform")) {
                     if ("video4linux".equals(subSystem)) {
                         Intent intent = new Intent(Intent.ACTION_USB_CAMERA);
    +
                         String action = event.get("ACTION");
    +                    String name = event.get("DEVNAME");
    +                    String idProduct = searchAndReadFile("/sys" + devPath, "idProduct");
    +                    String idVendor = searchAndReadFile("/sys" + devPath, "idVendor");
    +
    +                    if (DEBUG) Slog.d(TAG, action + " usb camera: " + name + " [" + idVendor + ":" + idProduct + 
                         if ("remove".equals(action)){
                             Slog.d(TAG,"usb camera removed");
                             intent.setFlags(Intent.FLAG_USB_CAMERA_REMOVE);
                             SystemProperties.set("persist.sys.usbcamera.status","remove");
    +
    +                        if (!name.isEmpty()) {
    +                            SystemProperties.set("topband.dev." + name, "");
    +                        }
                         } else if ("add".equals(action)) {
                             Slog.d(TAG,"usb camera added");
                             intent.setFlags(Intent.FLAG_USB_CAMERA_ADD);
                             SystemProperties.set("persist.sys.usbcamera.status","add");
    +
    +                        if (!name.isEmpty() && !idProduct.isEmpty() && !idVendor.isEmpty()) {
    +                            SystemProperties.set("topband.dev." + name, idVendor + ":" + idProduct);
    +                        }
                         }
     
                         int num = android.hardware.Camera.getNumberOfCameras();
    @@ -244,6 +260,47 @@ public class UsbDeviceManager {
             }
         };
     
    +    private String searchAndReadFile(String devPath, String fileName) {
    +        if (null != devPath && !devPath.isEmpty()) {
    +            File dir = new File(devPath);
    +            while (null != dir && dir.exists() && dir.isDirectory()) {
    +                File file = new File(dir.getPath() + "/" + fileName);
    +                if (file.exists()) {
    +                    return readFileByLines(file.getPath());
    +                }
    +                File parent = dir.getParentFile();
    +                dir = parent;
    +            }
    +        }
    +
    +        return "";
    +    }
    +
    +    private static String readFileByLines(String fileName) {
    +        File file = new File(fileName);
    +        BufferedReader reader = null;
    +        StringBuilder builder = new StringBuilder();
    +        try {
    +            reader = new BufferedReader(new FileReader(file));
    +            String tempString;
    +            while ((tempString = reader.readLine()) != null) {
    +                builder.append(tempString);
    +            }
    +            reader.close();
    +            return builder.toString();
    +        } catch (IOException e) {
    +            Slog.e(TAG, "readFileByLines, " + e.getMessage());
    +        } finally {
    +            if (reader != null) {
    +                try {
    +                    reader.close();
    +                } catch (IOException ignored) {
    +                }
    +            }
    +        }
    +        return "";
    +    }
    +
         public UsbDeviceManager(Context context, UsbAlsaManager alsaManager,
                 UsbSettingsManager settingsManager) {
             mContext = context;
    
    

    运行

    编译运行后,读取属性如下:

    [topband.dev.video0]: [0bda:2714]
    [topband.dev.video1]: [0bda:b321]
    

    相关文章

      网友评论

        本文标题:增加属性标识摄像头的vid与pid,以便知道摄像头与设备文件的对

        本文链接:https://www.haomeiwen.com/subject/otlelqtx.html