Что значит записать в корень флешки. Где находится корневая папка флешки или карты памяти

  • 20.06.2019

Думаю, что все сталкивались с проблемой злобных «авторанов». И есть много способов решения: СПО, скрипты, «танцы с бубном» и т.п. Я же хочу предложить простой алгоритм решения для пользователей OS Windows, который не требует сторонних вмешательств. Для достижения цели нам потребуется несколько шагов - точнее два.

Шаг №1 - подготовка

Форматирование файловой системы носителя в NTFS с помощью ОС.

При выборе вариантов форматирования нет NTFS

Если нет варианта форматирования файловой системы в NTFS, что имеет место быть на Windows XP, то делаем следующее:

  1. Заходим в свойства флешки;
  2. Переходим на вкладку «Оборудование;»
  3. Выбираем нашу флеш-карту и нажимаем кнопку свойства;
  4. Переходим на вкладку «Политика»;
  5. Выбираем вариант использования кэша;
  6. Принимаем изменения и форматируем в NTFS;
  7. Затем возвращаем обратно в «Быстрое удаление».

Шаг №2 - разграничение прав

Теперь создаем папку («рабочая папка») в корне и сразу задаем имя (в дальнейшем поменять имя папки невозможно), в ней и будет храниться вся информация. А вот в корень папки будет доступен только на чтение. Теперь разграничиваем права:
  1. Заходим в безопасность - открываем свойства флешки, вкладка «Безопасность»;

    Если нет такой вкладки, то делаем следующее

    1. Заходим в «Параметры папок», что в «Панели управления»;
    2. На вкладке вид в списке «Дополнительные параметры» находим параметр содержащий слова «общий доступ» и "(рекомендуется)";
    3. Снимаем галку.
    Теперь вкладка появилась
  2. Нажимаем кнопку «Дополнительно»;
  3. В открывшемся окне переходим на вкладку «Владелец» и нажимаем кнопку «Изменить»;

    Для XP

  4. Ставим галку «Заменить владельца подконтейнеров и объектов»;
  5. Выбираем себя и становимся владельцем объекта;
  6. Закрываем диалоговые окна по требованию ОС кнопкой «ОК» и затем опять открываем «безопасность» и «дополнительно»;
  7. Изменяем разрешения - для этого заходим в безопасность и на вкладке «Разрешения» нажимаем кнопку «Изменить разрешения» удаляем имеющиеся права;

    Для XP

    (в Windows XP нет кнопки «Изменить разрешения», там сразу действуем)

  8. Добавляем группу «Все» - нажимаем кнопки «Добавить», «Дополнительно», «Поиск», выбираем из списка группу «Все», «ОК», «ОК»;
  9. В открывшемся окне задаем параметры разрешений для группы «Все»:
    • «Применять: Для этой папки, ее подпапок и файлов»;
    • Устанавливаем следующие галки в поле «Разрешения»:
      1. Разрешить: «Полный доступ»;
      2. Запретить: «Смена владельца», «Смена разрешений», «Удаление», «Удаление подпапок и файлов», «Запись дополнительных атрибутов», «Запись атрибутов», «Создание папок / дозапись данных», «Создание файлов / запись данных».
  10. Принимаем изменения, переходим к ранее созданной папке в корне флеш-карты и проделываем почти те же операции;
  11. Смена владельца - по знакомой схеме;
  12. Удаление имеющихся прав путем снятия галки «Добавить разрешения, наследуемые от родительских объектов» на вкладке «Разрешения»;
  13. В появившемся диалоговом окне выбираем «Удалить»;
  14. Добавляем группу «Все» (уже знаем как) и задаем параметры разрешений:
    • «Применять: Для этой папки, ее подпапок и файлов» ;
    • Устанавливаем галку Разрешить: «Полный доступ».
  15. Опять добавляем группу «Все» и задаем параметры разрешений:
    • «Применять: Только для этой папки»;
    • Устанавливаем следующие галки «Запретить» в поле «Разрешения»:
      «Смена владельца», «Смена разрешений», «Удаление», «Запись дополнительных атрибутов», «Запись атрибутов»
