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:



Screenshot



но Windows этого не видит...:



Screenshot



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? Почему он прячет мои вещи от окон?

510   12  

12 ответов:

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

A решение - это:

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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. Но странно, что не все файлы были перемещены.

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

Comments

    Ничего не найдено.