Некоторые изменения после Android 3.x могут повлиять на ваше приложение, если вы сохраняете данные на внешнем хранилище и хотите, чтобы пользователи имели доступ к этим файлам с ПК или ноутбука.
Android 3.0 изменил средства, с помощью которых пользователи монтируют внешнее хранилище и делают его доступным для компьютера. Ранее в Android использовался USB Mass Storage, тот же протокол, который используется USB-накопителями. Вот почему внешнее хранилище было недоступно, когда хост-машина монтировала его – USB Mass Storage не был разработан для интеллектуальных устройств хранения.
Теперь в Android используется Media Transfer Protocol как способ монтирования внешнего хранилища. Многое из того, что было написано о нём, основано на пользовательском опыте, например, на необходимости использовать стороннее ПО для использования MTP в OS X и Linux.
Тем не менее, для разработчиков важно другое изменение – содержимое MTP не основано на буквальном содержимом внешнего хранилища. Вместо этого контент в MTP основан на том, какие файлы были проверены MediaScannerConnection. Если вы записываете файл на внешнее хранилище, то до тех пор, пока этот файл не будет проверен MediaScannerConnection, он не будет отображаться пользователям через MTP.
Внешнее хранилище сканируется при перезагрузке, и, возможно, периодически. Пользователи могут самостоятельно запустить принудительное сканирование с помощью утилит, например, SDRescan.
Когда вы добавляете файлы в файловую систему Android, эти файлы не подхватываются MediaScanner автоматически. Лучше всего использовать метод scanFile() у класса MediaScannerConnection для обновление базы данных мультимедиа после закрытия файла. Это сразу сделает файл доступным для пользователя. Для этого в коде нужно добавить следующий код:
MediaScannerConnection.scanFile(context, new String[] { path }, null, null);
Здесь в параметры передаются:
- контекст приложения;
- массив строк, содержащий пути до файлов, которые нужно просканировать;
- массив строк, содержащий MIME типы для каждого пути (опционально);
- callback onScanCompleteListener, в котором можно продолжить работу после завершения сканирования (опционально).
Раньше нам требовался MediaScannerConnection для реальных “медиа”, таких как MP3 или MP4. Сейчас его нужно использовать для всего, если мы хотим вернуть пользователю результат немедленно. Это означает, что вы должны использовать MediaScanner также для любых файлов, которые пользователь может загрузить на свой компьютер. Это может быть что угодно, например. CSV файлы, файлы PDF и так далее. Если пользователь может захотеть использовать их на компьютере, вы должны сделать так, чтобы эти файлы были известны, используя методы, описанные выше.