#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, так что, возможно, именно поэтому он работает. В конечном счете, будет лучше перейти на новую версию. Но если проект необходим, вы, возможно, действительно захотите изучить концепции подключения ОС.