Как создавать файлы / папки во внешнем хранилище, доступные через USB?

Я использую Nexus 5 в качестве тестового устройства для своего первого приложения для Android. Когда я подключаю телефон к компьютеру через USB, он появляется в проводнике, и я могу получить доступ к различным файлам и папкам на устройствах (точно так же, как если бы устройство было USB-накопителем …).

Я думал, что эти файлы и папки будут представлять собой External Storage и каждый файл / папка, которую хранят мои приложения в External Storage , также будет доступна через USB.

При создании файлов / папки во External Storage в моем приложении нет проблем, эти файлы не отображаются в файлах и папках, к которым можно получить доступ через USB:

 public static File getAppPuplicExternalStorageDir() { File appDir = null; try { appDir = new File(Environment.getExternalStorageDirectory(), "MyApp"); appDir.mkdirs(); } catch (Exception e) { } return appDir; } ... File noMediaFile = new File(getAppPuplicExternalStorageDir(), ".nomedia"); noMediaFile.createNewFile(); ... 

Этот код работает отлично. Я могу проверить, существует ли файл, удалить файл, создать другие файлы и т. Д. Без каких-либо проблем.

Когда я проверяю appDir, у него есть путь /storage/emulated/0/MyApp/ . Все работает отлично, за исключением того, что эта папка не отображается через USB.

Есть ли разница между внешним хранилищем и файлами / папками, видимыми через USB? Пользователь должен иметь возможность загружать файлы на свой компьютер. Как я могу сделать мои файлы видимыми через USB?

Эти файлы не отображаются в файлах и папках, к которым можно получить доступ через USB

Они будут, как только MediaScannerConnection проиндексирует их. Вы можете использовать scanFile() для MediaScannerConnection чтобы это произошло быстрее.

Также обратите внимание, что пользователю может потребоваться использовать «обновить» или «перезагрузить» в своем MTP-клиенте (например, проводник Windows), чтобы увидеть файлы или, возможно, отключить / снова подключить устройство, как кэш некоторых клиентов MTP Списки каталогов.

Когда я проверяю appDir, у него есть путь / storage / emulated / 0 / MyApp /. Все работает отлично, за исключением того, что эта папка не отображается через USB.

Это будет каталог MyApp/ root под корнем внешнего хранилища, по крайней мере для телефонов. Для планшетов со вторичными пользователями каталог MyApp/ будет отображаться для пользователя, когда пользователь выполнит вход в планшет. Путь storage/emulated/0/ является динамическим, чтобы направить код вашего приложения для записи в нужное место.

Кроме того, попробуйте не использовать getExternalStorageDirectory() и загромождать внешнее хранилище пользователя. Если это файлы, которые пользователь должен манипулировать, попробуйте поместить их в место, указанное в Environment.getExternalStoragePublicDirectory() .