1 /* 2 * Copyright (C) 2010 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package android.mtp; 18 19 import android.hardware.usb.UsbDevice; 20 import android.hardware.usb.UsbDeviceConnection; 21 import android.os.ParcelFileDescriptor; 22 import android.util.Log; 23 24 /** 25 * This class represents an MTP or PTP device connected on the USB host bus. An application can 26 * instantiate an object of this type, by referencing an attached {@link 27 * android.hardware.usb.UsbDevice} and then use methods in this class to get information about the 28 * device and objects stored on it, as well as open the connection and transfer data. 29 */ 30 public final class MtpDevice { 31 32 private static final String TAG = "MtpDevice"; 33 34 private final UsbDevice mDevice; 35 36 static { 37 System.loadLibrary("media_jni"); 38 } 39 40 /** 41 * MtpClient constructor 42 * 43 * @param device the {@link android.hardware.usb.UsbDevice} for the MTP or PTP device 44 */ 45 public MtpDevice(UsbDevice device) { 46 mDevice = device; 47 } 48 49 /** 50 * Opens the MTP device. Once the device is open it takes ownership of the 51 * {@link android.hardware.usb.UsbDeviceConnection}. 52 * The connection will be closed when you call {@link #close()} 53 * The connection will also be closed if this method fails. 54 * 55 * @param connection an open {@link android.hardware.usb.UsbDeviceConnection} for the device 56 * @return true if the device was successfully opened. 57 */ 58 public boolean open(UsbDeviceConnection connection) { 59 boolean result = native_open(mDevice.getDeviceName(), connection.getFileDescriptor()); 60 if (!result) { 61 connection.close(); 62 } 63 return result; 64 } 65 66 /** 67 * Closes all resources related to the MtpDevice object. 68 * After this is called, the object can not be used until {@link #open} is called again 69 * with a new {@link android.hardware.usb.UsbDeviceConnection}. 70 */ 71 public void close() { 72 native_close(); 73 } 74 75 @Override 76 protected void finalize() throws Throwable { 77 try { 78 native_close(); 79 } finally { 80 super.finalize(); 81 } 82 } 83 84 /** 85 * Returns the name of the USB device 86 * This returns the same value as {@link android.hardware.usb.UsbDevice#getDeviceName} 87 * for the device's {@link android.hardware.usb.UsbDevice} 88 * 89 * @return the device name 90 */ 91 public String getDeviceName() { 92 return mDevice.getDeviceName(); 93 } 94 95 /** 96 * Returns the USB ID of the USB device. 97 * This returns the same value as {@link android.hardware.usb.UsbDevice#getDeviceId} 98 * for the device's {@link android.hardware.usb.UsbDevice} 99 * 100 * @return the device ID 101 */ 102 public int getDeviceId() { 103 return mDevice.getDeviceId(); 104 } 105 106 @Override 107 public String toString() { 108 return mDevice.getDeviceName(); 109 } 110 111 /** 112 * Returns the {@link MtpDeviceInfo} for this device 113 * 114 * @return the device info 115 */ 116 public MtpDeviceInfo getDeviceInfo() { 117 return native_get_device_info(); 118 } 119 120 /** 121 * Returns the list of IDs for all storage units on this device 122 * Information about each storage unit can be accessed via {@link #getStorageInfo}. 123 * 124 * @return the list of storage IDs 125 */ 126 public int[] getStorageIds() { 127 return native_get_storage_ids(); 128 } 129 130 /** 131 * Returns the list of object handles for all objects on the given storage unit, 132 * with the given format and parent. 133 * Information about each object can be accessed via {@link #getObjectInfo}. 134 * 135 * @param storageId the storage unit to query 136 * @param format the format of the object to return, or zero for all formats 137 * @param objectHandle the parent object to query, or zero for the storage root 138 * @return the object handles 139 */ 140 public int[] getObjectHandles(int storageId, int format, int objectHandle) { 141 return native_get_object_handles(storageId, format, objectHandle); 142 } 143 144 /** 145 * Returns the data for an object as a byte array. 146 * This call may block for an arbitrary amount of time depending on the size 147 * of the data and speed of the devices. 148 * 149 * @param objectHandle handle of the object to read 150 * @param objectSize the size of the object (this should match 151 * {@link MtpObjectInfo#getCompressedSize} 152 * @return the object's data, or null if reading fails 153 */ 154 public byte[] getObject(int objectHandle, int objectSize) { 155 return native_get_object(objectHandle, objectSize); 156 } 157 158 /** 159 * Returns the thumbnail data for an object as a byte array. 160 * The size and format of the thumbnail data can be determined via 161 * {@link MtpObjectInfo#getThumbCompressedSize} and 162 * {@link MtpObjectInfo#getThumbFormat}. 163 * For typical devices the format is JPEG. 164 * 165 * @param objectHandle handle of the object to read 166 * @return the object's thumbnail, or null if reading fails 167 */ 168 public byte[] getThumbnail(int objectHandle) { 169 return native_get_thumbnail(objectHandle); 170 } 171 172 /** 173 * Retrieves the {@link MtpStorageInfo} for a storage unit. 174 * 175 * @param storageId the ID of the storage unit 176 * @return the MtpStorageInfo 177 */ 178 public MtpStorageInfo getStorageInfo(int storageId) { 179 return native_get_storage_info(storageId); 180 } 181 182 /** 183 * Retrieves the {@link MtpObjectInfo} for an object. 184 * 185 * @param objectHandle the handle of the object 186 * @return the MtpObjectInfo 187 */ 188 public MtpObjectInfo getObjectInfo(int objectHandle) { 189 return native_get_object_info(objectHandle); 190 } 191 192 /** 193 * Deletes an object on the device. This call may block, since 194 * deleting a directory containing many files may take a long time 195 * on some devices. 196 * 197 * @param objectHandle handle of the object to delete 198 * @return true if the deletion succeeds 199 */ 200 public boolean deleteObject(int objectHandle) { 201 return native_delete_object(objectHandle); 202 } 203 204 /** 205 * Retrieves the object handle for the parent of an object on the device. 206 * 207 * @param objectHandle handle of the object to query 208 * @return the parent's handle, or zero if it is in the root of the storage 209 */ 210 public long getParent(int objectHandle) { 211 return native_get_parent(objectHandle); 212 } 213 214 /** 215 * Retrieves the ID of the storage unit containing the given object on the device. 216 * 217 * @param objectHandle handle of the object to query 218 * @return the object's storage unit ID 219 */ 220 public long getStorageId(int objectHandle) { 221 return native_get_storage_id(objectHandle); 222 } 223 224 /** 225 * Copies the data for an object to a file in external storage. 226 * This call may block for an arbitrary amount of time depending on the size 227 * of the data and speed of the devices. 228 * 229 * @param objectHandle handle of the object to read 230 * @param destPath path to destination for the file transfer. 231 * This path should be in the external storage as defined by 232 * {@link android.os.Environment#getExternalStorageDirectory} 233 * @return true if the file transfer succeeds 234 */ 235 public boolean importFile(int objectHandle, String destPath) { 236 return native_import_file(objectHandle, destPath); 237 } 238 239 // used by the JNI code 240 private int mNativeContext; 241 242 private native boolean native_open(String deviceName, int fd); 243 private native void native_close(); 244 private native MtpDeviceInfo native_get_device_info(); 245 private native int[] native_get_storage_ids(); 246 private native MtpStorageInfo native_get_storage_info(int storageId); 247 private native int[] native_get_object_handles(int storageId, int format, int objectHandle); 248 private native MtpObjectInfo native_get_object_info(int objectHandle); 249 private native byte[] native_get_object(int objectHandle, int objectSize); 250 private native byte[] native_get_thumbnail(int objectHandle); 251 private native boolean native_delete_object(int objectHandle); 252 private native long native_get_parent(int objectHandle); 253 private native long native_get_storage_id(int objectHandle); 254 private native boolean native_import_file(int objectHandle, String destPath); 255 } 256