Мтп/тп Android

Я пытаюсь скопировать файлы моей камеры, которые используют PTP, на свой планшет. Я использую Android API MTPDevice (https://developer.android.com/reference/android/mtp/MtpDevice.html#importFile%28int,%20java.lang.String%29), у меня есть запрос на необходимое разрешение (android.mtp .MtpClient.action.USB_PERMISSION).

Я открываю устройство, функция возвращает значение true и открывает USBConnection (подключение OK).

Я пытаюсь импортировать все файлы камеры во временную папку на своем планшете (/mnt/sdcard/tmpFolder). Путь существует на моем планшете, но когда я передаю его функции importFiles, у меня возникает ошибка:

[ЛОГКАТ]

MtpDevice: readObject: /mnt/sdcard/tmpFolder
MtpDevice: open failed for /mnt/sdcard/tmpFolder
Debug: File import KO

У меня есть попытка пути не существует, у меня есть сообщение:

[ЛОГКАТ]

MtpDevice: readObject: /mnt/sdcard/tptp
MtpDevice: readResponse failed
Debug: File import KO

Кто-нибудь может мне помочь?

Спасибо

  @Background
@DebugLog
public void getMTPDevice() {
    HashMap<String, UsbDevice> deviceList = manager.getDeviceList();
    Iterator<UsbDevice> deviceIterator = deviceList.values().iterator();
    if (deviceIterator.hasNext()) {
        UsbDevice usbDevice = deviceIterator.next();
        device = openDeviceLocked(usbDevice);
        if(device!=null){
                File folder = returnTempFolderCamera();
                if(folder.exists()){
                    Log.d("Debug", "Folder exist /mnt/sdcard/tmpFolder");
                    if(device.importFile(0,folder.getPath()))
                    {
                        Toast.makeText(this, "File import OK", Toast.LENGTH_LONG).show();
                        Log.d("Debug", "Files import OK");
                    }else {
                        Toast.makeText(this, "File import KO", Toast.LENGTH_LONG).show();
                        Log.d("Debug", "Files import KO");
                    }
                }
        }
    }
}/**
 * Opens the {@link android.hardware.usb.UsbDevice} for an MTP or PTP device
 * and return an {@link android.mtp.MtpDevice} for it.
 *
 * @param usbDevice
 *            the device to open
 * @return an MtpDevice for the device.
 */
@DebugLog
private MtpDevice openDeviceLocked(UsbDevice usbDevice) {
    String deviceName = usbDevice.getDeviceName();
    byte[] data = new byte[128];
    int TIMEOUT = 0;
    boolean forceClaim = true;
    // don't try to open devices that we have decided to ignore
    // or are currently asking permission for
    if (isCamera(usbDevice)
            && !mRequestPermissionDevices.contains(deviceName)) {
        if (!manager.hasPermission(usbDevice)) {
            manager.requestPermission(usbDevice, mPermissionIntent);
            mRequestPermissionDevices.add(deviceName);
        } else {
            UsbInterface intf = usbDevice.getInterface(0);
            UsbEndpoint endpoint = intf.getEndpoint(0);
            UsbDeviceConnection connection = manager.openDevice(usbDevice);
            connection.claimInterface(intf, forceClaim);
            connection.bulkTransfer(endpoint, data, data.length, TIMEOUT);
            if (connection != null) {
                MtpDevice mtpDevice = new MtpDevice(usbDevice);
                if (mtpDevice.open(connection)) {
                    mDevices.put(usbDevice.getDeviceName(), mtpDevice);
                    return mtpDevice;
                }
            }
        }
    }
    return null;
}
        private File returnTempFolder(){
            File tmp = new File(Environment.getExternalStorageDirectory().getAbsolutePath()+"/tmpFolder");
            return tmp;
        }

person Marine Teissier    schedule 11.01.2017    source источник
comment
have request necessary permission, and write in the manifest. Какие это будут? В остальном ваш пост довольно неясен, когда и где вы размещаете сообщения, для каких именно путей.   -  person greenapps    schedule 11.01.2017
comment
createTempFolderCamera(). Неверное имя функции, так как она не создает папку, а только возвращает объект File для папки.   -  person greenapps    schedule 11.01.2017
comment
Log.d("Debug", "File exist");. Вы имеете в виду «папка существует»?   -  person greenapps    schedule 11.01.2017
comment
android.mtp.MtpClient.action.USB_PERMISSION; за разрешение.   -  person Marine Teissier    schedule 12.01.2017
comment
У меня есть сообщение для /mnt/sdcard/tmpFolder (путь существует) MtpDevice: readObject: /mnt/sdcard/tmpFolder MtpDevice: не удалось открыть для /mnt/sdcard/tmpFolder, и у меня есть другое сообщение для /mnt/sdcard/tptp кого не существует.   -  person Marine Teissier    schedule 12.01.2017
comment
Какие сообщения? Я сказал, что ваш пост неясен, и вы только повторяетесь. Это ничего не проясняет. Пожалуйста, перефразируйте свой пост. Сделайте это достойной историей. И ты не реагировал на все, что я говорил. Так что, пожалуйста, если вам действительно нужна помощь. Отредактируйте свой пост вместо того, чтобы использовать комментарии.   -  person greenapps    schedule 12.01.2017
comment
Там еще много неясного. Первое замечание: вы никогда не должны жестко кодировать такой оператор журнала. Log.d("Debug", "Folder exist /mnt/sdcard/tmpFolder");. Лучше поменять на Log.d("Debug", "Folder exists: "+ folder.getAbsolutePath());.   -  person greenapps    schedule 12.01.2017
comment
MtpDevice: readObject: /mnt/sdcard/tmpFolder. Пожалуйста, покажите фрагмент кода, который выдает это сообщение. Я не понимаю, почему эта функция пытается прочитать ту папку, в которую она должна записывать файлы.   -  person greenapps    schedule 12.01.2017
comment
if(folder.exists()){ У вас нет отчета журнала или всплывающего уведомления на случай, если папка не существует. Почему нет? Почему вы не информируете пользователя правильно? И у вас нет кода для создания этой папки. Вы только создаете имя. Я уже говорил это раньше, но ты не реагировал.   -  person greenapps    schedule 12.01.2017


Ответы (2)


Что касается сообщения выше, я скачал проект github Gallery3d и изучил код MtpClient.java, затем нашел разницу,

Раздел кода с github

String destPath = new File(dest,objInfo.getName()).getAbsolutePath();
int objectId = objInfo.getObjectHandle();

boolean result = mtpClient.getDeviceList().get(i).importFile(objectId, destPath);

Дело в том, что 2-й параметр importFile(objectId, destPath ) "destPath", необходимо указать путь к папке + имя файла, тогда имя файла не должно быть изменено исходное имя файла

Но в оригинальном авторе вопроса вы просто указываете путь к папке во втором параметре.

person dalry    schedule 05.07.2018

Для тех, у кого такая же проблема:

Решение (найдено на github):

MtpClient (https://android.googlesource.com/platform/packages/apps/Gallery2/+/jb-dev/src/com/android/gallery3d/data/MtpClient.java)

@Background
@DebugLog
public void importFiles() {
    MtpClient mtpClient = new MtpClient(this);
    mtpClient.getDeviceList();
    for (int i = 0; i < mtpClient.getDeviceList().size(); i++) {
        int[] tab = mtpClient.getDeviceList().get(i).getObjectHandles(mtpClient.getDeviceList().get(i).getStorageIds()[0], 0, 0);
        for (int j = 0; j < tab.length; j++) {
            File dest = Environment.getExternalStorageDirectory();
            // NAME_IMPORTED_FOLDER = tmpFolder
            dest = new File(dest, NAME_IMPORTED_FOLDER);
            dest.mkdirs();
            MtpObjectInfo objInfo = mtpClient.getDeviceList().get(i).getObjectInfo(tab[j]);
            if (objInfo != null) {
                String destPath = new File(dest, objInfo.getName()).getAbsolutePath();
                int objectId = objInfo.getObjectHandle();
                // Succes !!
                boolean result = mtpClient.getDeviceList().get(i).importFile(objectId, destPath);
            }
        }
    }
    mtpClient.close();
}
person Marine Teissier    schedule 13.01.2017