Плюсы
+ В корне флеш-карты нет возможности создавать / удалять файлы и папки. Следовательно, закрыта лазейка для «авторанов».
+ В «рабочей папке» полный доступ - что хотим, то и воротим (ударение расставите сами).
+ Файловая система NFTS - для личного пользования в самый раз. (ИМХО)
Минусы
- Нет возможности воспользоваться пунктом меню «Отправить» для копирования информации на нашу флешку, т.к. корневой каталог закрыт для записи. Необходимо копировать в «рабочую папку».
- Нет возможности переименовать «рабочую папку» - в корне только чтение.
- Файловая система NTFS - не подходит для устройств читающих только FAT (муз./видео плееры, смартфоны, фото-камеры и т.п.).
Замечания
  • Данную операцию лучше проводить на «здоровой машине». А то можно сотворить immortal-autorun;
  • НА Windows XP у меня при попытке удалить «рабочую папку» она оставалась (так и должно быть), но внутри всё удалялось;
  • Зато на Window 7 все файлы при попытке удаления «рабочей папки» остаются;
  • Внутри «рабочей папки» не спасает от вредоносных программ, которые создают exe"шник с именем папки при ее открытии.

Где находится корневая папка флешки или карты памяти?

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

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

    Корневая папка любого диска - это главная папка данного диска.

    То есть когда ты находишься в корневой папке какого-либо диска, для тебя это выглядит как будто ты не в какую папку и не заходил.

    То есть адрес корневой папки такой:

    диски A: и B: обычно зарезервированы под дискетные дисководы (для флоппи-дисков), которые в современных компьютерах часто уже и не ставят.

    для жсткого диска это обычно C:

    часто для DVD-проигрывателя резервируется D:

    Остальные обычно используются для подключаемых внешних устройств.

    Например для флешки.

    Но это, по-моему, не обязательно они должны быть в таком порядке. У кого-то в компьютере может быть и другой порядок соответствия устройств наименованиям дисков. Войдите в раздел Мой компьютер (если у вас Windows) и вы увидите как это расположено у вас.

    Корневая папка сайта имеет такой адрес: http://sitename/

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

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

    Что же такое корневая папка и как туда попасть?

    На самом деле все очень просто, корневая папка - это папка которая считается изначальной. Если вы к примеру подключите вашу флешку в устройству, то вам выскочит меню, через которое вы можете зайти в корневую папку = это и есть сама флешка, в которой могут быть как папки так и файлы.

    Довольно часто можно услышать или встретить фразу: установите/переместите/скопируйте определенный файл в корень карты памяти или в корневую папку флеш-карты. А что же такое и где находится корневая папка или просто корень флешки?

    Ответ на самом деле очень прост. Такое название пошло от корневой директории. То есть, когда нажимаем на значок карты памяти/флеш-карты и перед нами открывается окно - это и есть та самая корневая папка. Хотя фактически папку мы там не видим. Это сама область карты с помещенными на ней другими файлами и прочими папками. Корневую папку (или корень) флешки можно сравнить с верхним этажом в иерархии всех папок на ней.

Потом появился Android Lollipop, а вместе с ним и новые фичи для работы с SD-картой. Появился SAF (Storage Acces Framework), появился новый Intent ACTION_OPEN_DOCUMENT_TREE , с помощью которого можно выбрать корень SD-карты и далее использовать в своих нуждах. На самом деле, SAF был еще на KitKat, но без этого Intent’a толку от него было немного, т.к для доступа к файлам на карте нужно было использовать Intent ACTION_OPEN_DOCUMENT , который, судя по названию, дает возможность юзеру выбрать файл, который он хочет редактировать, вручную через системный пикер. Окей, а если у пользователя 5000 файлов, будет ли он это делать? Нет.

Определение внешних накопителей на устройстве

Начну с самой больной темы в работе с карточками памяти. У нас в Android’e есть замечательный метод

File Environment.getExternalStorageDirectory()

