UsbManager.java revision 40bbf9295d5245d3917629ce15f7b37670aef1ac
140bbf9295d5245d3917629ce15f7b37670aef1acMike Lockwood/*
240bbf9295d5245d3917629ce15f7b37670aef1acMike Lockwood * Copyright (C) 2011 The Android Open Source Project
340bbf9295d5245d3917629ce15f7b37670aef1acMike Lockwood *
440bbf9295d5245d3917629ce15f7b37670aef1acMike Lockwood * Licensed under the Apache License, Version 2.0 (the "License");
540bbf9295d5245d3917629ce15f7b37670aef1acMike Lockwood * you may not use this file except in compliance with the License.
640bbf9295d5245d3917629ce15f7b37670aef1acMike Lockwood * You may obtain a copy of the License at
740bbf9295d5245d3917629ce15f7b37670aef1acMike Lockwood *
840bbf9295d5245d3917629ce15f7b37670aef1acMike Lockwood *      http://www.apache.org/licenses/LICENSE-2.0
940bbf9295d5245d3917629ce15f7b37670aef1acMike Lockwood *
1040bbf9295d5245d3917629ce15f7b37670aef1acMike Lockwood * Unless required by applicable law or agreed to in writing, software
1140bbf9295d5245d3917629ce15f7b37670aef1acMike Lockwood * distributed under the License is distributed on an "AS IS" BASIS,
1240bbf9295d5245d3917629ce15f7b37670aef1acMike Lockwood * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1340bbf9295d5245d3917629ce15f7b37670aef1acMike Lockwood * See the License for the specific language governing permissions and
1440bbf9295d5245d3917629ce15f7b37670aef1acMike Lockwood * limitations under the License.
1540bbf9295d5245d3917629ce15f7b37670aef1acMike Lockwood */
1640bbf9295d5245d3917629ce15f7b37670aef1acMike Lockwood
1740bbf9295d5245d3917629ce15f7b37670aef1acMike Lockwood
1840bbf9295d5245d3917629ce15f7b37670aef1acMike Lockwoodpackage com.google.android.usb;
1940bbf9295d5245d3917629ce15f7b37670aef1acMike Lockwood
2040bbf9295d5245d3917629ce15f7b37670aef1acMike Lockwoodimport android.content.Context;
2140bbf9295d5245d3917629ce15f7b37670aef1acMike Lockwoodimport android.content.Intent;
2240bbf9295d5245d3917629ce15f7b37670aef1acMike Lockwoodimport android.hardware.usb.IUsbManager;
2340bbf9295d5245d3917629ce15f7b37670aef1acMike Lockwoodimport android.os.IBinder;
2440bbf9295d5245d3917629ce15f7b37670aef1acMike Lockwoodimport android.os.ParcelFileDescriptor;
2540bbf9295d5245d3917629ce15f7b37670aef1acMike Lockwoodimport android.os.RemoteException;
2640bbf9295d5245d3917629ce15f7b37670aef1acMike Lockwoodimport android.os.ServiceManager;
2740bbf9295d5245d3917629ce15f7b37670aef1acMike Lockwoodimport android.util.Log;
2840bbf9295d5245d3917629ce15f7b37670aef1acMike Lockwood
2940bbf9295d5245d3917629ce15f7b37670aef1acMike Lockwood/**
3040bbf9295d5245d3917629ce15f7b37670aef1acMike Lockwood * This class allows you to access the state of USB, both in host and device mode.
3140bbf9295d5245d3917629ce15f7b37670aef1acMike Lockwood *
3240bbf9295d5245d3917629ce15f7b37670aef1acMike Lockwood * <p>You can obtain an instance of this class by calling {@link #getInstance}
3340bbf9295d5245d3917629ce15f7b37670aef1acMike Lockwood *
3440bbf9295d5245d3917629ce15f7b37670aef1acMike Lockwood */
3540bbf9295d5245d3917629ce15f7b37670aef1acMike Lockwoodpublic class UsbManager {
3640bbf9295d5245d3917629ce15f7b37670aef1acMike Lockwood    private static final String TAG = "UsbManager";
3740bbf9295d5245d3917629ce15f7b37670aef1acMike Lockwood
3840bbf9295d5245d3917629ce15f7b37670aef1acMike Lockwood   /**
3940bbf9295d5245d3917629ce15f7b37670aef1acMike Lockwood     * Broadcast Action:  A broadcast for USB accessory attached event.
4040bbf9295d5245d3917629ce15f7b37670aef1acMike Lockwood     *
4140bbf9295d5245d3917629ce15f7b37670aef1acMike Lockwood     * This intent is sent when a USB accessory is attached.
4240bbf9295d5245d3917629ce15f7b37670aef1acMike Lockwood     * Call {@link #getAccessory(android.content.Intent)} to retrieve the
4340bbf9295d5245d3917629ce15f7b37670aef1acMike Lockwood     * {@link com.google.android.usb.UsbAccessory} for the attached accessory.
4440bbf9295d5245d3917629ce15f7b37670aef1acMike Lockwood     */
4540bbf9295d5245d3917629ce15f7b37670aef1acMike Lockwood    public static final String ACTION_USB_ACCESSORY_ATTACHED =
4640bbf9295d5245d3917629ce15f7b37670aef1acMike Lockwood            "android.hardware.usb.action.USB_ACCESSORY_ATTACHED";
4740bbf9295d5245d3917629ce15f7b37670aef1acMike Lockwood
4840bbf9295d5245d3917629ce15f7b37670aef1acMike Lockwood   /**
4940bbf9295d5245d3917629ce15f7b37670aef1acMike Lockwood     * Broadcast Action:  A broadcast for USB accessory detached event.
5040bbf9295d5245d3917629ce15f7b37670aef1acMike Lockwood     *
5140bbf9295d5245d3917629ce15f7b37670aef1acMike Lockwood     * This intent is sent when a USB accessory is detached.
5240bbf9295d5245d3917629ce15f7b37670aef1acMike Lockwood     * Call {@link #getAccessory(android.content.Intent)} to retrieve the
5340bbf9295d5245d3917629ce15f7b37670aef1acMike Lockwood     * {@link com.google.android.usb.UsbAccessory} for the attached accessory that was detached.
5440bbf9295d5245d3917629ce15f7b37670aef1acMike Lockwood     */
5540bbf9295d5245d3917629ce15f7b37670aef1acMike Lockwood    public static final String ACTION_USB_ACCESSORY_DETACHED =
5640bbf9295d5245d3917629ce15f7b37670aef1acMike Lockwood            "android.hardware.usb.action.USB_ACCESSORY_DETACHED";
5740bbf9295d5245d3917629ce15f7b37670aef1acMike Lockwood
5840bbf9295d5245d3917629ce15f7b37670aef1acMike Lockwood    private final IUsbManager mService;
5940bbf9295d5245d3917629ce15f7b37670aef1acMike Lockwood
6040bbf9295d5245d3917629ce15f7b37670aef1acMike Lockwood    private UsbManager(IUsbManager service) {
6140bbf9295d5245d3917629ce15f7b37670aef1acMike Lockwood        mService = service;
6240bbf9295d5245d3917629ce15f7b37670aef1acMike Lockwood    }
6340bbf9295d5245d3917629ce15f7b37670aef1acMike Lockwood
6440bbf9295d5245d3917629ce15f7b37670aef1acMike Lockwood    /**
6540bbf9295d5245d3917629ce15f7b37670aef1acMike Lockwood     * Returns a new instance of this class.
6640bbf9295d5245d3917629ce15f7b37670aef1acMike Lockwood     *
6740bbf9295d5245d3917629ce15f7b37670aef1acMike Lockwood     * @return UsbManager instance.
6840bbf9295d5245d3917629ce15f7b37670aef1acMike Lockwood     */
6940bbf9295d5245d3917629ce15f7b37670aef1acMike Lockwood    public static UsbManager getInstance() {
7040bbf9295d5245d3917629ce15f7b37670aef1acMike Lockwood        IBinder b = ServiceManager.getService(Context.USB_SERVICE);
7140bbf9295d5245d3917629ce15f7b37670aef1acMike Lockwood        return new UsbManager(IUsbManager.Stub.asInterface(b));
7240bbf9295d5245d3917629ce15f7b37670aef1acMike Lockwood    }
7340bbf9295d5245d3917629ce15f7b37670aef1acMike Lockwood
7440bbf9295d5245d3917629ce15f7b37670aef1acMike Lockwood    /**
7540bbf9295d5245d3917629ce15f7b37670aef1acMike Lockwood     * Returns the {@link com.google.android.usb.UsbAccessory} for
7640bbf9295d5245d3917629ce15f7b37670aef1acMike Lockwood     * a {@link #ACTION_USB_ACCESSORY_ATTACHED} or {@link #ACTION_USB_ACCESSORY_ATTACHED}
7740bbf9295d5245d3917629ce15f7b37670aef1acMike Lockwood     * broadcast Intent
7840bbf9295d5245d3917629ce15f7b37670aef1acMike Lockwood     *
7940bbf9295d5245d3917629ce15f7b37670aef1acMike Lockwood     * @return UsbAccessory for the broadcast.
8040bbf9295d5245d3917629ce15f7b37670aef1acMike Lockwood     */
8140bbf9295d5245d3917629ce15f7b37670aef1acMike Lockwood    public static UsbAccessory getAccessory(Intent intent) {
8240bbf9295d5245d3917629ce15f7b37670aef1acMike Lockwood        android.hardware.usb.UsbAccessory accessory =
8340bbf9295d5245d3917629ce15f7b37670aef1acMike Lockwood            intent.getParcelableExtra(android.hardware.usb.UsbManager.EXTRA_ACCESSORY);
8440bbf9295d5245d3917629ce15f7b37670aef1acMike Lockwood        if (accessory == null) {
8540bbf9295d5245d3917629ce15f7b37670aef1acMike Lockwood            return null;
8640bbf9295d5245d3917629ce15f7b37670aef1acMike Lockwood        } else {
8740bbf9295d5245d3917629ce15f7b37670aef1acMike Lockwood            return new UsbAccessory(accessory);
8840bbf9295d5245d3917629ce15f7b37670aef1acMike Lockwood        }
8940bbf9295d5245d3917629ce15f7b37670aef1acMike Lockwood    }
9040bbf9295d5245d3917629ce15f7b37670aef1acMike Lockwood
9140bbf9295d5245d3917629ce15f7b37670aef1acMike Lockwood    /**
9240bbf9295d5245d3917629ce15f7b37670aef1acMike Lockwood     * Returns a list of currently attached USB accessories.
9340bbf9295d5245d3917629ce15f7b37670aef1acMike Lockwood     * (in the current implementation there can be at most one)
9440bbf9295d5245d3917629ce15f7b37670aef1acMike Lockwood     *
9540bbf9295d5245d3917629ce15f7b37670aef1acMike Lockwood     * @return list of USB accessories, or null if none are attached.
9640bbf9295d5245d3917629ce15f7b37670aef1acMike Lockwood     */
9740bbf9295d5245d3917629ce15f7b37670aef1acMike Lockwood    public UsbAccessory[] getAccessoryList() {
9840bbf9295d5245d3917629ce15f7b37670aef1acMike Lockwood        try {
9940bbf9295d5245d3917629ce15f7b37670aef1acMike Lockwood            android.hardware.usb.UsbAccessory accessory = mService.getCurrentAccessory();
10040bbf9295d5245d3917629ce15f7b37670aef1acMike Lockwood            if (accessory == null) {
10140bbf9295d5245d3917629ce15f7b37670aef1acMike Lockwood                return null;
10240bbf9295d5245d3917629ce15f7b37670aef1acMike Lockwood            } else {
10340bbf9295d5245d3917629ce15f7b37670aef1acMike Lockwood                return new UsbAccessory[] { new UsbAccessory(accessory) };
10440bbf9295d5245d3917629ce15f7b37670aef1acMike Lockwood            }
10540bbf9295d5245d3917629ce15f7b37670aef1acMike Lockwood        } catch (RemoteException e) {
10640bbf9295d5245d3917629ce15f7b37670aef1acMike Lockwood            Log.e(TAG, "RemoteException in getAccessoryList" , e);
10740bbf9295d5245d3917629ce15f7b37670aef1acMike Lockwood            return null;
10840bbf9295d5245d3917629ce15f7b37670aef1acMike Lockwood        }
10940bbf9295d5245d3917629ce15f7b37670aef1acMike Lockwood    }
11040bbf9295d5245d3917629ce15f7b37670aef1acMike Lockwood
11140bbf9295d5245d3917629ce15f7b37670aef1acMike Lockwood    /**
11240bbf9295d5245d3917629ce15f7b37670aef1acMike Lockwood     * Opens a file descriptor for reading and writing data to the USB accessory.
11340bbf9295d5245d3917629ce15f7b37670aef1acMike Lockwood     *
11440bbf9295d5245d3917629ce15f7b37670aef1acMike Lockwood     * @param accessory the USB accessory to open
11540bbf9295d5245d3917629ce15f7b37670aef1acMike Lockwood     * @return file descriptor, or null if the accessor could not be opened.
11640bbf9295d5245d3917629ce15f7b37670aef1acMike Lockwood     */
11740bbf9295d5245d3917629ce15f7b37670aef1acMike Lockwood    public ParcelFileDescriptor openAccessory(UsbAccessory accessory) {
11840bbf9295d5245d3917629ce15f7b37670aef1acMike Lockwood        try {
11940bbf9295d5245d3917629ce15f7b37670aef1acMike Lockwood            return mService.openAccessory(new android.hardware.usb.UsbAccessory(
12040bbf9295d5245d3917629ce15f7b37670aef1acMike Lockwood                    accessory.getManufacturer(),accessory.getModel(),
12140bbf9295d5245d3917629ce15f7b37670aef1acMike Lockwood                    accessory.getType(), accessory.getVersion()));
12240bbf9295d5245d3917629ce15f7b37670aef1acMike Lockwood        } catch (RemoteException e) {
12340bbf9295d5245d3917629ce15f7b37670aef1acMike Lockwood            Log.e(TAG, "RemoteException in openAccessory" , e);
12440bbf9295d5245d3917629ce15f7b37670aef1acMike Lockwood            return null;
12540bbf9295d5245d3917629ce15f7b37670aef1acMike Lockwood        }
12640bbf9295d5245d3917629ce15f7b37670aef1acMike Lockwood    }
12740bbf9295d5245d3917629ce15f7b37670aef1acMike Lockwood}
128