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?

Ответ 1

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

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

  • Удалите данные приложения "Media Storage".
  • Используйте SDrescan или F-Droid), чтобы принудительно обновить

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


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

Ответ 2

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

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

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

Ответ 3

В 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

Ответ 4

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

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());
} 

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

ИЗМЕНИТЬ Кроме того, если вы не хотите, чтобы изображения добавлялись в ваш фотоальбом (но только ваше содержимое отображалось поверх протокола mtp), не забудьте поместить пустой пустой файл .nomedia в свою папку, прежде чем повторять его, например:

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

Ответ 5

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

Ответ 6

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

Ответ 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.

Ответ 8

У меня была аналогичная проблема с моим OneplusOne:

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

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

Ответ 9

Лучшим обходным решением, которое я нашел для ошибки, упомянутой в принятом ответе, является копирование данных из ОС 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] password: admin receiving incremental file list

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

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

Ответ 10

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

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.

Ответ 11

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

Android 4.4.2