Получение пути к карте памяти SD Card на Android. Обновление на Android Lollipop и особенности работы с внешней картой памяти

Я купил новый телефон Samsung Galaxy S5, и сразу столкнулся с проблемой в операционной системе Android. А точнее, версии Андроид 4.4 KitKat. В этой версии Андроид введена новая фишка разработчиков Google.

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

Я расскажу вам, как обойти эту проблему!

Добрый день, уважаемые читатели нашего блога!

На днях я купил себе новый телефон! Samsung Galaxy S5!

НАСЛАЖДЕНИЕ НОВЫМ ТЕЛЕФОНОМ

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

Ранее у меня уже был телефон HTC (ему уже около 4-5 лет) с Андроид системой. Один из первых телефонов с такой системой (на момент покупки). Я его изучил вдоль и поперек, перепрошивал систему несколько раз, выбрал прошивку Андроид, которая по функционалу много превосходила на тот момент официальную.

Для тех, кто не в курсе, перепрошивка — это замена операционной системы телефона. Ну примерно как переустановка Windows на компьютере.

Прошло много времени, вышло много версий Андроид (на момент покупки у меня была Андроид 2.2). Новые версии и телефоны, на которых они устанавливались, много превосходят мой старенький смартфон. Поэтому я был сильно удивлен мощью, быстротой и функциональностью.

Наслаждался я около 4 суток. Затем наткнулся на проблему!

ПРОБЛЕМА! Файловая система запрещает редактирование файла!

После очередного обновления, операционная система телефона сама обновилась до версии Андроид 4.4

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

Посмотрев информацию об операционной системе в Настройки — Об устройстве — Состояние SE для Android я увидел слово Enforcing.

Это кодовое слово Google означает версию Андроид, где на уровне ядра операционной системы ограничены права приложений! ЕМАЕ! Ну я попал!

Я обратился к интернету за решением проблемы

Вот, что я обнаружил:

Х очу заметить, что мой телефон совсем новый, с гарантией от производителя на 5 лет!

Если получитьRoot-доступ (администраторские права в системе Андроид), то гарантия от производителя (Samsung) исчезает. По правде сказать, некоторые хакерские сайты утверждают, что есть специальные методы вернуть заводской счетчик к первоначальному положению. Заводской счетчик при получании Root-доступа обнуляется. Это показывает обслуживающей компании о том, что телефон был взломан, и гарантия на него не распространяется.

Чтобы повлиять на этот счетчик, нужно разобрать телефон и залезть в микросхемы. Поэтому не ведитесь на такие обманы!

Если вы получите Root-доступ, то гарантия у вас исчезнет! Проверено на своем старом телефоне!


В новой версии Андроид 5.0 Google использует другую логику запрета на доступ к внешним SD-картам памяти.

1. Каким образом работает новая логика?

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

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

Теперь, в Андроид 5.0, все приложения устанавливаются в скомпилированном, разархивированном виде. Это приводит к тому, что приложения расходуют больше места, но быстрее выполняются!

2. К чему это приводит?

  1. Права доступа задаются приложению ПРИ УСТАНОВКЕ!
  2. Пользователь вправе сам устанавливать права конкретному приложению при установке.
  3. Пользователь может поменять права приложению. Например, если вы доверяете какой-то программе, то можете разрешить ей редактирование файлов на внешней карте памяти.

Я ХОЧУ ОБНОВИТЬ АНДРОИД ДО ВЕРСИИ 5.0, чтобы решить проблему!

Если я обновлю ОФИЦИАЛЬНО версию операционной системы, то я СОХРАНЮ ГАРАНТИЮ!

Но мне нужна версия Андроид для России (именно для нее, а не для другой страны), чтобы не мучиться с английскими словами в интерфейсе.

Попытаюсь найти ее.

Официальная программа поддержки Samsung телефонов Kies говорит, что мой телефон обновлен до последней версии По.

Официальных обновлений Андроид (для нашего региона) я не нашел на официальных сайтах.

