Android之USB读取相机图片(一)

2023-04-04  本文已影响0人  南风知我咦

参考资料

起源

Androud USB口通信基础知识了解

USB连接模式

USB传输模式

  1. 相机空闲,拉取已经拍摄好得图片。
  2. 相机工作,实时同步拉取每次拍摄得图片。
  3. 所以真个设计需要两个不同的服务,一个拉取旧照片,一个实时传输新照片,而且展示得时候新照片需要有一定有优先,或者干脆分为不同得布局展示。大概吧。

API概览

说明
UsbManager 您可以枚举连接的 USB 设备并与之通信。
UsbDevice 表示连接的 USB 设备,并包含用于访问其标识信息、接口和端点的方法。
UsbInterface 表示 USB 设备的接口,它定义设备的一组功能。设备可以具有一个或多个用于通信的接口。
UsbEndpoint 表示接口端点,是此接口的通信通道。一个接口可以具有一个或多个端点,并且通常具有用于与设备进行双向通信的输入和输出端点。
UsbDeviceConnection 表示与设备的连接,可在端点上传输数据。借助此类,您能够以同步或异步方式反复发送数据。
UsbRequest 表示通过其与设备通信的异步请求。
UsbConstants 定义与 Linux 内核的 linux/usb/ch9.h 中的定义相对应的 USB 常量。

Android manifest设置

在 XML 资源文件中,为要过滤的 USB 设备声明 <usb-device> 元素。下表介绍了 <usb-device> 的属性。一般来说,如果您想过滤某个特定设备,请使用供应商 ID 和产品 ID;如果您想过滤一组 USB 设备(例如大容量存储设备或数码相机),请使用类、子类和协议。您可以指定所有这些属性,也可以不指定任何属性。如果不指定任何属性,则会与每个 USB 设备进行匹配,因此只在应用需要时才这样做:

usb_device.xml
<resources>
    <usb-device 
        vendor-id = ""
        product-id = ""
        class = ""
        subclass = ""
        protocol = ""
        />
</resources>

将资源文件保存在 res/xml/ 目录中。资源文件名称(不含 .xml 扩展名)必须与您在 <meta-data> 元素中指定的名称相同。

   <activity
            android:exported="false"
            android:name=".usb.UsbActivity">
            <intent-filter>
                <action android:name="android.hadware.usb.action.USB_DEVICE_ATTACHED"/>
            </intent-filter>
            <meta-data android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED"
                android:resource="@xml/usb_device"/>
        </activity>

使用

发现设备

Intent 过滤器
    /**
     * 通过intent过滤器 打开的界面intent中会包含设备相关信息
     */
    private void initDevice() {
        UsbDevice device = getIntent().getParcelableExtra(UsbManager.EXTRA_DEVICE);
    }
枚举设备

    /**
     * 枚举所有的设备
     */
    private void enumDevices() {
        UsbManager manager = (UsbManager) getSystemService(Context.USB_SERVICE);

        //获取所有设备的信息,然后通过设备名称获取设备
        HashMap<String,UsbDevice> deviceHashMap = manager.getDeviceList();
        UsbDevice device = deviceHashMap.get("deviceName");
        //也可以获取迭代器 获取每个设备
        Iterator<UsbDevice> deviceIterator = deviceHashMap.values().iterator();
        while (deviceIterator.hasNext()){
            UsbDevice dev = deviceIterator.next();
        }
    }

获取与设备通信的权限

    private class PhotoPermissionReceiver extends BroadcastReceiver {

        @Override
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();
            if (TextUtils.equals(ACTION_USB_PERMISSION, action)) {
                synchronized (this) {
                    UsbDevice device = intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);
                    if (device != null) {
                        
                    } else {
                        Log.d("PhotoPermissionReceiver", "permission denied for device [" + device + "]");
                    }
                }
            }
        }
    }
    public void onCreate() {
        super.onCreate();
        usbManager = (UsbManager) getSystemService(Context.USB_SERVICE);
        permissionIntent = PendingIntent.getBroadcast(contextWeakReference.get(),REQUEST_CODE
                ,new Intent(ACTION_USB_PERMISSION),PendingIntent.FLAG_MUTABLE);

        IntentFilter intentFilter = new IntentFilter(ACTION_USB_PERMISSION);
        PhotoPermissionReceiver receiver = new PhotoPermissionReceiver();
        registerReceiver(receiver,intentFilter);

        enumDevices();
    }
    /**
     * 枚举所有的设备
     */
    private void enumDevices() {
        UsbManager manager = (UsbManager) getSystemService(Context.USB_SERVICE);

        //获取所有设备的信息,然后通过设备名称获取设备
        HashMap<String, UsbDevice> deviceHashMap = manager.getDeviceList();
        UsbDevice device = deviceHashMap.get("deviceName");
        //也可以获取迭代器 获取每个设备
        Iterator<UsbDevice> deviceIterator = deviceHashMap.values().iterator();
        while (deviceIterator.hasNext()) {
            UsbDevice dev = deviceIterator.next();
            //获取权限
            usbManager.requestPermission(dev,permissionIntent);
        }
    }

与设备通信

找到接口对象UsbInterface
获取endpoint
简历连接
            UsbInterface usbInterface = device.getInterface(0);
            UsbEndpoint endpoint = usbInterface.getEndpoint(0);
            UsbDeviceConnection connection = usbManager.openDevice(device);
            while (true){
                connection.claimInterface(usbInterface,true);
                connection.bulkTransfer(endpoint,bytes,bytes.length,timeout);
            }

这里部分还是看的迷迷糊糊,下次继续,今天就到这里了。

上一篇 下一篇

猜你喜欢

热点阅读