Судя по названию, это то что нужно. «External» — переводится как «внешний», верно? Но полагаться на этот метод не стоит. Он может вернуть путь ко внутренней памяти, может к карте, но на каждом устройстве происходит по-разному. Такая ситуация сложилась во многом благодаря разным производителям телефонов и их модифицированным прошивкам и оболочкам. Я хочу сказать, что метод getExternalStorage() может возвращать путь не к реальной SD-карте, а к той, которую производитель считает внешним накопителем. Здесь возникает путаница в определениях. Внешний накопитель это не обязательно флэшка: на некоторых девайсах это внутренняя память, на некоторых действительно SD-карта. Точки монтирования карты могут быть любые:

  • /storage/extSdCard/
  • /storage/sdcard1/
  • /storage/sdcard0/
  • /mnt/external_sd/
  • /mnt/external/
  • /mnt/sdcard2/
  • /storage/sdcard0/external_sdcard/
  • /storage/removable/sdcard1/
  • /removable/microsd
  • /mnt/media_rw/sdcard1
  • /mnt/emmc

И это не является какой-то большой проблемой, пока не столкнешься с ней сам.

На StackOverflow есть множество тем, в которых куча самых разных вариантов определения флешки, начиная от перебора всех возможных комбинаций точек монтирования, попыток получения джавовых переменных среды System.getenv("EXTERNAL_STORAGE") , System.getenv("SECONDARY_STORAGE") и заканчивая парсингом системного файла /system/etc/vold.fstab . Эти способы работают, но каждый только в каком-то частном случае. Ни один способ не покрывает все устройства, либо не работает совсем. И если кажется, что все накопители определяются верно, то всегда найдется какой-нибудь девайс, карта на котором не определяется этими методами. Я перепробовал почти все методы.

Чтобы понять масштаб проблемы, скажу, что я разбирался с ней около четырех месяцев. Эта проблема существует примерно с 2011 года, но до сих пор нет точного решения. Какое то время я довольствовался вот этим более-менее рабочим кодом:

ArrayList allPaths = new ArrayList<>(); ArrayList sdPaths = new ArrayList<>(); for (File file: mContext.getExternalFilesDirs("external")) { if (file == null) { continue; } int index = file.getAbsolutePath().lastIndexOf("/Android/data"); if (index > 0) { String path = file.getAbsolutePath().substring(0, index); try { path = new File(path).getCanonicalPath(); } catch (Exception e) { e.printStackTrace(); } allPaths.add(path); if (!file.equals(mContext.getExternalFilesDir("external"))) { sdPaths.add(path); } }

Но и он давал сбои на некоторых устройствах. И в очередной раз, получив единицу в маркете, я отправился на поиски.

Мне не давал покоя системный андроидовский пикер (по совместительству файловый менеджер), в котором все накопители всегда верно определяются. Недолго думая, я вытащил системный apk с помощью Root’a и декомпилировал его.

Озарение

Я обнаружил, что пикер использует классы StorageVolume и StorageManager . Он проходит по всем элементам StorageVolume , полученным с помощью метода StorageManger.getVolumeList() и для каждого вызывает методы StorageVolume.getPath() и StorageVolume.getState() . Загвоздка в том, что эти методы скрыты. Они не private, но помечены аннотацией @hide . Ну что поделать, достаем свою рефлексию:

StorageManager getStorageManager() { return (StorageManager) mContext.getSystemService(Context.STORAGE_SERVICE); } /* Use reflection for detecting all storages as android do it probably doesn"t work with USB-OTG works only on API 19+ */ public List getAllPaths() { List allPaths = new ArrayList<>(); try { Class storageVolumeClass = Class.forName("android.os.storage.StorageVolume"); Method getVolumeList = getStorageManager().getClass().getMethod("getVolumeList"); Method getPath = storageVolumeClass.getMethod("getPath"); Method getState = storageVolumeClass.getMethod("getState"); Object getVolumeResult = getVolumeList.invoke(getStorageManager()); final int length = Array.getLength(getVolumeResult); for (int i = 0; i < length; ++i) { Object storageVolumeElem = Array.get(getVolumeResult, i); String mountStatus = (String) getState.invoke(storageVolumeElem); if (mountStatus != null && mountStatus.equals("mounted")) { String path = (String) getPath.invoke(storageVolumeElem); if (path != null) { allPaths.add(path); } } } } catch (Exception e) { e.printStackTrace(); } return allPaths; }

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

SAF (Storage Access Framework)

Официальная документация:

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

p>SAF агрегирует поставщиков контента (Подклассы класса DocumentProvider). Это, например, Google Диск, различные галереи и файловые менеджеры.

SAF выдает URI документов (файлов), которые обладают правами на запись, либо чтение. Можно сказать, что это такой слой над доступом к файлам. Сам по себе класс File ничего не знает о SAF.

p>Для того, чтобы получить возможность редактировать данные на карте, требуется получить URI корня SD-карты, который будет обладать правами на редактирование. Далее с помощью этого URI можно будет получить URI любого файла на карте памяти. Для этого нужно запустить системный пикер с помощью Intent ACTION_OPEN_DOCUMENT_TREE и попросить пользователя выбрать корень SD-карты (иначе ничего не получится!).

В картинках:


@TargetApi(Build.VERSION_CODES.LOLLIPOP) void showDocumentTreeDialog() { Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE); startActivityForResult(Intent.createChooser(intent, getString(R.string.permission_intent)), REQUEST_CODE_SD_CARD); }