На форумах я нашел информацию, что Google выпустила версию прошивки для России в январе 2015. Но очень медленно внедряется на аппараты клиентов.

Таким образом, я могу подождать, пока на мой аппарат не поступит сообщение о том, что есть обновление По. После этого я смогу обновить Андроид.

Можно, не дожидаясь приглашения, самому прошить на новую прошивку.

РАБОТАЮЩИЙ Способ редактирования файлов (с помощью компьютера) на телефоне с Android 4.4 версии Enforcing.

После того, как я решил дождаться официального обновления, стал рыться в файловой системе на телефоне. И обнаружил странное:

  1. Есть права на редактирование папок — перемещение, переименование!
  2. Можно удалять файлы, перемещать в другие папки (как копии)
  3. Нет прав на редактирование файлов!

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

То есть что мы делаем:

  1. Открываем файл на редактирование
  2. Сохраняем на компьютере (на телефоне не даст сохранить копию!)
  3. удаляем файл из телефона
  4. переписываем копию на место удаленного файла!

Таким образом мы получаем измененный файл (с помощью промежуточной копии)!

Вот такие дела, товарищи!

Будут новости, сразу отпишусь!

А теперь пока, до скорого!

Свершилось! На планшет, а именно, на Asus MeMO Pad 7, который я на замену своему честному трудяге, прилетело обновление до Android 5.0.1. Теперь у меня есть устройство с Леденцом, или, как пишут в интернете, с Лолипопой.

Обнова прилетела несколько неожиданно. Если честно, я ждал в апреле новую прошивку на телефон (Asus ZenFone 5) - ее, по крайней мере, обещали. Про планшет же никто ничего не говорил и тут - на тебе, получите и распишитесь.

Это, на самом деле, обескуражило меня (в хорошем, конечно, смысле), еще и потому, что планшет я приобрел в декабре, и на нем стояла версия 4.3. То есть, это второй существенный апдейт операционной системы (на самом деле, обнов было больше, но номер версии Android не менялся). Предыдущий производитель моих устройств - Samsung - не мог похвастаться такой скорострельностью, хотя, тоже дважды обновлял операционку: с Android 3.2 до Android 4.1.2 (через 4.0.1). Только вот ждать этих новых версий приходилось значительно дольше.

Что ж, да здравствуют сюрпризы! Получив уведомление о выходе новой версии прошивки, я тут же скачал ее, а это больше 700 метров, и запустил обновление. Так как качал я не через домашнюю сеть , а через мобильную, то времени на все про все потребовалось чуть больше: от начала загрузки до завершения обновления прошло около часа. Само обновление длилось где-то минут двадцать, но, потенциально, может занимать и больше времени - потому, что после установки операционки следует процесс обновления установленных программ. У меня счетчик досчитал до 205. Но вот, процесс завершился и настало время посмотреть, что же изменилось.

Первое, что бросилось в глаза - более утонченная графика при разблокировке устройства. Второе - рука в области уведомлений. Пару дней я ее терпел, надеясь на то, что случайно где-нибудь увижу что-нибудь, связанное с ней. Не увидел. Тогда стал искать целенаправленно и нашел разъяснение по ней на 4pda . Оказывается, оповещения поделили на важные и не очень, и есть возможность указать, какие оповещения вы хотите получать. Если выставить опцию Оповещать всегда , то рука пропадает, если опцию Только важные оповещения , то рука появляется. Если честно, руку я убирал несколько раз, но, почему-то, она стабильно возвращается. Почему? Пока не знаю.

Вот, собственно, сама процедура по "убиранию" этой руки:

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

Официальных обновлений Андроид (для нашего региона) я не нашел на официальных сайтах.

На форумах я нашел информацию, что Google выпустила версию прошивки для России в январе 2015. Но очень медленно внедряется на аппараты клиентов.

Таким образом, я могу подождать, пока на мой аппарат не поступит сообщение о том, что есть обновление По. После этого я смогу обновить Андроид.

