美文网首页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