Здесь происходят очень важные вещи: в onActivityResult обрабатываем выбор пользователя и приобретаем заветные права на доступ к карте. Вообще права даются вплоть до перезагрузки устройства и чтобы после перезапуска девайса вновь не посылать пользователя за разрешением, необходимо использовать метод

TakePersistableUriPermission(Uri uri, int modeFlags)

c флагами на запись и чтение. После всех этих махинаций необходимо сохранить куда-нибудь полученный Uri SD-карты для дальнейшей работы с ним, например, в SharedPreferences .

@RequiresApi(api = Build.VERSION_CODES.KITKAT) @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == REQUEST_CODE_SD_CARD && resultCode == RESULT_OK && takePermission(getApplicationContext(), data.getData())) { //do your stuff } } @RequiresApi(api = Build.VERSION_CODES.KITKAT) private boolean takePermission(Context context, Uri treeUri) { /* Было бы полезно добавить проверку на то, что пришедший URI это URI карты. Оставлю эту задачу как упражнение читателям */ try { if (treeUri == null) { return false; } context.getContentResolver().takePersistableUriPermission(treeUri, Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION); sharedPreferences.putString(SD_CARD_URI,treeUri.toString()); return true; } catch (Exception e2) { e2.printStackTrace(); return false; } }

Взаимодействие с SD-картой

Читатель наверное уже догадывается, что по-нормальному взаимодействовать с файлами (вроде file.renameTo(file2)) мы не сможем. Если мы посмотрим в код метода file.renameTo(File) , то не увидим ничего подозрительного, никаких проверок. И правильно, потому что проверки находятся на уровне файловой системы. И если привычными средствами попробовать изменить файл, находящийся на SD-карте, то получим следующее исключение:

Java.io.IOException: Cannot make changes to file your_file.ext

Вот интересный способ определить — можно ли изменять файл:

Public boolean isFileWritable(File file) { boolean writable; try { new FileOutputStream(file, true).close(); writable = file.exists() && file.canWrite(); } catch (IOException e) { writable = false; } return writable; }

Если файл на карте, мы получим IOException .

Чтобы изменить файл на карте памяти, нам нужно получить DocumentFile , представляющий наш файл, но с правами записи, которые мы получили с помощью SAF.

В начале статьи я говорил о двух интентах для SAF: ACTION_OPEN_DOCUMENT_TREE и ACTION_OPEN_DOCUMENT . И я говорил, что мы не будем использовать второй интент, так как это принуждает юзера искать файл вручную. Но у нас есть URI, который мы получили с помощью первого интента и это значит… Нет, никакого стандартного API для получения DocumentFile нет, все ручками.

Алгоритм такой:

  1. У нас есть File
  2. Определяем имя накопителя, на котором находится этот файл
  3. Определяем путь файла относительно накопителя на котором он находится. Получаем строчку вида android/folder/file.txt
  4. Разделяем строчку символом «/»
  5. В цикле для каждой полученной части находим DocumentFile, представляющий этот путь, на основе DocumentFile для предыдущей части
  6. Если алгоритм завершился без ошибок, имеем на выходе DocumentFile, представляющий наш файл

Public DocumentFile getDocumentFile(File file) { DocumentFile document = null; String baseFolder = null; for (String path: getAllPaths()) { File filePath = new File(path); if (filePath.getAbsolutePath().startsWith(file.getAbsolutePath())) { baseFolder = filePath.getAbsolutePath(); break; } } if (baseFolder == null) { return null; } try { String relativePath = file.getCanonicalPath().substring(baseFolder.length() + 1); Uri permissionUri = Uri.parse(sharedPreferences.getString(SD_CARD_URI)); document = getDocumentFileForUri(permissionUri, relativePath); } catch (Exception e) { e.printStackTrace(); } return document; } /* Метод для получения DocumentFile (шаги 4-6) */ private DocumentFile getDocumentFileForUri(Uri treeUri, String relativePath) { String parts = relativePath.split("/"); if (parts.length == 0) { return null; } DocumentFile document = DocumentFile.fromTreeUri(mContext, treeUri); for (String part: parts) { DocumentFile nextDocument = document.findFile(part); if (nextDocument != null) { document = nextDocument; } } return document; }

FileOutputStream outputStream = (FileOutputStream) mContentResolver.openOutputStream(documentFile.getUri());

Пример копирования файла класса File в DocumentFile:

Public void copyFile(File sourceFile, DocumentFile document) { FileInputStream inputStream = null; FileOutputStream outputStream = null; try { inputStream = new FileInputStream(sourceFile); outputStream = (FileOutputStream) mContentResolver.openOutputStream(document.getUri()); FileChannel fileChannelIn = inputStream.getChannel(); FileChannel fileChannelOut = outputStream.getChannel(); fileChannelIn.transferTo(0, fileChannelIn.size(), fileChannelOut); //noinspection ResultOfMethodCallIgnored sourceFile.delete(); } catch (IOException e) { e.printStackTrace(); //noinspection ResultOfMethodCallIgnored sourceFile.delete(); } finally { try { if (inputStream != null) inputStream.close(); if (outputStream != null) outputStream.close(); } catch (IOException e) { e.printStackTrace(); } } }

И еще хочу сказать, что теперь код наполнится таким проверками

Public void writeFile(File file) { boolean fileWritable = isFileWritable(file); boolean hasSdCardUri = !sharedPreferences.getString(SD_CARD_URI).isEmpty(); if (fileWritable || hasSdCardUri) { /* можно редактировать файл обычно, либо SAF */ return; } if (Build.VERSION.SDK_INT >= 21) { /* добро пожаловать! (запрашиваем у юзера разрешение) */ throw new NoLollipopWritePermissionException(); ` } else if (Build.VERSION.SDK_INT == 19) { /* до свидания! (не можем редактировать) */ throw new NoKitkatWritePermissionException(); } }

Заключение

Надеюсь, что мой опыт, описанный в статье, поможет тем, кто еще не работал с SD-картой, избежать долгих исследований и поиска.

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

Внутренняя память представлена оперативной, постоянной и кэш-памятью. К ее плюсам относят быстродействие, а минусом является ограниченный объем сохраняемых данных.

Очень часто современному пользователю персонального компьютера и прочей электронной техники приходится сталкиваться с таким предложением: «установить в корень карты памяти» или «скопировать в корень карточки». Оно может встретиться где угодно, так как современная техника все в большем объеме начинает поддерживать сторонние карты для увеличения внутренней памяти.

Карты памяти стандартизированы. Они имеют определенные габаритные размеры и расположение площадок контактов в зависимости от типа устройств, для использования на которых они предназначаются.

Сюда относятся ноутбуки, планшеты, смартфоны, цифровые фотоаппараты и даже PSP с прочими игровыми приставками. Поэтому для корректной работы с ними не обойтись без четкого представления о том, что может значить выражение «корень карты памяти» и где он может находиться.

Название места для сохранения данных на карточке происходит от английского слова root – «коренной, корень», обозначающего что-то первозданное, исконное. Оно вошло в употребление еще в самом начале, когда только стали появляться компьютеры. На них root-ом называли само содержание устройства, то есть то место, откуда запускалась система, и где можно было сохранять данные. По сути, в отношении нынешних карт памяти данное обозначение ничуть не изменилось.

Корневой каталог

Сегодня корнем карты памяти называют именно сам каталог, который размещен на карточке. Это та самая папка, которая запускается при нажатии на иконку с карточкой памяти в смартфоне или . Просто слово root было переведено дословно, и теперь используется именно его русский аналог для обозначения самой карты. Таким образом, если вас просят скопировать данные в корень, то вам не нужно создавать ничего дополнительного на карте памяти, а просто скопировать нужные файлы на нее саму, в корневой каталог.

1. Загрузить в устройстово установочный файл SAS4Android.apk

2. Включить на своём устройстве (телефоне, планшете и пр.) разрешение на установку сторонних приложений (не из Маркета). Это можно сделать в настройках своего устройства: Настройки - Безопасность - Неизвестные источники – установить галочку Разрешить установку приложений из неизвестных источников (после установки SAS4Android эту галочку можно снять). Скопируйте файл SAS4Android.apk на своё устройство и запустите его установку.

3. Запустить файл SAS4Android.apk .

4. При первом запуске появляется окно с запросом пути до корня CD карты и согласием с условием использования. Нажать ОК. Также при первом запуске автоматически создается рабочая папка приложения - SAS4Android и в ней папка work . Это рабочая папка программы, в которой будут сохраняться необходимые данные. Обратите внимание, что нужно указать путь именно до корня SD-карты (а не до какой-либо другой папки) – это важно!

По умолчанию структура папок программы такова:

корень_SD-карты/SAS4Android/work - рабочая папка - создается автоматически;

корень_SD-карты/SAS4Android/cache - папка с кэшем - создается пользователем.

Если используется структура папок по умолчанию, программа автоматически определяет пути к нужным папкам и файлам. Если используется другая структура папок, пути необходимо указывать вручную. В устройствах с версией Android до 4.3.x рекомендуется использовать именно структуру папок по умолчанию.

Определить путь до карточки можно следующим способом: Перед тем, как вставлять SD-карту в устройство, создайте (на компьютере) на ней папку с понятным вам названием, например имя .
Отключите устройство от компьютера, иначе SD-карта в режиме накопителя не будет доступна для Андроида и всех программ. (Удобнее пользоваться для связи с компьютером программой MyPhoneExplorer, которая позволяет редактировать информацию на устройстве через компьютер иSD-карта остаётся доступной для всех). Откройте любой файловый менеджер на устройстве и войдите в самую корневую директорию устройства. Там будет несколько директорий. Просматривая их содержимое, найдите в одной из них «свою» папку. Путь, который показывает файловый менеджер до корня этой директории, и есть то, что нужно. Запомните или запишите его. В разных устройствах и и версиях Андроида возможны и разные варианты размещения и названия папки SD-карты. При наличии папки mnt нпример mnt/sdkard , или mnt/external_sd , или mnt/extSdkard . На некоторых устройствах папки mnt может и не быть. В таком случае папка, смонтированная на карточку, обычно лежит прямо в корне устройства, например так: /Sdkard или /Sdkard1 или /extSdkard . На Андроидах версий 4. и выше, обычно встречается такая папка: storage/Sdkard или storage/Sdkard1 или storage/external_sd или storage/extSdkard .
Итак, пусть мы определили, что SD-карта у нас смонтирована как /mnt/external . Вот именно такой путь надо ввести (а лучше выбрать, открыв файловый диалог кнопкой […]) при первом запуске программы до появления меню.

Особенности запуска на Андроид 4.4 и выше

На Андроиде 4.4 и выше права приложения на запись на SD-карту убрали. Если производитель не подправил прошивку при сборке, то приложение на нерутованом аппарате писать на SD-карту не сможет. В этом случае программа сама попытается найти, где разместить рабочую директорию. Скорее всего это будет директория в разделе данных приложения во внутренней памяти (некопителе) устройства.
При этом программа будет работать, данные будут записываться в папку work , считываться оттуда. Но пользователь будет лишён возможности взять что-либо из папки work или что-либо положить туда. Разумеется, речь идёт о нерутованном устройстве. Если такое состояние дел устраивает пользователя, то больше ничего делать не нужно. В противном случае придётся поработать руками.
Нужно найти такое место на устройстве, в которое и программа сможет записывать данные, и мы сможем эти данные оттуда брать и добавлять свои в случае необходимости.
Экспериментальным путём удалось отыскать такое место. Порядок действий по установке:

1. Подключаем устройство USB кабелем к компьютеру и создаём в директории внутреннего накопителя папку Data . Или в самом устройстве делаем то же самое с помощью файлового менеджера. Путь должен быть storage/sdcard0/Data . В папку Data укладываем файл .nomedia .
Внимание! Все попытки создать папку work (видимую и редактируемую на компьютере) в других местах/папках внутренней памяти безуспешны . Создать можно, и даже при первом запуске SAS4Android можно указать путь до желаемой папки. Но после установки доступ к данной папке становится невозможным. Через файловый менеджер устройства посмотреть можно, а вот добавить что-нибудь (треки, новый ключ лицензии, конфиги карт/слоев и т. д.) из съёмной карты или компьютера, а также скопировать на съёмную карту или компьютер - невозможно.
Почему для папки выбрано имя "Data" ? Хитрость заключается в том, что оно совпадает с именем Data , принятом в стандартной терминологии устройства, а кроме того Android различает большие и малые буквы. В итого система Android воспринимает данную папку, как свою собственную и не ограничивает её содержимое в правах.

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

Теперь созданная нами папка storage/sdcard0/Data будет выполнять роль , путь к которому нужно указывать при первом запуске программы.
2. Создаём в корне внешней SD-карты папку SAS4Android , а в этой папке – папку cache . Туда укладываем кэш. Путь к кэшу будет .
3. При первом запуске программа запросит путь к корню SD-карты. Указываем путь к созданной нами папке: storage/sdcard0/Data . В папке Data программа создаст папку SAS4Android , а в ней папку work со стандартным базовым набором файлов. Теперь все рабочие файлы программы будут размещаться в папке storage/sdcard0/Data/SAS4Android/work , и мы будем иметь доступ к ним.
4. Теперь необходимо указать программе путь к кэшу, так как он у нас отличается от пути по умолчанию. Для этого в запущенной программе входим в Настройки - Директория кэша карт и с помощью файлового диалога указываем путь storage/sdcard1/SAS4Android/cache .Установка завершена.
#!!! Многочисленные проверки показали, что при такой установке SAS4Android в устройства под Android 4.4.4, при дальнейших обновлениях или даже полном удалении и переустановке приложения директория storage/sdcard0/Data остаётся рабочей, содержимое work не теряется и не ломается, доступ к редактированию work как через устройство, так и через компьютер открыт. Проверено на Sony Xperia Z, а также Z3 compact и WinXP/ Win7.
#!!! В том, что рабочая директория work вынужденно оказывается на внутренней памяти устройства, есть один существенный плюс – в случае глюка/отваливания SD-карты в полевых условиях, а это может произойти с каждым, вы лишаетесь (временно) только кэша, а треклог и остальное содержимое work останется целым и работающим.
Совет : всегда полезно иметь крайний резерв - периодически, после появления важных новых треков и точек, копирую/сохраняю этот изменённый рабочий work на SD-карту в родную папку SAS4Android, рядом с cache . Там work , естественно,не работает- это просто сохранёнка. А вдруг зверь глюкнет - тогда карточка выручит по поводу частичного восстановления.

#!!! В Android 4.4.x (если производитель не подправил прошивку при сборке) он лайн подкачка данных картографии в неупакованный кэш из сторонних сервисов с помощью скриптов, написанных на JavaScript, без рута возможна только во внутреннюю память. Для загрузки кэша он лайн потребуется дополнительно создать вторуб папку cache в рабочей директории программы storage/sdcard0/Data/SAS4Android/ и заранее уложить в неё требуемое количество папок с именами источников карт/слоев и с размещенными в них скриптами. Придется привыкать к переключениями между двумя директориями кэша в зависимости от текущих потребностей: для работы без подкачки - с основным cache , а с подкачкой - переключаемся на cache во внутренней памяти.

Выход в меню настроек программы.

После запуска программы выход в меню настроек осуществляется нажатием на системную кнопку “Меню”. Это может быть как аппаратная кнопка так и экранная кнопка в нижней части экрана (три вертикальные точки ). В зависимости от вашего аппарата и версии Андроида на нем, это может быть либо аппаратная, либо экранная кнопка в нижней части экрана. На многих новых аппаратах с Андроидом версий 4 и выше эта кнопка совмещена с кнопкой списка запущенных приложений (два совмещенных прямоугольничка ). В этом случае для выхода в меню достаточно нажать и удерживать нажатой кнопку запущенных приложений до появления меню настроек.

Особенности включения и выключения SAS4Android

При запуске программы включаются все режимы: отображение карт, навигация, запись трек лога (запуск сервиса). Имеется возможность выйти из приложения (перевести в спящий режим) без остановки сервиса, т.е. записи трек лога. В зависимости от настроек (режим записи трек лога, режим остановки сервиса) при необходимости запустить какую либо другую программу, позвонить или ответить на звонок при сохранении работающего сервиса следует использовать либо кнопку back , либо кнопку "домой" в виде домика.

Для остановки сервиса, в зависиммости от настроек, использовать двойной клик на кнопку «Назад», либо опустить "шторку", в списке запущенных приложений кликнуть по строке SAS4Android , нажать на кнопку Остановить.

#!!! В планшетах чаще всего статусная строка находится внизу. В её правой части группируются значки запущенных приложений. Если кликнуть по любому значку, то всплывет окно с линейкой со значками "Быстрых параметров" (звук, яркость WiFi, БТ, сеть, местоположение и т.п.), а ниже построчный список запущенных приложений.

Особенности распространения прораммы

Программа SAS4Android распространяется бесплатно.

Ограничение срока работы приложения - примечание автора.

После многократного и злостного нарушения авторских прав некоторыми нечистыми на руку торговцами навигаторами автору пришлось ввести ограничение - после установки (или очередного обновления) программа SAS4Android исправно работает в течение 1 месяца от даты выкладывания апдейта, а затем частично "ломается" - протухает . Выражается это в сокращении времени непрерывной записи треклога (обычно в пределях 20-30 мин) после чего запись прекращается, на экране появляется соответствующее сообщение. Далее остается только перезагрузить программу (закрыть приложение и сервис и заппустить их снова). И так непредсказуемое число раз до окончания путешествия. Треки при этом записываются, но с разрывами. Простое, но хлопотное решение данной проблемы - регулярное, 1 раз в месяц, обновление. Каждый новый апдейт имеет более позднюю дату "протухания", так что обновитесь и вперёд...

Но есть способ лучше.

В программе заложен алгоритм снятия ограничения - ключ license.dat, отключающий "протухание". Автор дарит ключи в знак благодарности поддержавшим проект. Так что не спрашивайте "сколько стоит" и "как купить". Зайдите на любую страницу форума и внимательно посмотрите в "шапку".

Ключи не продаются! Пожертвования с любыми упоминаниями о ключах или покупке в комментариях будут возвращены отправителям.

Для генераци ключа необходим файл deviceld.txt . Он формируется самой програмой SAS4Android и помещается в папку work .

Проверьте для начала, что на Вашем устройстве файл deviceld.txt есть.

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

Если у Вас файл deviceld.txt пустой или не рабочий (остался от старой версии программы до сброса заводских настроек или обновления системы).

1. Удаляем старый deviceld.txt .

2. Запускаем программу.

3. Ждем, пока словит спутники (строка координат станет черной).

4. Закрываем программу. Действующий идентификатор должен появиться в папке work .

Обратите внимание на тот факт , что ключ привязан к идентификатору устройства. На Андроиде при установке обновления системы изменяется идентификатор устройства. К этому же приводит сброс до заводских настроек. (Почему так? Спросите у производителей Вашего устройства).

Так что, если Вы обновите систему или сделаете сброс до заводских настроек, то ключ работать перестанет.

Тем не менее, и это решаемо заменой ключа. Все вопросы про снятие ограничений задавайте в личку автору программы.