Давайте поговорим о том, как снять защиту записи с SD-карты памяти на Android. Многие люди сталкиваются с этой проблемой, когда пытаются скопировать или переместить файлы на SD карту. В этой статье вы найдете несколько способов как снять защиту записи Android.

Как снять защиту записи с SD-карты Android

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

Как снять защиту записи Android c SD-карты с помощью Regedit

Большинство проблем и ошибок легко решаются с помощью реестра. Также мы можем использовать его, чтобы снять защиту записи Android.


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

Как снять защиту записи Android c SD-карты с помощью Diskpart

  1. Вставьте SD-карту памяти в компьютер и запустите командую строку. Вы можете сделать это, нажав клавишу WIN+R и написав «CMD», или просто ввести «Командная строка» в меню Пуска.
  2. В окне командной строки вы должны ввести следующие команды по порядку.

  • diskpart
  • list disk
  • select disk x (где Х – это номер вашей SD карты)
  • attributes disk clear readonly
  • clean
  • create partition primary
  • format fs=fat32

Если и этот способ не помог снять защиту записи Android, не отчаивайтесь, у нас есть еще парочка решений этой проблемы.

Изменить разрешение

  1. Вставьте SD карту памяти в компьютер. Щелкните правой кнопкой мыши на карту памяти и выберите Свойства. Затем во вкладке Безопасность вы найдете имя вашей учетной записи.
  2. Измените разрешение для SD-карты на «Чтение/запись», «Чтение/Выполнение» или «Полный контроль».

Этот способ позволит снять защиту записи Android.

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

Надеемся, вам удалось снять защиту записи Android. Если у вас остались вопросы, пожалуйста, напишите в комментариях ниже.

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

Итак, начнем с теории.

Терминология

Гугл нам говорит, что есть следующие понятия:
  1. Внутренняя (internal ) память - это часть встроенной в телефон карты памяти. При ее использовании по умолчанию папка приложения защищена от доступа других приложений (Using the Internal Storage).
  2. Внешняя (external ) память - это общее «внешнее хранилище», т.е. это может быть как часть встроенной памяти, так и удаляемое устройство. Обычно это часть встроенной памяти, как удаляемое устройство я видел в последний раз на андройде 2.2, где встроенная память была около 2Гб, и подключаемая память становилась внешней (Using the External Storage).
  3. Удаляемая (removable ) память - все хранилища, которые могут быть удалены из устройства без «хирургических» вмешательств.

До версии KitKat 4.4 API не предоставляло функционала для получения путей к внешней памяти. Начиная с этой версии (API 19) появилась функция public abstract File getExternalFilesDirs (String type), которая возвращает массив строк с путями к внутренней и внешней памяти. Но как же быть с нашей SD Card, которая вставлена в слот? Путь к ней мы опять не можем получить.

Результаты поиска

Чтобы ответить на поставленный вопрос я обратился к всезнающему гуглу. Но и он мне не дал четкого ответа. Было рассмотрено множество вариантов определения от использования стандартных функций, которые ведут к внешней памяти, но ничего общего с удаляемыми устройствами хранения данных они не имеют, до обработки правил монтирования устройств (Android же на ядре Linux работает). В последних случаях были использованы «зашитые» пути к папке с примонтироваными устройствами (в различных версиях эта директория разная). Не стоит забывать, что от версии к версии правила монтирования меняются.

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

Описание кода

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

Public enum MountDeviceType { EXTERNAL_SD_CARD, REMOVABLE_SD_CARD }
И был создан класс StorageHelper , который и осуществляет поиск доступных карт памяти.

В классе StorageHelper реализовано два способа поиска - через системное окружение (Environment ) и с использованием утилиты Linux mount , а точнее результата ее выполнения.

Способ первый - Environment
При работе с окружением я использую стандартную функцию getExternalStorageDirectory() для получения информации о внешней памяти. Чтобы получить информацию о удаляемой памяти, я использую переменную окружения "SECONDARY_STORAGE ".

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

Функция fillDevicesEnvirement

