SWT DirectoryDialog не показывает Android-смартфон

#java #swt

Вопрос:

Я написал приложение для администрирования своих аудиофайлов с помощью Java/SWT. Теперь я хочу скопировать файлы с ПК на свой мобильный телефон, который является устройством Samsung Galaxy A30, Android 10. Когда я подключаю телефон к ПК (Win 10), он отображается в проводнике в разделе «Этот ПК» как «Galaxy A30s», и я могу прокручивать папки и файлы просто отлично. Однако, когда я открываю каталог SWT DirectoryDialog, телефон там не указан. У кого-нибудь есть подсказка, почему это происходит и как это решить? Большое спасибо.

Вот фрагмент вызывающего кода:

 AudioFilesCopy afc = new AudioFilesCopy(shell);
        if (afc.selectDirectory() != null) {
            Cursor waitCursor = shell.getDisplay().getSystemCursor(SWT.CURSOR_WAIT);
            shell.setCursor(waitCursor);
            afc.copyFiles(plSongs);
            shell.setCursor(null);
        }
 

Это тот самый класс:

 import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;

import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.DirectoryDialog;
import org.eclipse.swt.widgets.Shell;

public class AudioFilesCopy {
    
    private Shell shell;
    private Logger logger;
    private String selDirectory;
    
    public AudioFilesCopy(Shell parent) {
        
        logger =  java.util.logging.Logger.getLogger(this.getClass().getName());
        logger.addHandler(MusicCatalog.fileHandler);

        shell = new Shell(parent, SWT.BORDER | SWT.RESIZE | SWT.Close | SWT.MAX | SWT.MIN | SWT.PRIMARY_MODAL);
        shell.setLayout(new FillLayout());
    }

    public String selectDirectory() {
        
        DirectoryDialog dialog = new DirectoryDialog(shell);
        dialog.setFilterPath(System.getProperty("user.home")   "\TransferOrdner");
        selDirectory = dialog.open();
        return selDirectory;
    }
 
    public void copyFiles(String[] plSongs) {
        
        for (int i = 0; i < plSongs.length; i  ) {
            Path source = Paths.get(plSongs[i]);
            Path target = Paths.get(selDirectory, source.getFileName().toString());
//          System.out.println("Copy "   source   " to "   target);
            try {
                Files.copy(source, target, StandardCopyOption.REPLACE_EXISTING, StandardCopyOption.COPY_ATTRIBUTES);
            } catch (IOException e) {
                logger.log(Level.SEVERE, e.getMessage(), e);
            }
        }
    }
}
 

Ответ №1:

Используйте FileDialog вместо DirectoryDialog.

Комментарии:

1. Извините за поздний ответ. Проверена работа в моей системе. Пожалуйста, поделитесь кодом для дальнейшей помощи.

2. сработало ли это, друг? если это не так, что вы сделали, чтобы решить эту проблему? может быть, я тоже смогу поучиться у тебя.

3. Нет, это все еще не работает, и я не знаю, где найти решение. Что я «узнал» из исследования сети, так это то, что Anfdroid 10 подключен к Win 10 с помощью протокола передачи мультимедиа, который не поддерживает ни FileDialog, ни DirectoryDialog. Поэтому я искал способ использовать свое устройство Android 10 в качестве USB-накопителя, но я не нашел способа. Поэтому я решил обратиться за помощью сюда… может быть, существуют классы Java, которые могут обрабатывать MTP? Тем временем я копирую файлы в папку на ПК и использую проводник, чтобы скопировать их оттуда на телефон.

4. Здравствуйте, еще раз извините за поздний ответ. На всякий случай, если вы еще не нашли решение, у меня нет проблем с просмотром устройств MTP с помощью SWT FileDialog. FileDialog fileDialog = new FileDialog(shell); и затем fileDialog.open(); . Убедитесь, что это открытие выполнено из основного класса, в котором размещена корневая оболочка.

5. Если все остальное не удастся, мы могли бы использовать JNI для «подключения» ОС и перехвата вызовов от модулей ОС, которые имеют дело с подключением MTP; но лично я бы не пошел по этой дороге кошмара с шаблоном/ переутомлением. Что касается меня, то я на Android 11, так что, возможно, именно поэтому он работает. В конечном счете, будет лучше перейти на новую версию. Но если проект необходим, вы, возможно, действительно захотите изучить концепции подключения ОС.