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

4

16

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 :)
Rorrys answered 11/4, 2013 at 9:32 Comment(1)
So I guess #1 is clearer now. Intentfilter is only needed for automatic detecitonRorrys
A
5

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.

Authenticate answered 10/2, 2014 at 12:51 Comment(6)
and how can it be achieved any source app?Sheathing
Did you find any sample pc-side to receive data from android ?Stumble
@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.Authenticate
@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.Albin
@Albin 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.htmlAuthenticate
@Albin Could you please send me any reference for ADB communication which you done?Concomitant
B
0

The reason you got 0 accessory because you don't have accessory devices hooked to your Android USB port, you scenario is using Windows PC as the host (You may try write a customized WinUSB driver) and the Android device is a pure USB device, it has nothing to do with AOA, when you send mode switch request from host computer (Windows or macOS), the Android device turn into accessory mode and itself is an accessory, you will find one accessory by using getAccessoryList. BTW, I got both Windows and macOS working with Android via libusb.

Babbler answered 26/2, 2019 at 16:39 Comment(1)
Could you share what you've done to get it to work for reference? Thanks.Elanorelapid
B
0

Yeah, you need use WinUSB/libusb API in Windows side to do the host work, turn the Android into accessory mode, and then talk each other

Babbler answered 10/3, 2019 at 4:26 Comment(0)
R
-5

Ok, I guess I found the answer myself. The Android USB accessory mode is only possible between an android phone and another device that is running Android (such as Arduino). So this is not possible with this setting.

Rorrys answered 12/4, 2013 at 6:39 Comment(1)
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.Lapse

© 2022 - 2025 — McMap. All rights reserved.