blob: 8310579066c504ce04ba3a88cc6cf29ac8b4b825 [file] [log] [blame]
Mike Lockwood8182e722010-12-30 15:38:45 -05001/*
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
17package android.mtp;
18
Mike Lockwoodc4308f02011-03-01 08:04:54 -080019import android.hardware.usb.UsbDevice;
Mike Lockwoodacc29cc2011-03-11 08:18:08 -050020import android.hardware.usb.UsbDeviceConnection;
Mike Lockwood8182e722010-12-30 15:38:45 -050021import android.os.ParcelFileDescriptor;
22import android.util.Log;
23
24/**
Scott Main0cdd9f72011-05-05 15:53:44 -070025 * 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.
Mike Lockwood8182e722010-12-30 15:38:45 -050029 */
30public 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
Mike Lockwood540380f2011-02-09 21:48:53 -050040 /**
41 * MtpClient constructor
42 *
Mike Lockwoodc4308f02011-03-01 08:04:54 -080043 * @param device the {@link android.hardware.usb.UsbDevice} for the MTP or PTP device
Mike Lockwood540380f2011-02-09 21:48:53 -050044 */
Mike Lockwood8182e722010-12-30 15:38:45 -050045 public MtpDevice(UsbDevice device) {
46 mDevice = device;
47 }
48
Mike Lockwood540380f2011-02-09 21:48:53 -050049 /**
Mike Lockwoodacc29cc2011-03-11 08:18:08 -050050 * 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.
Mike Lockwood540380f2011-02-09 21:48:53 -050054 *
Mike Lockwoodacc29cc2011-03-11 08:18:08 -050055 * @param connection an open {@link android.hardware.usb.UsbDeviceConnection} for the device
Mike Lockwood540380f2011-02-09 21:48:53 -050056 * @return true if the device was successfully opened.
57 */
Mike Lockwoodacc29cc2011-03-11 08:18:08 -050058 public boolean open(UsbDeviceConnection connection) {
59 boolean result = native_open(mDevice.getDeviceName(), connection.getFileDescriptor());
60 if (!result) {
61 connection.close();
Mike Lockwood8182e722010-12-30 15:38:45 -050062 }
Mike Lockwoodacc29cc2011-03-11 08:18:08 -050063 return result;
Mike Lockwood8182e722010-12-30 15:38:45 -050064 }
65
Mike Lockwood540380f2011-02-09 21:48:53 -050066 /**
Mike Lockwood11dd5ae2011-04-01 14:00:08 -040067 * 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}.
Mike Lockwood540380f2011-02-09 21:48:53 -050070 */
Mike Lockwood8182e722010-12-30 15:38:45 -050071 public void close() {
Mike Lockwood8182e722010-12-30 15:38:45 -050072 native_close();
73 }
74
75 @Override
76 protected void finalize() throws Throwable {
Mike Lockwood8182e722010-12-30 15:38:45 -050077 try {
78 native_close();
79 } finally {
80 super.finalize();
81 }
82 }
83
Mike Lockwood540380f2011-02-09 21:48:53 -050084 /**
85 * Returns the name of the USB device
Mike Lockwood11dd5ae2011-04-01 14:00:08 -040086 * This returns the same value as {@link android.hardware.usb.UsbDevice#getDeviceName}
87 * for the device's {@link android.hardware.usb.UsbDevice}
Mike Lockwood540380f2011-02-09 21:48:53 -050088 *
89 * @return the device name
90 */
Mike Lockwood8182e722010-12-30 15:38:45 -050091 public String getDeviceName() {
92 return mDevice.getDeviceName();
93 }
94
Mike Lockwood540380f2011-02-09 21:48:53 -050095 /**
Mike Lockwood11dd5ae2011-04-01 14:00:08 -040096 * 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}
Mike Lockwood540380f2011-02-09 21:48:53 -050099 *
100 * @return the device ID
101 */
Mike Lockwood8182e722010-12-30 15:38:45 -0500102 public int getDeviceId() {
103 return mDevice.getDeviceId();
104 }
105
106 @Override
107 public String toString() {
108 return mDevice.getDeviceName();
109 }
110
Mike Lockwood540380f2011-02-09 21:48:53 -0500111 /**
Mike Lockwood11dd5ae2011-04-01 14:00:08 -0400112 * Returns the {@link MtpDeviceInfo} for this device
Mike Lockwood540380f2011-02-09 21:48:53 -0500113 *
114 * @return the device info
115 */
Mike Lockwood8182e722010-12-30 15:38:45 -0500116 public MtpDeviceInfo getDeviceInfo() {
117 return native_get_device_info();
118 }
119
Mike Lockwood540380f2011-02-09 21:48:53 -0500120 /**
121 * Returns the list of IDs for all storage units on this device
Mike Lockwood11dd5ae2011-04-01 14:00:08 -0400122 * Information about each storage unit can be accessed via {@link #getStorageInfo}.
Mike Lockwood540380f2011-02-09 21:48:53 -0500123 *
Mike Lockwood11dd5ae2011-04-01 14:00:08 -0400124 * @return the list of storage IDs
Mike Lockwood540380f2011-02-09 21:48:53 -0500125 */
Mike Lockwood8182e722010-12-30 15:38:45 -0500126 public int[] getStorageIds() {
127 return native_get_storage_ids();
128 }
129
Mike Lockwood540380f2011-02-09 21:48:53 -0500130 /**
131 * Returns the list of object handles for all objects on the given storage unit,
132 * with the given format and parent.
Mike Lockwood11dd5ae2011-04-01 14:00:08 -0400133 * Information about each object can be accessed via {@link #getObjectInfo}.
Mike Lockwood540380f2011-02-09 21:48:53 -0500134 *
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 */
Mike Lockwood8182e722010-12-30 15:38:45 -0500140 public int[] getObjectHandles(int storageId, int format, int objectHandle) {
141 return native_get_object_handles(storageId, format, objectHandle);
142 }
143
Mike Lockwood540380f2011-02-09 21:48:53 -0500144 /**
145 * Returns the data for an object as a byte array.
Mike Lockwood11dd5ae2011-04-01 14:00:08 -0400146 * This call may block for an arbitrary amount of time depending on the size
147 * of the data and speed of the devices.
Mike Lockwood540380f2011-02-09 21:48:53 -0500148 *
149 * @param objectHandle handle of the object to read
150 * @param objectSize the size of the object (this should match
Mike Lockwood11dd5ae2011-04-01 14:00:08 -0400151 * {@link MtpObjectInfo#getCompressedSize}
Mike Lockwood540380f2011-02-09 21:48:53 -0500152 * @return the object's data, or null if reading fails
153 */
Mike Lockwood8182e722010-12-30 15:38:45 -0500154 public byte[] getObject(int objectHandle, int objectSize) {
155 return native_get_object(objectHandle, objectSize);
156 }
157
Mike Lockwood540380f2011-02-09 21:48:53 -0500158 /**
159 * Returns the thumbnail data for an object as a byte array.
Mike Lockwood11dd5ae2011-04-01 14:00:08 -0400160 * 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.
Mike Lockwood540380f2011-02-09 21:48:53 -0500164 *
165 * @param objectHandle handle of the object to read
166 * @return the object's thumbnail, or null if reading fails
167 */
Mike Lockwood8182e722010-12-30 15:38:45 -0500168 public byte[] getThumbnail(int objectHandle) {
169 return native_get_thumbnail(objectHandle);
170 }
171
Mike Lockwood540380f2011-02-09 21:48:53 -0500172 /**
Mike Lockwood11dd5ae2011-04-01 14:00:08 -0400173 * Retrieves the {@link MtpStorageInfo} for a storage unit.
Mike Lockwood540380f2011-02-09 21:48:53 -0500174 *
175 * @param storageId the ID of the storage unit
176 * @return the MtpStorageInfo
177 */
Mike Lockwood8182e722010-12-30 15:38:45 -0500178 public MtpStorageInfo getStorageInfo(int storageId) {
179 return native_get_storage_info(storageId);
180 }
181
Mike Lockwood540380f2011-02-09 21:48:53 -0500182 /**
Mike Lockwood11dd5ae2011-04-01 14:00:08 -0400183 * Retrieves the {@link MtpObjectInfo} for an object.
Mike Lockwood540380f2011-02-09 21:48:53 -0500184 *
185 * @param objectHandle the handle of the object
186 * @return the MtpObjectInfo
187 */
Mike Lockwood8182e722010-12-30 15:38:45 -0500188 public MtpObjectInfo getObjectInfo(int objectHandle) {
189 return native_get_object_info(objectHandle);
190 }
191
Mike Lockwood540380f2011-02-09 21:48:53 -0500192 /**
Mike Lockwood11dd5ae2011-04-01 14:00:08 -0400193 * 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.
Mike Lockwood540380f2011-02-09 21:48:53 -0500196 *
197 * @param objectHandle handle of the object to delete
198 * @return true if the deletion succeeds
199 */
Mike Lockwood8182e722010-12-30 15:38:45 -0500200 public boolean deleteObject(int objectHandle) {
201 return native_delete_object(objectHandle);
202 }
203
Mike Lockwood540380f2011-02-09 21:48:53 -0500204 /**
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 */
Mike Lockwood8182e722010-12-30 15:38:45 -0500210 public long getParent(int objectHandle) {
211 return native_get_parent(objectHandle);
212 }
213
Mike Lockwood540380f2011-02-09 21:48:53 -0500214 /**
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 */
Mike Lockwood62cfeeb2011-03-11 18:39:03 -0500220 public long getStorageId(int objectHandle) {
Mike Lockwood8182e722010-12-30 15:38:45 -0500221 return native_get_storage_id(objectHandle);
222 }
223
Mike Lockwood540380f2011-02-09 21:48:53 -0500224 /**
225 * Copies the data for an object to a file in external storage.
Mike Lockwood11dd5ae2011-04-01 14:00:08 -0400226 * This call may block for an arbitrary amount of time depending on the size
227 * of the data and speed of the devices.
Mike Lockwood540380f2011-02-09 21:48:53 -0500228 *
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 */
Mike Lockwood8182e722010-12-30 15:38:45 -0500235 public boolean importFile(int objectHandle, String destPath) {
236 return native_import_file(objectHandle, destPath);
237 }
238
239 // used by the JNI code
Ashok Bhate2e59322013-12-17 19:04:19 +0000240 private long mNativeContext;
Mike Lockwood8182e722010-12-30 15:38:45 -0500241
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}