USB communication between Android (accessory mode) and Windows PC (host)

13,708

You should have an application on the host side (Windows in your case) that will ask the Android to enter accessory mode. When it asks, you will be presented with the option to give permission or not. You have null accessory because there is no accessory connected, that has followed the AOAP to initiate a communication. So it is possible to have accessory device, that is not running Android and to communicate with it using AOAP.

You can find an example for the Android side in the samples from your android SDK, in USB folder.

Share:
13,708
B770
Author by

B770

Updated on June 19, 2022

Comments

  • B770
    B770 almost 2 years

    I try to make an USB connection between my notebook (win7) and my android phone (Android 4.2). The notebook should act as host to power the android phone. The goal is that notebook and phone can send and receive xml strings

    I tried to follow the the android page that explains accessory mode (http://developer.android.com/guide/topics/connectivity/usb/accessory.html).

    • 1: Must I define a accessory filter like they did here:

      <?xml version="1.0" encoding="utf-8"?>
      <resources>
      <usb-accessory model="DemoKit" manufacturer="Google" version="1.0"/>
      </resources>
      

      Because I don't want a special hardware to be recognized. I want all kind of windows computers to be recognized (e.g. I plug the phone in another pc).

    • 2: I've done nothing on the windows side right now. I just followd the android page, pluged in the usb cable and watched the log. The app startet asks for permission, but the accessory is null. Any hints why it is null? Code:

      public class MainActivity extends Activity {
      private static final String ACTION_USB_PERMISSION = "com.android.example.USB_PERMISSION";
      private static final String TAG = "USB_PERMISSION";
      UsbAccessory accessory;
      
      protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
      
      UsbManager manager = (UsbManager) getSystemService(Context.USB_SERVICE);
      
      PendingIntent mPermissionIntent = PendingIntent.getBroadcast(this, 0,
              new Intent(ACTION_USB_PERMISSION), 0);
      IntentFilter filter = new IntentFilter(ACTION_USB_PERMISSION);
      registerReceiver(mUsbReceiver, filter);
      accessory = (UsbAccessory) getIntent().getParcelableExtra(
              UsbManager.EXTRA_ACCESSORY);
      manager.requestPermission(accessory, mPermissionIntent);
       }
      
      private final BroadcastReceiver mUsbReceiver = new BroadcastReceiver() {
      
      public void onReceive(Context context, Intent intent) {
          String action = intent.getAction();
          if (ACTION_USB_PERMISSION.equals(action)) {
              synchronized (this) {
                  if (intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false)) {
                      String manufacturer;
                      Log.d(TAG, "permission accepted for accessory " + accessory);
                      if (accessory != null) {
                          manufacturer = accessory.getManufacturer();
                          Log.d(TAG, "Manufacturer: " + manufacturer);                        }
                  } else {
                      Log.d(TAG, "permission denied for accessory "+ accessory);
                  }
              }
          }
      }
      };
      }
      
    • 3: Are there any libarys/projects I can use to identify the USB connection on the Windows side?

    • 4: Any further things I should think about? Things that are wrong?
    • 5: thx for your help :)
  • Chris Stratton
    Chris Stratton about 10 years
    This answer is incorrect - an Arduino does not run Android, and there is no need for the USB host to do so. However, it does need to be able to talk in the specific ways required to support the USB accessory mode.
  • Naveed Ali
    Naveed Ali over 9 years
    and how can it be achieved any source app?
  • badoualy
    badoualy about 9 years
    Did you find any sample pc-side to receive data from android ?
  • dragi
    dragi about 9 years
    @seed Actually I haven't used it. Once it was possible to start using it, so I got familiar with it, however it was deferred and I have not dealt with it since then. However I think that it should not be a big deal to figure it out, once you know the protocol.
  • Calvin
    Calvin about 8 years
    @helleye you mean my app in android phone can actual respond to windows over USB? I had similar requirement earlier and i used adb in windows to communicate with my app and my app used to create text files on a predefined path from where my windows app would read file.
  • dragi
    dragi about 8 years
    @Calvin Yes, this is what the accessory mode is about. You should follow the AOA protocol and you can start by reading source.android.com/devices/accessories/protocol.html
  • Chetan Joshi
    Chetan Joshi over 2 years
    @Calvin Could you please send me any reference for ADB communication which you done?
  • Ron
    Ron about 2 years
    Could you share what you've done to get it to work for reference? Thanks.