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?

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

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

    • Очистите данные приложения «Media Storage»
    • Используйте SDrescan или SD Scanner (также работает на Android 4.4 / 5, ansible в приложении 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 

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

    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) [email protected]'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

    Из документации здесь необходимо вызвать MediaScannerConnection.scanFile:

     // Tell the media scanner about the new file so that it is // immediately available to the user. MediaScannerConnection.scanFile(this, new String[] { file.toString() }, null, new MediaScannerConnection.OnScanCompletedListener() { public void onScanCompleted(String path, Uri uri) { Log.i("ExternalStorage", "Scanned " + path + ":"); Log.i("ExternalStorage", "-> uri=" + uri); } }); 
    Давайте будем гением компьютера.