首页 > 解决方案 > 活动加载时出现 UsbManager 错误

问题描述

我目前正在学习通过电话与 Arduino 进行 USB 连接以开展项目。我正在使用开发人员文档,在遇到 UsbManager 错误后,我尝试了其他一些教程和 stackoverflow 帮助,但无济于事。我正在使用这个库在 android 和 arduino 之间进行串行通信。无法发布 logcat 导致它在我打开活动时立即清除,在闪烁一些日志后。我注意到一条蓝线,经过多次尝试后发现它指的是 UsbManager 声明行。请询问任何额外的信息...

Java 文件:

public class SerialView extends AppCompatActivity {
    UsbDeviceConnection connection;
    UsbManager usbManager = (UsbManager) this.getSystemService(android.content.Context.USB_SERVICE);
    UsbDevice devices ; BroadcastReceiver mUsbDeviceReceiver;
    HashMap<String, UsbDevice> usbDevices = usbManager.getDeviceList();
    private static final String ACTION_USB_PERMISSION = "com.android.example.USB_PERMISSION";
    UsbSerialDevice serialPort;
    private static final int targetVendorID = 2341;  //Arduino Uno
    private static final int targetProductID = 43;

    PendingIntent mPermissionIntent;

   
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_serial_view);

        TextView textView=(TextView) findViewById(R.id.streamdisplay);

        mPermissionIntent = PendingIntent.getBroadcast(this, 0, new Intent(
                ACTION_USB_PERMISSION), 0);
        IntentFilter filter = new IntentFilter(ACTION_USB_PERMISSION);
        registerReceiver(mUsbReceiver, filter);


        registerReceiver(mUsbDeviceReceiver, new IntentFilter(
                UsbManager.ACTION_USB_DEVICE_ATTACHED));
        registerReceiver(mUsbDeviceReceiver, new IntentFilter(
                UsbManager.ACTION_USB_DEVICE_DETACHED));


    }

    @Override
    protected void onDestroy() {
        releaseUsb();
        unregisterReceiver(mUsbDeviceReceiver);
        unregisterReceiver(mUsbDeviceReceiver);
        super.onDestroy();
    }


 
    private void releaseUsb() {

        Toast.makeText(SerialView.this, "releaseUsb()", Toast.LENGTH_LONG)
                .show();


        
        if (connection != null) {

            connection.close();
            connection = null;
        }

        devices = null;

    }

    public void onClickStart **onClick** (View view) {
        if (devices != null) {
            UsbManager manager = (UsbManager) getSystemService(Context.USB_SERVICE);

            Iterator<UsbDevice> deviceIterator = usbDevices.values().iterator();

            while (deviceIterator.hasNext()) {
                UsbDevice device = deviceIterator.next();

                if (device.getVendorId() == targetVendorID) {
                    if (device.getProductId() == targetProductID) {
                        devices = device;
                    }
                }
            }
        }


    }
    private final BroadcastReceiver mUsbReceiver = new BroadcastReceiver() {
              //Broadcast Receiver to automatically start and stop the Serial connection.
        @Override
        public void onReceive(Context context, Intent intent) {
            if (intent.getAction().equals(ACTION_USB_PERMISSION)) {
                boolean granted =
                        intent.getExtras().getBoolean(UsbManager.EXTRA_PERMISSION_GRANTED);
                if (granted) {
                    connection = usbManager.openDevice(devices);
                    serialPort = UsbSerialDevice.createUsbSerialDevice(devices, connection);
                    if (serialPort != null) {
                        if (serialPort.open()) { //Set Serial Connection Parameters.
                            //Enable Buttons in UI
                            serialPort.setBaudRate(9600);
                            serialPort.setDataBits(UsbSerialInterface.DATA_BITS_8);
                            serialPort.setStopBits(UsbSerialInterface.STOP_BITS_1);
                            serialPort.setParity(UsbSerialInterface.PARITY_NONE);
                            serialPort.setFlowControl(UsbSerialInterface.FLOW_CONTROL_OFF);

                            UsbSerialInterface.UsbReadCallback mCallback = new UsbSerialInterface.UsbReadCallback() {
                                //Defining a Callback which triggers whenever data is read.
                                @Override
                                public void onReceivedData(byte[] arg0) {
                                    String data = null;
                                    try {
                                        data = new String(arg0, "UTF-8");
                                        data.concat("/n");
                                        tvAppend(textView, data);
                                    } catch (UnsupportedEncodingException e) {
                                        e.printStackTrace();
                                    }
                                }
                            };
                            serialPort.read(mCallback);
                            tvAppend(textView,"Serial Connection Opened!\n");

                        } else {
                            Log.d("SERIAL", "PORT NOT OPEN");
                        }
                    } else {
                        Log.d("SERIAL", "PORT IS NULL");
                    }
                } else {
                    Log.d("SERIAL", "PERM NOT GRANTED");
                }
            } else if (intent.getAction().equals(UsbManager.ACTION_USB_DEVICE_ATTACHED)) {
                onClickStart(findViewById(R.id.startconbut));
            } else if (intent.getAction().equals(UsbManager.ACTION_USB_DEVICE_DETACHED)) {
                onClickStop(findViewById(R.id.endconbut));
            }
        };
    };

    private void tvAppend(TextView tv, CharSequence text) { final TextView ftv = tv; final CharSequence ftext = text; runOnUiThread(new Runnable() { @Override public void run() { ftv.append(ftext); } }); }
    public void onClickStop **onClick** (View view){
        serialPort.close();
    }
   
}

标签: androidandroid-studiousbserial

解决方案


推荐阅读