Nexus 4 не показывает файлы через MTP

Я пытаюсь просто написать простой файл XML на SD-карту, и я заметил, что мой Nexus 4 записывает файл, но он не доступен для просмотра через протокол MTP с использованием Windows 7.

код:

public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); CustomerQueryRqType customerQueryRequest = new CustomerQueryRqType(); Serializer serializer = new Persister(); File myFile = new File(Environment.getExternalStorageDirectory() + "/customerQueryRequest.xml"); try { boolean created = myFile.createNewFile(); serializer.write(customerQueryRequest, myFile); } catch (Exception e) { e.printStackTrace(); } } 

Я вижу файл на телефоне с помощью Astro File Manager:

Скриншот

Но Windows этого не видит …:

Скриншот

adb shell в каталоге показывает:

 ls -l drwxrwxr-x root sdcard_rw 1970-01-16 20:51 Alarms drwxrwxr-x root sdcard_rw 1970-01-16 20:51 Android drwxrwxr-x root sdcard_rw 2012-11-21 19:30 DCIM drwxrwxr-x root sdcard_rw 1970-01-16 20:51 Download drwxrwxr-x root sdcard_rw 1970-01-16 20:51 Movies drwxrwxr-x root sdcard_rw 1970-01-16 20:51 Music drwxrwxr-x root sdcard_rw 1970-01-16 20:51 Notifications drwxrwxr-x root sdcard_rw 2012-11-19 12:06 Pictures drwxrwxr-x root sdcard_rw 1970-01-16 20:51 Podcasts drwxrwxr-x root sdcard_rw 2012-11-19 13:22 Ringtones drwxrwxr-x root sdcard_rw 2012-11-19 14:33 bluetooth -rw-rw-r-- root sdcard_rw 79 2012-12-05 22:26 customerQueryRequest.xml drwxrwxr-x root sdcard_rw 2012-11-20 02:50 data -rw-rw-r-- root sdcard_rw 11394 2012-11-19 13:54 eightpen_custom_gestures drwxrwxr-x root sdcard_rw 2012-11-19 13:17 media 

Что происходит с моим Nexus 4? Почему это скрывает мои вещи от Windows?

Solutions Collecting From Web of "Nexus 4 не показывает файлы через MTP"

Кажется, это известная проблема, связанная с доступом к файлу Android USB через MTP . Кэш MTP устарел до перезагрузки телефона.

Обходной путь :

  • Очистите данные приложения «Media Storage»
  • Используйте SDrescan или SD Scanner (также работает на Android 4.4 / 5, доступный в приложении F-Droid ), чтобы принудительно обновить

Или просто не используйте USB. Проблема не влияет на другие методы доступа к файлам. Например, попробуйте AirDroid для передачи файлов.


Примечание. Это не работает для Android 5.0.2. После очистки «Media Storage» и использования SD Rescanner папки отображаются в Windows 7 как неприкрытые 4K-файлы. Единственное решение в этот момент – очистить еще раз Media Storage и перезагрузить устройство

Вы можете использовать следующий код после закрытия файла

 MediaScannerConnection.scanFile(this, new String[] { file.getAbsolutePath() }, null, null); 

Источник: https://code.google.com/p/android/issues/detail?id=38282

На Xperia Z ниже код работал просто отлично:

  String screenShotFile = "...."; activity.sendBroadcast(new Intent( Intent.ACTION_MEDIA_MOUNTED, Uri .fromFile(screenShotFile))); 

Для использования 4.4+:

 activity.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(screenShotFile))); 

(К сожалению, я не помню, если бы я достаточно хорошо ее протестировал)

http://commonsware.com/blog/2013/11/06/android-4p4-permission-regressions.html

Потратив часы на этот вопрос, я решил вот так:

 private void rescanFolder(String dest) { // Scan files only (not folders); File[] files = new File(dest).listFiles(new FileFilter() { @Override public boolean accept(File pathname) { return pathname.isFile(); } }); String[] paths = new String[files.length]; for (int co=0; co< files.length; co++) paths[co] = files[co].getAbsolutePath(); MediaScannerConnection.scanFile(activity, paths, null, null); // and now recursively scan subfolders files = new File(dest).listFiles(new FileFilter() { @Override public boolean accept(File pathname) { return pathname.isDirectory(); } }); for (int co=0; co<files.length; co++) rescanFolder(files[co].getAbsolutePath()); } 

Дело в том, что вам нужно сканировать только файлы (а не папки), а затем повторяться рекурсивно для каждой папки

EDIT Кроме того, если вы не хотите, чтобы изображения добавлялись в ваш фотоальбом (но только ваше содержимое отображалось поверх протокола mtp), не забудьте поместить в папку пустой файл .nomedia прежде чем повторять его, например:

 new File(myFolder + File.separator + ".nomedia").createNewFile(); rescanFolder(myFolder); 

Извещение / хранение / эмулированный. Android 4.2 содержит некоторые фанковые эмулированные материалы для каждого приложения / пользователя, например отдельную / sdcard / для каждого пользователя. Попробуйте переместить файл в / sdcard / вместо отображаемой эмулированной SD-карты.

Простой код, предлагаемый на вопрос Как обновить MediaStore на Android? Делает необходимое обновление MediaStore, если вызвано после того, как я поместил файл на внешнее хранилище. Содержимое на моем Nexus 4 обновляется мгновенно в Windows 7.

Мне нужно было создать каталог и скопировать некоторые примеры файлов для моего приложения. После многих экспериментов и исследований следующая процедура работала безупречно для меня:

1) Создал каталог, используя File.mkdir ().

