Как предотвратить открытие всплывающих окон "Невозможно открыть устройство MTP"?
Я часто подключаю свое устройство Android к USB-накопителю просто в целях зарядки, не намереваясь использовать файловую систему (и с выключенным экраном или с настройками USB в режиме "только зарядка", что не позволяет телефону разрешить подключение для передачи данных быть произведенным). Однако, когда я делаю это, я часто получаю очень много раздражающих всплывающих окон, которые выглядят как всплывающее окно, показанное на рисунке ниже:
В идеале, должен быть какой-то способ настроить оконный менеджер, чтобы он не отображал эти всплывающие окна в первую очередь (без отключения автоматического монтирования, чтобы я все еще мог - в некоторых случаях - использовать устройство в качестве файловой системы без необходимости монтировать его вручную, т. е. когда настройка USB телефона находится в режиме "MTP" и экран разблокирован). Если это не удастся, было бы идеально, если бы существовала простая команда, которую я мог бы использовать для уничтожения всех экземпляров этого всплывающего окна (без одновременного уничтожения остальной части оконного менеджера). В противном случае решения по отключению автоматического монтирования этого конкретного устройства (без отключения всех автоматических подключений) будут приемлемым решением.
Любые предложения о том, как предотвратить появление этого всплывающего окна или уничтожить несколько экземпляров всплывающего окна в одной команде?
Для большего контекста я использую Ubuntu 14.04 LTS; Я не уверен, что Gnome или Nemo ответственны за эту ошибку (я знаю, что мой ярлык "Домашний каталог" вызывает "nemo", но я почти уверен, что в системе есть также приложения на основе Gnome, есть ~/.gnome
а также ~/.gnome2
каталог и т. д., чтобы это мог быть гном).
8 ответов
Итак, у вас есть это:
Файловый менеджер представляет те сообщения об ошибках, которые приходят от GVfs, которая передает информацию из libmtp.
Предотвращение появления файловых менеджеров
К сожалению, я еще не нашел способ подавления всплывающих окон с ошибками в файловом менеджере GNOME/MATE/Cinnamon. Возможно, когда-нибудь я посмотрю исходный код, чтобы увидеть, где ошибка может быть отключена или перехвачена.
Поскольку у меня нет ответа на этот вопрос, давайте перейдем к вашему следующему лучшему приемлемому варианту, который...
Закрытие всплывающих окон файлового менеджера по команде
Вот скрипт, который можно использовать для очистки всплывающих окон в GNOME, MATE и Cinnamon:
#!/bin/bash
function list_empty_windows() {
wmctrl -lp | awk "{if(\$5==\"\"){print\$3,\$1}}"
}
function list_wm_pids() {
ps aux | grep cinnamon | perl -pe 's/.*\+\s+(\d+)\s+.*/\1/'
pidof nautilus | tr ' ' '\n'
pidof caja | tr ' ' '\n'
pidof nemo | tr ' ' '\n'
}
function list_popup_windows() {
local empty_window_file=$(mktemp)
local window_manager_pid_file=$(mktemp)
list_empty_windows > "$empty_window_file"
list_wm_pids | sort > "$window_manager_pid_file"
join "$empty_window_file" "$window_manager_pid_file"
}
function main() {
list_popup_windows | cut -d ' ' -f 2 | xargs -n1 -P100 wmctrl -ic
}
main
Если вы хотите запомнить простую команду, они закроют все окна в вашем файловом менеджере и заставят ваш рабочий стол перезапустить ваш файловый менеджер:
- ГНОМ:
killall nautilus
- ПРИЯТЕЛЬ:
killall caja
- Корица:
killall nemo
Отключение автонастройки Google Pixel
Кажется, не существует способа игнорировать только Google Pixel.
Я не рекомендую это, и я не проверял это сам, но чтобы выделить Google Pixel, вам, возможно, придется закомментировать вендор продукта 18d1 4ee1 (Google Pixel) и вендор продукта 18ee 1 4ee2 (Google Pixel отладка) правила и hwdb.
Вы можете найти записи с помощью этой команды:
grep -ri '18d1.*4ee[12]' /lib/udev
После комментирования записей udev в Google Pixel может потребоваться перезапустить среду рабочего стола, перезагрузить компьютер и / или выполнить некоторую комбинацию следующих команд:
sudo udevadm hwdb --update
sudo udevadm control --reload-rules
sudo udevadm trigger
Опять же, это не проверено, и я не рекомендую это, особенно потому, что для того, чтобы снова смонтировать Google Pixel, вам придется отменить изменения udev, сделанные вручную.
объяснение
В соответствии с /var/log/syslog
GNOME вызывает ошибку, потому что USB-устройство исчезло при второй попытке его инициализации:
Jan 24 01:32:41 node51 kernel: [613604.065259] usb 3-2: new SuperSpeed USB device number 96 using xhci_hcd
Jan 24 01:32:41 node51 kernel: [613604.082734] usb 3-2: New USB device found, idVendor=18d1, idProduct=4ee1
Jan 24 01:32:41 node51 kernel: [613604.082739] usb 3-2: New USB device strings: Mfr=1, Product=2, SerialNumber=3
Jan 24 01:32:41 node51 kernel: [613604.082741] usb 3-2: Product: Pixel
Jan 24 01:32:41 node51 kernel: [613604.082743] usb 3-2: Manufacturer: Google
Jan 24 01:32:41 node51 kernel: [613604.082745] usb 3-2: SerialNumber: XXXXXXXXXXXX
Jan 24 01:32:41 node51 kernel: [613604.083855] usb 3-2: Enable of device-initiated U1 failed.
Jan 24 01:32:41 node51 kernel: [613604.084154] usb 3-2: Enable of device-initiated U2 failed.
Jan 24 01:32:42 node51 org.gtk.vfs.Daemon[4988]: Device 0 (VID=18d1 and PID=4ee1) is a Google Inc (for LG Electronics/Samsung) Nexus 4/5/7/10 (MTP).
Jan 24 01:32:43 node51 org.gtk.vfs.GPhoto2VolumeMonitor[4988]: (process:5256): GVFS-GPhoto2-WARNING **: device (null) has no BUSNUM property, ignoring
Jan 24 01:33:34 node51 org.gtk.vfs.Daemon[4988]: PTP_ERROR_IO: failed to open session, trying again after resetting USB interface
Jan 24 01:33:34 node51 org.gtk.vfs.Daemon[4988]: LIBMTP libusb: Attempt to reset device
Jan 24 01:33:34 node51 org.gtk.vfs.Daemon[4988]: inep: usb_get_endpoint_status(): No such device
Jan 24 01:33:34 node51 org.gtk.vfs.Daemon[4988]: outep: usb_get_endpoint_status(): No such device
Jan 24 01:33:34 node51 org.gtk.vfs.Daemon[4988]: libusb_open() failed!: No such device
Jan 24 01:33:34 node51 org.gtk.vfs.Daemon[4988]: LIBMTP PANIC: Could not init USB on second attempt
Jan 24 01:33:34 node51 org.gtk.vfs.Daemon[4988]: ** (gvfsd:5151): WARNING **: dbus_mount_reply: Error from org.gtk.vfs.Mountable.mount(): Unable to open MTP device '[usb:003,096]'
В приведенном выше примере GVfs через libmtp идентифицировали устройство 096 с шиной USB 003 как устройство Google Pixel, но устройство Google Pixel уже отключилось. При следующем подключении Google Pixel Linux назначит новый идентификатор устройства.
Ошибка libmtp, потому что он все еще пытается работать с исчезнувшим устройством. GVfs обнаруживает ошибку и перенаправляет ее в файлы GNOME или какой-либо другой файловый менеджер на основе GNOME.
Кто виноват?
Исходя из того, что я обнаружил, у них есть возможности для улучшения:
libmtp
libmtp, вероятно, является наиболее ответственным в возникновении этой проблемы.
Это должно улучшить обработку ошибок, когда устройство MTP подключено и внезапно отключено. Ошибка должна быть передана, только если устройство все еще существует. Если USB-устройство не существует, нет смысла сбрасывать его.
Android
Android может улучшить реализацию MTP, чтобы он не отключался сразу после подключения к компьютеру.
Сообщить о проблемах на Android
Наутилус / Каха / Немо
Было бы неплохо, если бы эти программы предлагали подавлять сообщения об ошибках или отображать их менее всплывающим образом.
Сообщить о проблемах в GNOME
Сообщить о проблемах MATE Caja
Сообщить о проблемах в Linux Mint Nemo
У меня есть обходной путь для этого на Немо:
Перейдите в " Редактирование"> "Установки"> "Поведение" и в разделе " Обработка мультимедиа" снимите флажок "Автоматически монтировать съемные носители при вставке и при запуске".
По завершении зарядки телефона вы можете снова включить опцию, чтобы возобновить поведение по умолчанию.
sudo apt-get install mtp-tools mtpfs
Выполнение этой команды установит необходимые инструменты, и ошибка не появится. Может потребоваться полная перезагрузка.
Как отключить всплывающие окна без отключения автомонтирования
В идеале должен быть какой-то способ настроить оконный менеджер так, чтобы он вообще не отображал эти всплывающие окна (без отключения автоматического монтирования, чтобы я все равно мог - время от времени - использовать устройство в качестве файловой системы без необходимости монтирования вручную). , т. е. когда в настройках USB телефона установлен режим «MTP», а экран разблокирован).
Любые предложения о том, как предотвратить появление этого всплывающего окна в первую очередь.
Это конкретное всплывающее окно, которое может очень раздражать таких людей, как я, у которых не работают порты USB, создается этим кодом в DE на базе GNOME. Его можно подавить, не изменяя поведение автомонтирования , исправив исходный код файлового менеджера. Вот патчи для Наутилуса :
diff --git a/src/nautilus-file-operations.c b/src/nautilus-file-operations.c
index cf88198a8..dbd7af71e 100644
--- a/src/nautilus-file-operations.c
+++ b/src/nautilus-file-operations.c
@@ -2605,22 +2605,22 @@ volume_mount_cb (GObject *source_object,
error = NULL;
if (!g_volume_mount_finish (G_VOLUME (source_object), res, &error))
{
- if (error->code != G_IO_ERROR_FAILED_HANDLED &&
- error->code != G_IO_ERROR_ALREADY_MOUNTED)
- {
- GtkWindow *parent;
-
- parent = gtk_mount_operation_get_parent (GTK_MOUNT_OPERATION (mount_op));
- name = g_volume_get_name (G_VOLUME (source_object));
- primary = g_strdup_printf (_("Unable to access “%s”"), name);
- g_free (name);
- success = FALSE;
- show_dialog (primary,
- error->message,
- parent,
- GTK_MESSAGE_ERROR);
- g_free (primary);
- }
+ // if (error->code != G_IO_ERROR_FAILED_HANDLED &&
+ // error->code != G_IO_ERROR_ALREADY_MOUNTED)
+ // {
+ // GtkWindow *parent;
+
+ // parent = gtk_mount_operation_get_parent (GTK_MOUNT_OPERATION (mount_op));
+ // name = g_volume_get_name (G_VOLUME (source_object));
+ // primary = g_strdup_printf (_("Unable to access “%s”"), name);
+ // g_free (name);
+ // success = FALSE;
+ // show_dialog (primary,
+ // error->message,
+ // parent,
+ // GTK_MESSAGE_ERROR);
+ // g_free (primary);
+ // }
g_error_free (error);
}
каха :
diff --git a/libcaja-private/caja-file-operations.c b/libcaja-private/caja-file-operations.c
index 8676800e..bc203e20 100644
--- a/libcaja-private/caja-file-operations.c
+++ b/libcaja-private/caja-file-operations.c
@@ -2441,18 +2441,18 @@ volume_mount_cb (GObject *source_object,
error = NULL;
caja_allow_autorun_for_volume_finish (G_VOLUME (source_object));
if (!g_volume_mount_finish (G_VOLUME (source_object), res, &error)) {
- if (error->code != G_IO_ERROR_FAILED_HANDLED) {
- char *name;
- char *primary;
-
- name = g_volume_get_name (G_VOLUME (source_object));
- primary = g_strdup_printf (_("Unable to mount %s"), name);
- g_free (name);
- eel_show_error_dialog (primary,
- error->message,
- NULL);
- g_free (primary);
- }
+ // if (error->code != G_IO_ERROR_FAILED_HANDLED) {
+ // char *name;
+ // char *primary;
+
+ // name = g_volume_get_name (G_VOLUME (source_object));
+ // primary = g_strdup_printf (_("Unable to mount %s"), name);
+ // g_free (name);
+ // eel_show_error_dialog (primary,
+ // error->message,
+ // NULL);
+ // g_free (primary);
+ // }
g_error_free (error);
}
и Немо :
diff --git a/libnemo-private/nemo-file-operations.c b/libnemo-private/nemo-file-operations.c
index 8b107db..dd7b5e9 100644
--- a/libnemo-private/nemo-file-operations.c
+++ b/libnemo-private/nemo-file-operations.c
@@ -2688,17 +2688,17 @@ volume_mount_cb (GObject *source_object,
success = TRUE;
error = NULL;
if (!g_volume_mount_finish (G_VOLUME (source_object), res, &error)) {
- if (error->code != G_IO_ERROR_FAILED_HANDLED &&
- error->code != G_IO_ERROR_ALREADY_MOUNTED) {
- name = g_volume_get_name (G_VOLUME (source_object));
- primary = g_strdup_printf (_("Unable to mount %s"), name);
- g_free (name);
- success = FALSE;
- eel_show_error_dialog (primary,
- error->message,
- NULL);
- g_free (primary);
- }
+ // if (error->code != G_IO_ERROR_FAILED_HANDLED &&
+ // error->code != G_IO_ERROR_ALREADY_MOUNTED) {
+ // name = g_volume_get_name (G_VOLUME (source_object));
+ // primary = g_strdup_printf (_("Unable to mount %s"), name);
+ // g_free (name);
+ // success = FALSE;
+ // eel_show_error_dialog (primary,
+ // error->message,
+ // NULL);
+ // g_free (primary);
+ // }
g_error_free (error);
}
Эти патчи можно постоянно устанавливать в дистрибутивах с исходным кодом, таких как Gentoo. В моем случае я отключил всплывающее окно в Caja:
sudo su
mkdir -p /etc/portage/patches/mate-base/caja/
cd /etc/portage/patches/mate-base/caja/
vim disable-MTP-error-popup.patch # paste the patch for caja into an editor
emerge mate-base/caja
Всплывающее окно также можно отключить в Ubuntu 22.04, но Ubuntu не является дистрибутивом на основе исходного кода в том же смысле, что и Gentoo, поэтому патч придется повторно применять после каждого обновления:
sudo apt install build-essential fakeroot devscripts
sudo apt build-dep nautilus # requires deb-src entries in sources.list
apt source nautilus
cd nautilus-42.6/debian/patches/
vim disable-MTP-error-popup.patch # paste the patch for nautilus into an editor
echo disable-MTP-error-popup.patch >> series
cd ../..
DEB_BUILD_OPTIONS=nocheck debuild -b -uc -us # test suite of this package failed before any patching
sudo apt install ../nautilus_42.6-0ubuntu1_amd64.deb
После установки исправленного пакета, чтобы применить изменения, выйдите из системы и войдите снова или завершите процесс файлового менеджера, а затем откройте его снова. Мне этого было достаточно:
pkill caja
Параметры FWIW на моем телефоне (Galaxy S6) Dev находятся по адресу: Настройки; Система; Продвинутый; Параметры разработчика и поведение USB по умолчанию не отображаются, но их можно изменить (на передачу файлов) в разделе "Конфигурация USB по умолчанию". Это приводит к открытию Nemo: 'mtp://%5Busb%3A003,111%5D/' ==>> улыбается.
Одна вещь, которую вы можете попробовать, это изменить способ, которым Android управляет USB-портом на устройстве. Начиная с Marshmallow (Android 6.0) настройкой по умолчанию для USB-порта было только для зарядки и для изменения, что вам нужно будет нажать на панель уведомлений, а затем уведомление, чтобы изменить его для других целей.
Первое, что вам нужно сделать, это включить режим разработчика.
Для этого откройте "Настройки" - "О телефоне", затем прокрутите вниз, пока не увидите номер сборки, а затем просто нажмите на него 7 раз, чтобы включить режим разработчика.
Вы увидите небольшое сообщение о том, что вы теперь разработчик, как только вы выполнили все шаги в правильном порядке.
Теперь, когда включен режим разработчика, вы увидите новый пункт меню в меню настроек "Параметры разработчика", нажмите на него, затем прокрутите вниз, пока не увидите Конфигурация USB, а затем нажмите на него.
После этого вы увидите окно, в котором вы можете указать поведение USB-порта по умолчанию при подключении к нему кабеля. У вас будет выбор Charge, MTP, PTP и любых других протоколов, которые поддерживает ваше устройство.
Более простое решение - настроить телефон для представления на компьютере в качестве устройства midi вместо mtp, ptp или чего-либо еще.
Вам может понадобиться Android 8, я могу сделать это на моем oneplus3t
Это тогда останавливает участие nautilus, но быстро отменяется, когда вам нужен общий доступ к файлам.
Плохо, что сейчас я новичок и могу учитывать это только для одной конкретной среды. Другие ответы достаточно хорошо освещают разные среды. Вот как вы можете отключить это в среде рабочего стола LXDE, работающей в диспетчере рабочего стола Lightdm. Это проверено мной. У меня возникла такая же проблема при использовании Moto G5 Plus.
- Откройте диспетчер файлов (PCMan FM).
- Перейдите в "Правка" -> "Настройки" в строке меню вверху.
- Перейдите в "Управление томом".
- Снимите флажок "Подключать съемный носитель автоматически, когда он вставлен" и "Показывать доступные параметры для съемного носителя, когда он вставлен".
Вы больше не должны видеть это надоедливое бесполезное диалоговое окно.
Думаю, вы уже поняли, куда пойти, чтобы отключить это диалоговое окно в других графических средах рабочего стола:)