예제 #1
0
 private void openAccessory(UsbAccessory accessory) {
   Logger.d("openAccessory  accessory:" + accessory.toString());
   ParcelFileDescriptor fd = mUsbManager.openAccessory(accessory);
   Logger.d("openAccessory  fd:" + fd);
   if (fd != null) {
     mAccessory = accessory;
     mUSBCon.start(fd, mUsbReceiveHandler);
     mRunning = true;
   } else {
     Logger.d("accessory open fail");
   }
 }
 private void openAccessory(UsbAccessory accessory) {
   mFileDescriptor = mUsbManager.openAccessory(accessory);
   if (mFileDescriptor != null) {
     mAccessory = accessory;
     FileDescriptor fd = mFileDescriptor.getFileDescriptor();
     mInputStream = new FileInputStream(fd);
     mOutputStream = new FileOutputStream(fd);
     Thread thread = new Thread(null, commRunnable, TAG);
     thread.start();
     Log.d(TAG, "accessory opened");
   } else {
     Log.d(TAG, "accessory open fail");
   }
 }
예제 #3
0
 /**
  * TODO
  *
  * @param accessory
  */
 private void openAccessory(UsbAccessory accessory) {
   mFileDescriptor = mUsbManager.openAccessory(accessory);
   if (mFileDescriptor != null) {
     mAccessory = accessory;
     FileDescriptor fd = mFileDescriptor.getFileDescriptor();
     mInputStream = new FileInputStream(fd);
     mOutputStream = new FileOutputStream(fd);
     Thread thread = new Thread(null, this, "AOATempSensor");
     thread.start();
     Log.d(TAG, "accessory opened");
     accessoryAttached(true);
   } else {
     Log.d(TAG, "accessory open fail");
   }
 }
 private void openAccessory(UsbAccessory accessory) {
   Log.d(TAG, "openAccessory");
   mFileDescriptor = mUsbManager.openAccessory(accessory);
   if (mFileDescriptor != null) {
     Log.d(TAG, "openAccessory- mFileDescriptor!=null");
     mAccessory = accessory;
     /* */
     FileDescriptor fd = mFileDescriptor.getFileDescriptor();
     mInputStream = new FileInputStream(fd);
     mOutputStream = new FileOutputStream(fd);
     /* */
     enableControls(true);
     Log.d(TAG, "openAccessory -2 ");
     if (mInputController != null) mInputController.accessoryAttached();
     if (mOutputController != null) mOutputController.accessoryAttached();
     this.enableControls(true);
   } else {
     Log.d(TAG, "accessory open fail");
   }
 }
  /**
   * Enables the
   *
   * @param context The context that the USB manager should register to
   * @return RETURN_CODES - the status of the enable request
   */
  public RETURN_CODES enable(Context context, Intent intent) {
    // Grab the packageName to use for an attach Intent
    actionString = context.getPackageName() + ".action.USB_PERMISSION";

    PendingIntent permissionIntent =
        PendingIntent.getBroadcast(context, 0, new Intent(actionString), 0);

    // If the USB manager isn't already enabled
    if (enabled == false) {
      // Create a new filter with the package name (for the accessory
      // attach)

      try {
        Thread.sleep(500);
      } catch (InterruptedException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
      }

      IntentFilter filter = new IntentFilter(actionString);
      // Also add a few other actions to the intent...
      filter.addAction(UsbManager.ACTION_USB_ACCESSORY_ATTACHED);
      filter.addAction(UsbManager.ACTION_USB_ACCESSORY_DETACHED);
      // and register the intent with the specified context
      context.registerReceiver(receiver, filter);

      UsbManager deviceManager = null;
      UsbAccessory[] accessories = null;
      UsbAccessory accessory = null;

      // Get a UsbManager object from the specified intent (only works for
      // v3.1+ devices)
      // deviceManager = (UsbManager) context
      //		.getSystemService(Context.USB_SERVICE);
      deviceManager = UsbManager.getInstance(context);

      // If we were unable to get a UsbManager, return an error
      if (deviceManager == null) {
        return RETURN_CODES.DEVICE_MANAGER_IS_NULL;
      }

      // Get a list of all of the accessories from the UsbManager
      accessories = deviceManager.getAccessoryList();

      // If the list of accessories is empty, then exit
      if (accessories == null) {
        return RETURN_CODES.ACCESSORIES_LIST_IS_EMPTY;
      }

      // Get the first accessory in the list (currently the Android OS
      // only
      // supports one accessory, so this is it)
      accessory = accessories[0];

      // If the accessory isn't null, then let's try to attach to it.
      if (accessory != null) {
        // If we have permission to access the accessory,
        if (deviceManager.hasPermission(accessory)) {
          // Try to open a ParcelFileDescriptor by opening the
          // accessory
          parcelFileDescriptor = deviceManager.openAccessory(accessory);

          if (parcelFileDescriptor != null) {
            // Create a new read thread to handle reading data from
            // the accessory
            readThread = new ReadThread(parcelFileDescriptor);
            readThread.start();

            deviceManager.requestPermission(accessory, permissionIntent);

            if (parcelFileDescriptor == null) {
              Log.d(TAG, "USBAccessoryManager:enable() parcelFileDescriptor == null");
              return RETURN_CODES.FILE_DESCRIPTOR_WOULD_NOT_OPEN;
            }

            // Open the output file stream for writing data out to
            // the accessory
            outputStream = new FileOutputStream(parcelFileDescriptor.getFileDescriptor());

            if (outputStream == null) {
              Log.d(TAG, "USBAccessoryManager:enable() outputStream == null");

              try {
                parcelFileDescriptor.close();
              } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
              }
              return RETURN_CODES.FILE_DESCRIPTOR_WOULD_NOT_OPEN;
            }

            Log.d(TAG, "USBAccessoryManager:enable() outputStream open");

            // If the ParcelFileDescriptor was successfully opened,
            // mark the accessory as enabled and open
            enabled = true;
            open = true;

            handler
                .obtainMessage(
                    what,
                    new USBAccessoryManagerMessage(
                        USBAccessoryManagerMessage.MessageType.READY, accessory))
                .sendToTarget();

            Log.d(TAG, "USBAccessoryManager:enable() device ready");

            return RETURN_CODES.SUCCESS;
          } else {
            /*
             * If we weren't able to open the ParcelFileDescriptor,
             * then we will not be able to talk to the device. Due
             * to a bug in the Android v2.3.4 OS this situation may
             * occur if a user presses the "home" or "back" buttons
             * while an accessory is still attached. In this case
             * the attempt to close the ReadThread will fail if a
             * read() is in progress on the FileInputStream. This
             * results in the ParcelFileDescriptor not being freed
             * up for later access. A future attempt to connect to
             * the accessory (via reopening the app) will end up
             * having the openAccessory() request return null,
             * ending up in this section of code.
             */
            return RETURN_CODES.FILE_DESCRIPTOR_WOULD_NOT_OPEN;
          }
        } else {
          /*
           * If we don't currently have permission to access the
           * accessory, then we need to request it. If we haven't
           * requested it already...
           */
          if (permissionRequested == false) {
            // Then go ahead and request it...
            deviceManager.requestPermission(accessory, permissionIntent);

            permissionRequested = true;
            return RETURN_CODES.PERMISSION_PENDING;
          }
        }
      }

      return RETURN_CODES.ACCESSORIES_LIST_IS_EMPTY;
    }

    return RETURN_CODES.SUCCESS;
  }
        @Override
        public void onReceive(Context context, Intent intent) {
          /* get the action for this event */
          String action = intent.getAction();

          /*
           * if it corresponds to the packageName, then it was a permissions
           * grant request
           */
          if (actionString.equals(action)) {
            /* see if we got permission */
            if (intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false)) {
              /* if so, then try to open the accessory */
              UsbManager deviceManager = null;
              UsbAccessory accessory = null;

              // deviceManager = (UsbManager) context
              //		.getSystemService(Context.USB_SERVICE);
              deviceManager = UsbManager.getInstance(context);

              if (deviceManager == null) {
                // TODO: error. report to user?
                return;
              }

              // accessory = (UsbAccessory) intent
              //		.getParcelableExtra(UsbManager.EXTRA_ACCESSORY);
              accessory = UsbManager.getAccessory(intent);

              parcelFileDescriptor = deviceManager.openAccessory(accessory);

              if (parcelFileDescriptor != null) {
                enabled = true;
                open = true;

                outputStream = new FileOutputStream(parcelFileDescriptor.getFileDescriptor());

                readThread = new ReadThread(parcelFileDescriptor);
                readThread.start();

                Log.d(TAG, "USBAccessoryManager:BroadcastReceiver()-1");
                handler
                    .obtainMessage(
                        what,
                        new USBAccessoryManagerMessage(
                            USBAccessoryManagerMessage.MessageType.READY, accessory))
                    .sendToTarget();
              } else {
                // TODO: error. report to user?
                return;
              }
            }
          }

          if (UsbManager.ACTION_USB_ACCESSORY_ATTACHED.equals(action)) {
            /*
             * if it was a device attach notice, then try to open the
             * accessory
             */
            UsbManager deviceManager = null;
            UsbAccessory[] accessories = null;
            UsbAccessory accessory = null;

            // deviceManager = (UsbManager) context
            //		.getSystemService(Context.USB_SERVICE);
            deviceManager = UsbManager.getInstance(context);

            if (deviceManager == null) {
              // TODO: error. report to user?
              return;
            }

            accessories = deviceManager.getAccessoryList();

            if (accessories == null) {
              // TODO: error. report to user?
              return;
            }

            accessory = accessories[0];

            parcelFileDescriptor = deviceManager.openAccessory(accessory);

            if (parcelFileDescriptor != null) {
              enabled = true;
              open = true;

              outputStream = new FileOutputStream(parcelFileDescriptor.getFileDescriptor());

              readThread = new ReadThread(parcelFileDescriptor);
              readThread.start();

              Log.d(TAG, "USBAccessoryManager:BroadcastReceiver()-2");
              handler
                  .obtainMessage(
                      what,
                      new USBAccessoryManagerMessage(
                          USBAccessoryManagerMessage.MessageType.READY, accessory))
                  .sendToTarget();
            } else {
              // TODO: error. report to user?
              return;
            }
          } else if (UsbManager.ACTION_USB_ACCESSORY_DETACHED.equals(action)) {
            /*
             * if it was a detach notice, then close the accessory and
             * notify the user
             */
            closeAccessory();
            handler
                .obtainMessage(
                    what,
                    new USBAccessoryManagerMessage(
                        USBAccessoryManagerMessage.MessageType.DISCONNECTED))
                .sendToTarget();
          } else if (UsbManager.EXTRA_PERMISSION_GRANTED.equals(action)) {

          }
        }