FileDocCategorySizeDatePackage
MtpClient.javaAPI DocAndroid 5.1 API15231Thu Mar 12 22:22:30 GMT 2015com.android.camerabrowser

MtpClient

public class MtpClient extends Object
This class helps an application manage a list of connected MTP or PTP devices. It listens for MTP devices being attached and removed from the USB host bus and notifies the application when the MTP device list changes.

Fields Summary
private static final String
TAG
private static final String
ACTION_USB_PERMISSION
private final android.content.Context
mContext
private final android.hardware.usb.UsbManager
mUsbManager
private final ArrayList
mListeners
private final HashMap
mDevices
private final android.app.PendingIntent
mPermissionIntent
private final android.content.BroadcastReceiver
mUsbReceiver
Constructors Summary
public MtpClient(android.content.Context context)
MtpClient constructor

param
context the {@link android.content.Context} to use for the MtpClient

        mContext = context;
        mUsbManager = (UsbManager)context.getSystemService(Context.USB_SERVICE);
        mPermissionIntent = PendingIntent.getBroadcast(mContext, 0, new Intent(ACTION_USB_PERMISSION), 0);
        IntentFilter filter = new IntentFilter();
        filter.addAction(UsbManager.ACTION_USB_DEVICE_ATTACHED);
        filter.addAction(UsbManager.ACTION_USB_DEVICE_DETACHED);
        filter.addAction(ACTION_USB_PERMISSION);
        context.registerReceiver(mUsbReceiver, filter);
    
Methods Summary
public voidaddListener(com.android.camerabrowser.MtpClient$Listener listener)
Registers a {@link android.mtp.MtpClient.Listener} interface to receive notifications when MTP or PTP devices are added or removed.

param
listener the listener to register

        synchronized (mDevices) {
            if (!mListeners.contains(listener)) {
                mListeners.add(listener);
            }
        }
    
public voidclose()
Closes all resources related to the MtpClient object

        mContext.unregisterReceiver(mUsbReceiver);
    
public booleandeleteObject(java.lang.String deviceName, int objectHandle)
Deletes an object on the MTP or PTP device with the given USB device name.

param
deviceName the name of the USB device
param
objectHandle handle of the object to delete
return
true if the deletion succeeds

        MtpDevice device = getDevice(deviceName);
        if (device == null) {
            return false;
        }
        return device.deleteObject(objectHandle);
    
public android.mtp.MtpDevicegetDevice(java.lang.String deviceName)
Retrieves an {@link android.mtp.MtpDevice} object for the USB device with the given name.

param
deviceName the name of the USB device
return
the MtpDevice, or null if it does not exist

        synchronized (mDevices) {
            return mDevices.get(deviceName);
        }
    
public android.mtp.MtpDevicegetDevice(int id)
Retrieves an {@link android.mtp.MtpDevice} object for the USB device with the given ID.

param
id the ID of the USB device
return
the MtpDevice, or null if it does not exist

        synchronized (mDevices) {
            return mDevices.get(UsbDevice.getDeviceName(id));
        }
    
public java.util.ListgetDeviceList()
Retrieves a list of all currently connected {@link android.mtp.MtpDevice}.

return
the list of MtpDevices

        synchronized (mDevices) {
            // Query the USB manager since devices might have attached
            // before we added our listener.
            for (UsbDevice usbDevice : mUsbManager.getDeviceList().values()) {
                if (mDevices.get(usbDevice.getDeviceName()) == null) {
                    openDeviceLocked(usbDevice);
                }
            }

            return new ArrayList<MtpDevice>(mDevices.values());
        }
    
public byte[]getObject(java.lang.String deviceName, int objectHandle, int objectSize)
Returns the data for an object as a byte array.

