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