2) Скопированные файлы в каталог и запустить MediaScanner в каждом файле.

 MediaScannerConnection.scanFile(context, new String[]{file.getAbsolutePath()}, null, null); 

3) Запустите MediaScanner в каталоге.

 MediaScannerConnection.scanFile(context, new String[]{directory.getAbsolutePath()}, null, null); 

Результат: файлы и каталог отображаются мгновенно на ПК через MTP.

Имел аналогичную проблему с моим OneplusOne:

После обновления программного обеспечения (до версии 6.0.1) я не смог увидеть мои снимки камеры при подключении к компьютеру (PTP и MTP). Оба SDRescan приложения и SDscanner не повлияли.

Мое решение состояло в том, чтобы скопировать все изображения из DCIM в другую папку с помощью терминала или любого приложения File Explorer на телефоне. При подключении к компьютеру я мог видеть скопированные файлы .. я переместил их на свой компьютер и очистил папку с камерой. Нет постоянного решения, но он исправил проблему для меня, по крайней мере, до тех пор, пока я не сделаю следующую резервную копию. = D

Лучшим обходным решением, которое я нашел для ошибки, упомянутой в принятом ответе, является копирование данных из ОС Android на другую машину / сервер (Linux, MacOS, windows) с использованием SSH.

  • Убедитесь, что устройство (Android) и компьютер (где вы хотите скопировать данные) доступны по IP-адресу или имени узла, например, подключив их к той же сети Wi-Fi.

Необязательный и рекомендованный

  • Подключите устройство Android с помощью USB-модема. Это обеспечивает быструю скорость из-за проводного соединения и гарантирует, что оба IP-адреса видны друг другу, потому что оба находятся в одной сети.

В Android-устройстве

  • Установите SSH-сервер. SSHelper работал как шарм
  • Запустите SSHelper и перейдите на вкладку конфигурации, чтобы получить IP-адрес, порт и пароль. В приведенном ниже примере это 192.168.1.5, 2222 и «admin».
  • Пароль по умолчанию – admin, но если вы решите его изменить, нажмите кнопку «Перезапустить сервер с новыми значениями» после его изменения

В машине

  • Установите rsync. Если использовать Ubuntu, он уже установлен по умолчанию.
  • Откройте оболочку и введите следующую команду. Измените IP-адрес и порт на свои значения

rsync -avzhP --inplace --info=progress2 -e 'ssh -p 2222' 192.168.1.5:/storage/emulated/0/DCIM/Camera/ /home/username/path/to/pics/

  • Вы получите следующее приглашение, введите свой пароль

SSHelper Version 8.5 Copyright 2014, P. Lutus Default password is "admin" (recommend: change it) username@192.168.1.5's password: admin receiving incremental file list

Другие предложения не помогли мне:

  • Использование USB-накопителя вместо MTP не поддерживается устройством (как и многие другие более новые устройства).
  • В моей ОС (Android 6.0.1) не было возможности удалить данные приложения «Media Storage».
  • Другие способы обмена файлами по сети имели свои обратные пути. FTP не гарантирует целостность файлов. Если соединение отключено, оно либо перезаписывает, либо пропускает все файлы, поэтому один из файлов может быть неполным. Другие протоколы могут быть сложными для установки, а другие приложения могут использовать проприетарные протоколы.

Вышеуказанные ответы подходят для создания файла. Если вы позже удалите файл и хотите, чтобы это изменение также отражалось, вы можете сделать одно из следующего: Давайте сначала рассмотрим два решения, которые кажутся такими, какие они работают, но вызовут проблемы на некоторых устройствах. Первый – сканировать удаленный файл:

 context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(file))); 

Это работает на многих устройствах для удаленных файлов, но на некоторых устройствах он будет создавать новый 0-байтовый файл, который, вероятно, не тот, который вы хотите. В этом случае, если вы работаете в <4.4 KitKat, вы можете сделать это:

 context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.fromFile(folder))); 

Где папка равна file.getParentFile (). К сожалению, на KitKat 4.4 и выше это приведет к тому, что SecurityException будет запущено, поэтому для этих устройств вы можете попробовать удалить из магазина Media Store:

 final Uri externalFilesUri = Files.getContentUri("external"); context.getContentResolver().delete(externalFilesUri, Files.FileColumns.DATA + "=?", new String[] {file.getAbsolutePath()}); 

Я протестировал это как обходной путь для ACTION_MEDIA_MOUNTED, не работающего над KitKat, и он работает в моем тестировании на Nexus 5.

Недавно я столкнулся с одной и той же проблемой, но некоторые дополнительные исследования помогли найти скрытые файлы. Похоже, что Google внес некоторые изменения в структуру хранилища. Все эти файлы были перемещены в другую папку « This Computer\HTC One\Internal Storage\storage\emulated\0 . Но странно, что не все файлы были перемещены.

Android 4.4.2