LINUX.ORG.RU

Android 4.4: запись на SD карту сторонними приложениями

 , ,


0

1

Я изредка занимаюсь разработкой под Android (на Qt). Недавно узнал, что Гоголь заблокировал для сторонних приложений возможность записи на внешнюю SD-карту. А чтобы писать на SD, нужно рутование девайса.

Таким образом, я не могу заставить свое приложение нормально работать на железке, так как данные занимают около 1Гб, а на внутренней памяти места нет.

Нашел следующее решение:

Как в Android 4.4 KitKat разрешить запись на SD карту без рутования

На примере Яндекс Карт.

1. Идем в магазин #Google Play Store, открываем страничку нужного приложения и видим его ключевое название (ID) в адресной строке, в нашем случае из “https://play.google.co…d=ru.yandex.yandexmaps” понятно, что название/ID приложения “ru.yandex.yandexmaps”

2. Создаем через системный файловый менеджер (который идет с официальной прошивкой и может писать и удалять на карте где угодно) папочку для данных нашего приложения в формате “/storage/sdcard1/Android/data/myappname” – в нашем случае с картами Яндекса будет “/storage/sdcard1/Android/data/ru.yandex.yandexmaps”.

3. Запускаем приложение и в нем указываем созданную папку, при необходимости (в случае карт Яндекс это требуется) – перезапускаем приложение.

4. Получаем профит – карты отлично скачиваются и сохраняются на внешнюю карту.

И так для любого приложения и без всякого рута!

Вопрос в следующем. Может ли программа САМА создать свой каталог с именем типа “/storage/sdcard1/Android/data/ru.yandex.yandexmaps”? Или его обязательно нужно вручную создавать через системный файловый менеджер? Сейчас проверить не могу, может кто-то уже пробовал, что получилось?

★★★★★

Последнее исправление: CYB3R (всего исправлений: 1)

В Environment или Context есть функция для получения списка каталогов, она этот каталог и создает при отсутствии:

http://developer.android.com/reference/android/content/Context.html#getExtern...

В предыдущих версиях можно вытащить путь из переменной окрущения SECONDARY_STORAGE и создать вручную.

crowbar
()
Ответ на: комментарий от crowbar

В Environment или Context есть функция для получения списка каталогов, она этот каталог и создает при отсутствии:
http://developer.android.com/reference/android/content/Context.html#getExtern...

Это ты про Java говоришь, а я про C++ (Qt) спрашиваю.


В предыдущих версиях можно вытащить путь из переменной окрущения SECONDARY_STORAGE и создать вручную.

А в KitKat?

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от crowbar

Вручную не создать, только через getExternalFilesDirs

Но это Java, а я пришу про C++ (Qt).

Кстати, getExternalFilesDirs() возвращает просто тип File. То есть, приложение таки может САМО создать каталог? Только нужно знать допустимое имя каталога?

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от crowbar

Я проверял — само не создает.

Показывается какое-то системное окно с ошибкой, или молча не создает, узнать об этом можно только обработкой результата функции?

Xintrea ★★★★★
() автор топика

execpv mkdir в ndk не существует?

// мимоходом прохожу

gh0stwizard ★★★★★
()

Вопрос в следующем. Может ли программа САМА создать свой каталог с именем типа “/storage/sdcard1/Android/data/ru.yandex.yandexmaps”?

Почему вы не хотите использовать apx? И сервер свой разгрузите (файл с расширением obb будет храниться у гугеля), и сам apk будет маленький.

andreyu ★★★★★
()
Ответ на: комментарий от andreyu

А что Qt запрещает использовать JNI?

Кроссплатформенность. Слишком большие отличия кода под десктоп и под Андроид, если у него такие феерические ограничения.

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от Xintrea

Кроссплатформенность.

Каким образом запрещает?

Слишком большие отличия кода под десктоп и под Андроид, если у него такие феерические ограничения.

Ну это проблемы Qt и того разработчика, который положился на «кроссплатформенность» этого фреймворка.

andreyu ★★★★★
()
Ответ на: комментарий от Xintrea

Ну сделай базовый класс для получения готовых путей к данным и унаследуй от него реализации для разных платформ. В андроидной версии дергай Java API через JNI, там ничего сложного нет.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.