String path = android.os.Environment.getExternalStorageDirectory() .getAbsolutePath(); if (!path.trim().isEmpty() && android.os.Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED)) { testAndAdd(path, MountDeviceType.EXTERNAL_SD_CARD); } // Получаем ремувабл String rawSecondaryStoragesStr = System.getenv("SECONDARY_STORAGE"); if (rawSecondaryStoragesStr != null && !rawSecondaryStoragesStr.isEmpty()) { // All Secondary SD-CARDs splited into array final String rawSecondaryStorages = rawSecondaryStoragesStr .split(File.pathSeparator); for (String rawSecondaryStorage: rawSecondaryStorages) { testAndAdd(rawSecondaryStorage, MountDeviceType.REMOVABLE_SD_CARD); } }


Вариант решения взят со stackoverflow . Ответ где-то там внизу.
Способ второй - mount
Так как у меня долго не получалось заставить систему мне сказать путь к удаляемой памяти, я решил искать в сторону примонтированных устройств. В системе есть файлы конфигурации, в которых описаны правила монтирования внешних устройств. Все бы хорошо, но на Android версии 4.* к этому файлу простым смертным доступа нет, поэтому рассматривать этот способ не буду.

Вернемся к утилите mount. При запуске без параметров команда возвращает список смонтированных файловых систем. Удаляемые устройства имеют обычно формат файловой системы FAT, то будем выделять строки, в которых есть характеристика "fat ". Внешняя память будет характеризоваться параметром "fuse ".

Примечание: при использовании такого способа не всегда корректно (скорее всего я что-то не учел) определяются типы смотнтированных устройств. Разницу замечал на разных версиях Android. Поэтому этот способ можно использовать как дополнительный.

Функция fillDevicesProcess

try { Runtime runtime = Runtime.getRuntime(); proc = runtime.exec("mount"); try { is = proc.getInputStream(); isr = new InputStreamReader(is); br = new BufferedReader(isr); while ((line = br.readLine()) != null) { if (line.contains("secure")) continue; if (line.contains("asec")) continue; if (line.contains("fat")) {// TF card String columns = line.split(" "); if (columns != null && columns.length > 1) { testAndAdd(columns, MountDeviceType.REMOVABLE_SD_CARD); } } else if (line.contains("fuse")) {// internal(External) // storage String columns = line.split(" "); if (columns != null && columns.length > 1) { // mount = mount.concat(columns + "\n"); testAndAdd(columns, MountDeviceType.EXTERNAL_SD_CARD); } } } } finally { ... } } catch (Exception e) { ... }

Исходный код всего класса расположен еще нигде не расположен. На днях постараюсь разместить на gitHub.

Кто еще какими способами пользуется?

Теги:

  • android
  • разработка под android
  • sd card
Добавить метки

С обновлением до пользователи получили ряд ограничений на использование SD карт. Решить эту проблему до недавних пор можно было при помощи кастомной прошивки или отката к более ранней версии ОС. Теперь же былые возможности можно вернуть и на Android 4.4 KitKat . О том, как это сделать, читайте далее.

Прежде всего, вам потребуется получить root-права для своего Android устройства. Второе важное условие – это приложение SDFix . Скачать приложение на Андроид бесплатно можно прямиком с . Для этого воспользуйтесь ссылкой, указанной далее.

Установив SDFix на свой Android , вы в несколько тапов восстановите былые возможности. Принцип работы приложения заключается в том, что SDFix добавляет Android UNIX группу "media_rw" к WRITE_EXTERNAL_STORAGE , таким образом, используемый в Android 4.4 KitKat XML файл меняется на platform.xml . При этом создается резервная копия изначальной настройки platform.xml.original-pre-sdfix , которую можно использовать для восстановления ограничений. Чтобы вернуть систему к стоковому состоянию, необходимо воспользоваться проводником с поддержкой root-доступа и заменить platform.xml на platform.xml.original-pre-sdfix.

Отдельно необходимо отметить, что приложения, которые используют SD, получат более низкий уровень безопасности. Также важным является тот факт, что SDFix приводит к перманентным изменениям, а это означает, что после восстановления старых полномочий приложение можно удалить.