UsbManager.java revision 1110748b2df664f9c5066819c1f0616eae3394a7
1ad2d07d2d98a46babb2a9472413fe9ce5080ca76Adam Lesinski/* 2ad2d07d2d98a46babb2a9472413fe9ce5080ca76Adam Lesinski * Copyright (C) 2011 The Android Open Source Project 3ad2d07d2d98a46babb2a9472413fe9ce5080ca76Adam Lesinski * 4ad2d07d2d98a46babb2a9472413fe9ce5080ca76Adam Lesinski * Licensed under the Apache License, Version 2.0 (the "License"); 5ad2d07d2d98a46babb2a9472413fe9ce5080ca76Adam Lesinski * you may not use this file except in compliance with the License. 6ad2d07d2d98a46babb2a9472413fe9ce5080ca76Adam Lesinski * You may obtain a copy of the License at 7ad2d07d2d98a46babb2a9472413fe9ce5080ca76Adam Lesinski * 8ad2d07d2d98a46babb2a9472413fe9ce5080ca76Adam Lesinski * http://www.apache.org/licenses/LICENSE-2.0 9ad2d07d2d98a46babb2a9472413fe9ce5080ca76Adam Lesinski * 10ad2d07d2d98a46babb2a9472413fe9ce5080ca76Adam Lesinski * Unless required by applicable law or agreed to in writing, software 11ad2d07d2d98a46babb2a9472413fe9ce5080ca76Adam Lesinski * distributed under the License is distributed on an "AS IS" BASIS, 12ad2d07d2d98a46babb2a9472413fe9ce5080ca76Adam Lesinski * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13ad2d07d2d98a46babb2a9472413fe9ce5080ca76Adam Lesinski * See the License for the specific language governing permissions and 14ad2d07d2d98a46babb2a9472413fe9ce5080ca76Adam Lesinski * limitations under the License. 15ad2d07d2d98a46babb2a9472413fe9ce5080ca76Adam Lesinski */ 16ad2d07d2d98a46babb2a9472413fe9ce5080ca76Adam Lesinski 17ad2d07d2d98a46babb2a9472413fe9ce5080ca76Adam Lesinski 18ad2d07d2d98a46babb2a9472413fe9ce5080ca76Adam Lesinskipackage com.android.future.usb; 19ad2d07d2d98a46babb2a9472413fe9ce5080ca76Adam Lesinski 20ad2d07d2d98a46babb2a9472413fe9ce5080ca76Adam Lesinskiimport android.content.Context; 21ad2d07d2d98a46babb2a9472413fe9ce5080ca76Adam Lesinskiimport android.content.Intent; 22ad2d07d2d98a46babb2a9472413fe9ce5080ca76Adam Lesinskiimport android.hardware.usb.IUsbManager; 23ad2d07d2d98a46babb2a9472413fe9ce5080ca76Adam Lesinskiimport android.os.IBinder; 24ad2d07d2d98a46babb2a9472413fe9ce5080ca76Adam Lesinskiimport android.os.ParcelFileDescriptor; 25ad2d07d2d98a46babb2a9472413fe9ce5080ca76Adam Lesinskiimport android.os.RemoteException; 26ad2d07d2d98a46babb2a9472413fe9ce5080ca76Adam Lesinskiimport android.os.ServiceManager; 27ad2d07d2d98a46babb2a9472413fe9ce5080ca76Adam Lesinskiimport android.util.Log; 28ad2d07d2d98a46babb2a9472413fe9ce5080ca76Adam Lesinski 29ad2d07d2d98a46babb2a9472413fe9ce5080ca76Adam Lesinski/** 30ad2d07d2d98a46babb2a9472413fe9ce5080ca76Adam Lesinski * This class allows you to access the state of USB, both in host and device mode. 31ad2d07d2d98a46babb2a9472413fe9ce5080ca76Adam Lesinski * 32ad2d07d2d98a46babb2a9472413fe9ce5080ca76Adam Lesinski * <p>You can obtain an instance of this class by calling {@link #getInstance} 33ad2d07d2d98a46babb2a9472413fe9ce5080ca76Adam Lesinski * 34ad2d07d2d98a46babb2a9472413fe9ce5080ca76Adam Lesinski */ 35ad2d07d2d98a46babb2a9472413fe9ce5080ca76Adam Lesinskipublic class UsbManager { 36ad2d07d2d98a46babb2a9472413fe9ce5080ca76Adam Lesinski private static final String TAG = "UsbManager"; 37ad2d07d2d98a46babb2a9472413fe9ce5080ca76Adam Lesinski 38ad2d07d2d98a46babb2a9472413fe9ce5080ca76Adam Lesinski /** 39ad2d07d2d98a46babb2a9472413fe9ce5080ca76Adam Lesinski * Broadcast Action: A broadcast for USB accessory attached event. 40ad2d07d2d98a46babb2a9472413fe9ce5080ca76Adam Lesinski * 41ad2d07d2d98a46babb2a9472413fe9ce5080ca76Adam Lesinski * This intent is sent when a USB accessory is attached. 42ad2d07d2d98a46babb2a9472413fe9ce5080ca76Adam Lesinski * Call {@link #getAccessory(android.content.Intent)} to retrieve the 43ad2d07d2d98a46babb2a9472413fe9ce5080ca76Adam Lesinski * {@link com.google.android.usb.UsbAccessory} for the attached accessory. 444bf58108d442b37ab4adf5ce3a4ecd63472ce254Adam Lesinski */ 45ad2d07d2d98a46babb2a9472413fe9ce5080ca76Adam Lesinski public static final String ACTION_USB_ACCESSORY_ATTACHED = 46ad2d07d2d98a46babb2a9472413fe9ce5080ca76Adam Lesinski "android.hardware.usb.action.USB_ACCESSORY_ATTACHED"; 47ad2d07d2d98a46babb2a9472413fe9ce5080ca76Adam Lesinski 48ad2d07d2d98a46babb2a9472413fe9ce5080ca76Adam Lesinski /** 49ad2d07d2d98a46babb2a9472413fe9ce5080ca76Adam Lesinski * Broadcast Action: A broadcast for USB accessory detached event. 50ad2d07d2d98a46babb2a9472413fe9ce5080ca76Adam Lesinski * 51ad2d07d2d98a46babb2a9472413fe9ce5080ca76Adam Lesinski * This intent is sent when a USB accessory is detached. 52ad2d07d2d98a46babb2a9472413fe9ce5080ca76Adam Lesinski * Call {@link #getAccessory(android.content.Intent)} to retrieve the 53ad2d07d2d98a46babb2a9472413fe9ce5080ca76Adam Lesinski * {@link com.google.android.usb.UsbAccessory} for the attached accessory that was detached. 54ad2d07d2d98a46babb2a9472413fe9ce5080ca76Adam Lesinski */ 55ad2d07d2d98a46babb2a9472413fe9ce5080ca76Adam Lesinski public static final String ACTION_USB_ACCESSORY_DETACHED = 56ad2d07d2d98a46babb2a9472413fe9ce5080ca76Adam Lesinski "android.hardware.usb.action.USB_ACCESSORY_DETACHED"; 57ad2d07d2d98a46babb2a9472413fe9ce5080ca76Adam Lesinski 58ad2d07d2d98a46babb2a9472413fe9ce5080ca76Adam Lesinski private final IUsbManager mService; 59ad2d07d2d98a46babb2a9472413fe9ce5080ca76Adam Lesinski 60ad2d07d2d98a46babb2a9472413fe9ce5080ca76Adam Lesinski private UsbManager(IUsbManager service) { 61ad2d07d2d98a46babb2a9472413fe9ce5080ca76Adam Lesinski mService = service; 62ad2d07d2d98a46babb2a9472413fe9ce5080ca76Adam Lesinski } 63ad2d07d2d98a46babb2a9472413fe9ce5080ca76Adam Lesinski 64ad2d07d2d98a46babb2a9472413fe9ce5080ca76Adam Lesinski /** 65ad2d07d2d98a46babb2a9472413fe9ce5080ca76Adam Lesinski * Returns a new instance of this class. 66ad2d07d2d98a46babb2a9472413fe9ce5080ca76Adam Lesinski * 67ad2d07d2d98a46babb2a9472413fe9ce5080ca76Adam Lesinski * @return UsbManager instance. 68ad2d07d2d98a46babb2a9472413fe9ce5080ca76Adam Lesinski */ 69ad2d07d2d98a46babb2a9472413fe9ce5080ca76Adam Lesinski public static UsbManager getInstance() { 70ad2d07d2d98a46babb2a9472413fe9ce5080ca76Adam Lesinski IBinder b = ServiceManager.getService(Context.USB_SERVICE); 71ad2d07d2d98a46babb2a9472413fe9ce5080ca76Adam Lesinski return new UsbManager(IUsbManager.Stub.asInterface(b)); 72ad2d07d2d98a46babb2a9472413fe9ce5080ca76Adam Lesinski } 73ad2d07d2d98a46babb2a9472413fe9ce5080ca76Adam Lesinski 74ad2d07d2d98a46babb2a9472413fe9ce5080ca76Adam Lesinski /** 75ad2d07d2d98a46babb2a9472413fe9ce5080ca76Adam Lesinski * Returns the {@link com.google.android.usb.UsbAccessory} for 76ad2d07d2d98a46babb2a9472413fe9ce5080ca76Adam Lesinski * a {@link #ACTION_USB_ACCESSORY_ATTACHED} or {@link #ACTION_USB_ACCESSORY_ATTACHED} 77ad2d07d2d98a46babb2a9472413fe9ce5080ca76Adam Lesinski * broadcast Intent 78ad2d07d2d98a46babb2a9472413fe9ce5080ca76Adam Lesinski * 79ad2d07d2d98a46babb2a9472413fe9ce5080ca76Adam Lesinski * @return UsbAccessory for the broadcast. 80ad2d07d2d98a46babb2a9472413fe9ce5080ca76Adam Lesinski */ 81ad2d07d2d98a46babb2a9472413fe9ce5080ca76Adam Lesinski public static UsbAccessory getAccessory(Intent intent) { 82ad2d07d2d98a46babb2a9472413fe9ce5080ca76Adam Lesinski android.hardware.usb.UsbAccessory accessory = 83ad2d07d2d98a46babb2a9472413fe9ce5080ca76Adam Lesinski intent.getParcelableExtra(android.hardware.usb.UsbManager.EXTRA_ACCESSORY); 84ad2d07d2d98a46babb2a9472413fe9ce5080ca76Adam Lesinski if (accessory == null) { 85ad2d07d2d98a46babb2a9472413fe9ce5080ca76Adam Lesinski return null; 86ad2d07d2d98a46babb2a9472413fe9ce5080ca76Adam Lesinski } else { 87ad2d07d2d98a46babb2a9472413fe9ce5080ca76Adam Lesinski return new UsbAccessory(accessory); 88ad2d07d2d98a46babb2a9472413fe9ce5080ca76Adam Lesinski } 89ad2d07d2d98a46babb2a9472413fe9ce5080ca76Adam Lesinski } 90ad2d07d2d98a46babb2a9472413fe9ce5080ca76Adam Lesinski 91ad2d07d2d98a46babb2a9472413fe9ce5080ca76Adam Lesinski /** 92ad2d07d2d98a46babb2a9472413fe9ce5080ca76Adam Lesinski * Returns a list of currently attached USB accessories. 93ad2d07d2d98a46babb2a9472413fe9ce5080ca76Adam Lesinski * (in the current implementation there can be at most one) 94ad2d07d2d98a46babb2a9472413fe9ce5080ca76Adam Lesinski * 95ad2d07d2d98a46babb2a9472413fe9ce5080ca76Adam Lesinski * @return list of USB accessories, or null if none are attached. 96ad2d07d2d98a46babb2a9472413fe9ce5080ca76Adam Lesinski */ 97ad2d07d2d98a46babb2a9472413fe9ce5080ca76Adam Lesinski public UsbAccessory[] getAccessoryList() { 98ad2d07d2d98a46babb2a9472413fe9ce5080ca76Adam Lesinski try { 99ad2d07d2d98a46babb2a9472413fe9ce5080ca76Adam Lesinski android.hardware.usb.UsbAccessory accessory = mService.getCurrentAccessory(); 100ad2d07d2d98a46babb2a9472413fe9ce5080ca76Adam Lesinski if (accessory == null) { 101ad2d07d2d98a46babb2a9472413fe9ce5080ca76Adam Lesinski return null; 102ad2d07d2d98a46babb2a9472413fe9ce5080ca76Adam Lesinski } else { 103ad2d07d2d98a46babb2a9472413fe9ce5080ca76Adam Lesinski return new UsbAccessory[] { new UsbAccessory(accessory) }; 104ad2d07d2d98a46babb2a9472413fe9ce5080ca76Adam Lesinski } 105ad2d07d2d98a46babb2a9472413fe9ce5080ca76Adam Lesinski } catch (RemoteException e) { 1064bf58108d442b37ab4adf5ce3a4ecd63472ce254Adam Lesinski Log.e(TAG, "RemoteException in getAccessoryList" , e); 107ad2d07d2d98a46babb2a9472413fe9ce5080ca76Adam Lesinski return null; 108ad2d07d2d98a46babb2a9472413fe9ce5080ca76Adam Lesinski } 109ad2d07d2d98a46babb2a9472413fe9ce5080ca76Adam Lesinski } 110ad2d07d2d98a46babb2a9472413fe9ce5080ca76Adam Lesinski 111ad2d07d2d98a46babb2a9472413fe9ce5080ca76Adam Lesinski /** 112ad2d07d2d98a46babb2a9472413fe9ce5080ca76Adam Lesinski * Opens a file descriptor for reading and writing data to the USB accessory. 113ad2d07d2d98a46babb2a9472413fe9ce5080ca76Adam Lesinski * 114ad2d07d2d98a46babb2a9472413fe9ce5080ca76Adam Lesinski * @param accessory the USB accessory to open 115ad2d07d2d98a46babb2a9472413fe9ce5080ca76Adam Lesinski * @return file descriptor, or null if the accessor could not be opened. 116ad2d07d2d98a46babb2a9472413fe9ce5080ca76Adam Lesinski */ 117ad2d07d2d98a46babb2a9472413fe9ce5080ca76Adam Lesinski public ParcelFileDescriptor openAccessory(UsbAccessory accessory) { 118ad2d07d2d98a46babb2a9472413fe9ce5080ca76Adam Lesinski try { 119ad2d07d2d98a46babb2a9472413fe9ce5080ca76Adam Lesinski return mService.openAccessory(new android.hardware.usb.UsbAccessory( 120ad2d07d2d98a46babb2a9472413fe9ce5080ca76Adam Lesinski accessory.getManufacturer(),accessory.getModel(), 121ad2d07d2d98a46babb2a9472413fe9ce5080ca76Adam Lesinski accessory.getType(), accessory.getVersion())); 122ad2d07d2d98a46babb2a9472413fe9ce5080ca76Adam Lesinski } catch (RemoteException e) { 123ad2d07d2d98a46babb2a9472413fe9ce5080ca76Adam Lesinski Log.e(TAG, "RemoteException in openAccessory" , e); 124ad2d07d2d98a46babb2a9472413fe9ce5080ca76Adam Lesinski return null; 125ad2d07d2d98a46babb2a9472413fe9ce5080ca76Adam Lesinski } 126ad2d07d2d98a46babb2a9472413fe9ce5080ca76Adam Lesinski } 127ad2d07d2d98a46babb2a9472413fe9ce5080ca76Adam Lesinski} 128ad2d07d2d98a46babb2a9472413fe9ce5080ca76Adam Lesinski