Rou1997
@Rou1997
------------------Ответ эксперта------------------

Android Dev: Сохранение данных на SD-карту для устройств на базе MediaTek ("Портативный проигрыватель")?

Есть много бюджетных смартфонов и планшетов на базе MediaTek, в них чип чипсета имеет модель вида MTxxxx, например MT6571.

"Chip set" - "набор чипов в одном корпусе микросхемы", в частности там CPU, GPU и другие, и еще там есть контроллер, который "выходит" на USB-разъем и обеспечивает доступ к данным.
В устройствах с разными чипсетами, соответственно, различается и этот контроллер.

Скажем, у смартфонов на базе Qualcomm, подход к реализации этого контроллера - правильный.
Там - такой же контроллер, как в USB-флешках, смартфон распознается как "Съемный диск", и использует соответствующий "протокол" обмена данными с драйвером файловой системы ПК, реализация которого работает хорошо, и я не помню ни "косяков", ни проблем с быстродействием у моего HTC на базе Qualcomm.

А вот в MediaTek почему-то решили применить другую технологию - ту, что в MP3-плеерах. Это MTP, а ее реализация со стороны Windows - WPD.
Наверно, MediaTek ранее занимались мультимедиа и не хотели (как им казалось) "изобретать велосипед". Очень много таких случаев.

А эта система "заточена" именно под работу с мультимедиа, и для смартфона или планшета, который является полноценным многофункциональным компьютером, она подходит плохо.

Прежде всего, при подключении к ПК и открытии "SD-карты", нам мало того что приходится кликнуть лишний раз, чтобы сперва открыть устройство, а потом карту (и еще мы не можем получить полноценный путь к карте), так вдобавок очень медленно загружается дерево файлов.

Но это еще что, а вот попробуем сохранить файл на SD-карту из нашего приложения Android:
//android.permission.WRITE_EXTERNAL_STORAGE
new File(Environment.getExternalStorageDirectory(), "file.txt").createNewFile();

Подключим устройство к ПК - и что? Файла будто нет, хотя на самом устройстве все приложения уже имеют к нему доступ.
Не помогает даже вынуть кабель и вставить снова. Только перезагрузка устройства...

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

Но не возникнет ли "подводных камней" на других устройствах?
Кто-то вообще пытался решать эту проблему? Это ведь не норма. :)

UPD: Разработано такое решение, именно с MediaStore, как и ожидал:
ContentValues values = new ContentValues();
values.put(MediaStore.MediaColumns.DATA, fileabsolutepath);
context.getContentResolver().insert(Files.getContentUri("external"), values);

Протестировано на несколько разных устройствах, свою задачу выполняет, но на том ПК, к которому длительно было подключено устройство и совершались операции, обновление перестало работать, я вынул кабель, вставил снова, они снова заработали, но позже обнаружил, что по какой-то причине перестал работать Проигрыватель Windows Media и пришлось перезагружать.
Возможно, такого не будет, если указывать тип файла как "unknown", или если использовать иной способ добавления в MediaStore.
Придется дальше изучать MTP, а также продолжить тестирование на своих устройствах - и на устройствах пользователей приложения. :(
  • Вопрос задан
  • 236 просмотров
Пригласить эксперта
Ответы на вопрос 1
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через TM ID
Похожие вопросы
Вакансии с Моего Круга Все вакансии
Заказы с Фрилансим Все заказы