param
deviceName the name of the USB device containing the object
param
objectHandle handle of the object to read
param
objectSize the size of the object (this should match {@link android.mtp.MtpObjectInfo#getCompressedSize}
return
the object's data, or null if reading fails

        MtpDevice device = getDevice(deviceName);
        if (device == null) {
            return null;
        }
        return device.getObject(objectHandle, objectSize);
    
public android.mtp.MtpObjectInfogetObjectInfo(java.lang.String deviceName, int objectHandle)
Retrieves the {@link android.mtp.MtpObjectInfo} for an object on the MTP or PTP device with the given USB device name with the given object handle

param
deviceName the name of the USB device
param
objectHandle handle of the object to query
return
the MtpObjectInfo

        MtpDevice device = getDevice(deviceName);
        if (device == null) {
            return null;
        }
        return device.getObjectInfo(objectHandle);
    
public java.util.ListgetObjectList(java.lang.String deviceName, int storageId, int objectHandle)
Retrieves a list of {@link android.mtp.MtpObjectInfo} for all objects on the MTP or PTP device with the given USB device name and given storage ID and/or object handle. If the object handle is zero, then all objects in the root of the storage unit will be returned. Otherwise, all immediate children of the object will be returned. If the storage ID is also zero, then all objects on all storage units will be returned.

param
deviceName the name of the USB device
param
storageId the ID of the storage unit to query, or zero for all
param
objectHandle the handle of the parent object to query, or zero for the storage root
return
the list of MtpObjectInfo

        MtpDevice device = getDevice(deviceName);
        if (device == null) {
            return null;
        }
        if (objectHandle == 0) {
            // all objects in root of storage
            objectHandle = 0xFFFFFFFF;
        }
        int[] handles = device.getObjectHandles(storageId, 0, objectHandle);
        if (handles == null) {
            return null;
        }

        int length = handles.length;
        ArrayList<MtpObjectInfo> objectList = new ArrayList<MtpObjectInfo>(length);
        for (int i = 0; i < length; i++) {
            MtpObjectInfo info = device.getObjectInfo(handles[i]);
            if (info == null) {
                Log.w(TAG, "getObjectInfo failed");
            } else {
                objectList.add(info);
            }
        }
        return objectList;
    
public java.util.ListgetStorageList(java.lang.String deviceName)
Retrieves a list of all {@link android.mtp.MtpStorageInfo} for the MTP or PTP device with the given USB device name

param
deviceName the name of the USB device
return
the list of MtpStorageInfo

        MtpDevice device = getDevice(deviceName);
        if (device == null) {
            return null;
        }
        int[] storageIds = device.getStorageIds();
        if (storageIds == null) {
            return null;
        }

        int length = storageIds.length;
        ArrayList<MtpStorageInfo> storageList = new ArrayList<MtpStorageInfo>(length);
        for (int i = 0; i < length; i++) {
            MtpStorageInfo info = device.getStorageInfo(storageIds[i]);
            if (info == null) {
                Log.w(TAG, "getStorageInfo failed");
            } else {
                storageList.add(info);
            }
        }
        return storageList;
    
public byte[]getThumbnail(java.lang.String deviceName, int objectHandle)
Returns the thumbnail data for an object as a byte array.

param
deviceName the name of the USB device containing the object
param
objectHandle handle of the object to read
return
the object's thumbnail, or null if reading fails

        MtpDevice device = getDevice(deviceName);
        if (device == null) {
            return null;
        }
        return device.getThumbnail(objectHandle);
    
public booleanimportFile(java.lang.String deviceName, int objectHandle, java.lang.String destPath)
Copies the data for an object to a file in external storage.

param
deviceName the name of the USB device containing the object
param
objectHandle handle of the object to read
param
destPath path to destination for the file transfer. This path should be in the external storage as defined by {@link android.os.Environment#getExternalStorageDirectory}
return
true if the file transfer succeeds

        MtpDevice device = getDevice(deviceName);
        if (device == null) {
            return false;
        }
        return device.importFile(objectHandle, destPath);
    
public static booleanisCamera(android.hardware.usb.UsbDevice device)
Tests to see if a {@link android.hardware.usb.UsbDevice} supports the PTP protocol (typically used by digital cameras)

param
device the device to test
return
true if the device is a PTP device.


                                 
       
                                 
           

                                
           
    

                                        
         
        int count = device.getInterfaceCount();
        for (int i = 0; i < count; i++) {
            UsbInterface intf = device.getInterface(i);
            if (intf.getInterfaceClass() == UsbConstants.USB_CLASS_STILL_IMAGE &&
                    intf.getInterfaceSubclass() == 1 &&
                    intf.getInterfaceProtocol() == 1) {
                return true;
            }
        }
        return false;
    
private android.mtp.MtpDeviceopenDeviceLocked(android.hardware.usb.UsbDevice usbDevice)
Opens the {@link android.hardware.usb.UsbDevice} for an MTP or PTP device and return an {@link android.mtp.MtpDevice} for it.

param
device the device to open
return
an MtpDevice for the device.

        if (isCamera(usbDevice)) {
            if (!mUsbManager.hasPermission(usbDevice)) {
                mUsbManager.requestPermission(usbDevice, mPermissionIntent);
            } else {
                UsbDeviceConnection connection = mUsbManager.openDevice(usbDevice);
                if (connection != null) {
                    MtpDevice mtpDevice = new MtpDevice(usbDevice);
                    if (mtpDevice.open(connection)) {
                        mDevices.put(usbDevice.getDeviceName(), mtpDevice);
                        return mtpDevice;
                    }
                }
            }
        }
        return null;
    
public voidremoveListener(com.android.camerabrowser.MtpClient$Listener listener)
Unregisters a {@link android.mtp.MtpClient.Listener} interface.

param
listener the listener to unregister

        synchronized (mDevices) {
            mListeners.remove(listener);
        }