android usb hid通信,interface中的getendpoint这个方法返回null

zhaoshiqiang 发布于 2014/04/02 14:37
阅读 2K+
收藏 0

最近在搞一个usb的项目,通过android手机读取一个传感器的所采集的信息,usb设备可以被发现,manager,device,interface,connection这些信息也都可以打印出来,但是就是在最后获得endpoint的时候出现了问题,一调用interface这个方法中的getendpoint()就出现问题,跪求各位大侠帮忙,下面是代码

package com.example.androidusbhost;

import java.util.HashMap;

import android.app.Activity;
import android.hardware.usb.UsbDevice;
import android.hardware.usb.UsbDeviceConnection;
import android.hardware.usb.UsbEndpoint;
import android.hardware.usb.UsbInterface;
import android.hardware.usb.UsbManager;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends Activity {
    private static final String TAG="USB_HOST";
    
    private UsbManager myUsbManager;
    private UsbDevice myUsbDevice;
    private UsbInterface myInterface;
    private UsbDeviceConnection myDeviceConnection;
    
    private final int VendorID=1155;
    private final int ProductID=22336;
    
    private TextView info;
    private Button attch;
    private UsbEndpoint epOut;
    private UsbEndpoint epIn;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        info = (TextView) findViewById(R.id.info);
        attch=(Button)findViewById(R.id.attch);
        attch.setOnClickListener(new OnClickListener() {
            
            @Override
            public void onClick(View v) {
                
                // 获取UsbManager
                myUsbManager = (UsbManager) getSystemService(USB_SERVICE);
                
                enumerateDevice();

                findInterface();

                openDevice();

                assignEndpoint();
            }
        });
        
    }
    /**
     * 分配端点,IN | OUT,即输入输出;此处我直接用1为OUT端点,0为IN,当然也可以通过判断
     */
    private void assignEndpoint() {
        StringBuffer sb = new StringBuffer();
        if (myInterface.getEndpoint(1) != null) {            //就是这里出现问题,一调用getEndpoint程序就停止运行
            epOut = myInterface.getEndpoint(1);
            sb.append(epOut.toString());
            sb.append("\n");
        }
        if (myInterface.getEndpoint(0) != null) {
            epIn = myInterface.getEndpoint(0);
            sb.append(epIn.toString());
            sb.append("\n");
        }
        if (myInterface.getEndpoint(1) == null) {
            sb.append("myInterface.getEndpoint(1) == null");
            sb.append("\n");
            
        }
        if (myInterface.getEndpoint(0) == null) {
            sb.append("myInterface.getEndpoint(0) == null");
            sb.append("\n");
        }
        info.setText(sb);
        Log.d(TAG, getString(R.string.text));
    }

    /**
     * 打开设备
     */
    private void openDevice() {
        if (myInterface != null) {
            UsbDeviceConnection conn=null;
            // 在open前判断是否有连接权限;对于连接权限可以静态分配(通过过滤器即有权限),也可以动态分配权限,可以查阅相关资料
            if (myUsbManager.hasPermission(myUsbDevice)) {
                conn = myUsbManager.openDevice(myUsbDevice);
            }

            if (conn == null) {
                return;
            }

            if (conn.claimInterface(myInterface, true)) {
                myDeviceConnection = conn; // 到此你的android设备已经连上HID设备
                Log.d(TAG, "打开设备成功");
            } else {
                conn.close();
            }
        }
    }

    /**
     * 找设备接口
     */
    private void findInterface() {
        if (myUsbDevice != null) {
            Log.d(TAG, "interfaceCounts : " + myUsbDevice.getInterfaceCount());
            for (int i = 0; i < myUsbDevice.getInterfaceCount(); i++) {
                UsbInterface intf = myUsbDevice.getInterface(i);
                // 根据手上的设备做一些判断,其实这些信息都可以在枚举到设备时打印出来
//                if (intf.getInterfaceClass() == 8
//                        && intf.getInterfaceSubclass() == 6
//                        && intf.getInterfaceProtocol() == 80)
                {
                    myInterface = intf;
                    Log.d(TAG, "找到我的设备接口");
                }
                break;
            }
        }
    }

    /**
     * 枚举设备
     */
    private void enumerateDevice() {
        if (myUsbManager == null)
            return;

        HashMap<String, UsbDevice> deviceList = myUsbManager.getDeviceList();
        if (!deviceList.isEmpty()) { // deviceList不为空
            StringBuffer sb = new StringBuffer();
            for (UsbDevice device : deviceList.values()) {
                sb.append(device.toString());
                sb.append("\n");
                info.setText(sb);
                // 输出设备信息
                Log.d(TAG, "DeviceInfo: " + device.getVendorId() + " , "
                        + device.getProductId());

                // 枚举到设备
                if (device.getVendorId() == VendorID
                        && device.getProductId() == ProductID) {
                    myUsbDevice = device;
                    Log.d(TAG, "枚举设备成功");
                }
            }
        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }

    
}

加载中
0
凡争
同问,请问楼主解决了吗
0
carry-520
carry-520

你USB interface里面可能只有一个端点!所以你获取会超出

返回顶部
顶部