Как разрешить запись на sd карту android

Как разрешить запись на sd карту android

…ОС ограничивает приложениям доступ на карту памяти SD. Даже если пользователь предоставит разрешение, утилиты смогут записывать только в общедоступные папки и не смогут писать файлы по другим адресам.

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

Далее я полез на 4pda.ru и нашел там ниже следующую инструкцию:

Как же меня достали вопли о проблемах с записью файлов на внешнюю sd-карту под Android 4.4 и советы гуру о обязательном применении патча и рутовании. На самом деле все просто: несистемным приложениям запрещено писать в чужую (!) папку, а в свою можно. Авторы приложений, имеющие мозг – уже давно все поправили. А для прочих приложеий есть голова и руки у владельцев устройства.

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

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. Получаем профит – карты отлично скачиваются и сохраняются на внешнюю карту.
И так для любого приложения и без всякого рута!

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

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

Каков лучший способ предоставить доступ на чтение / запись к внешней SD-карте на разных уровнях api (Pre-KitKat, KitKat, Lollipop +)?

Обновление 1

Я пробовал метод 1 из ответа Doomknight, безрезультатно: поскольку вы можете видеть, что я проверяю разрешения во время выполнения, прежде чем пытаться писать на SD:

Но я получаю ошибку доступа, пробовал на двух разных устройствах: HTC10 и Shield K1

1. Резюме.

Нет универсального способа записи на внешнюю SD-карту на Android из-за постоянных изменений :

Pre-KitKat: официальная платформа Android не поддерживает SD-карты вообще, за исключением исключений.

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

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

Нугат: предоставил упрощенный API для доступа к общим внешним хранилищам.

Вы можете предоставить доступ на чтение / запись к внешней SD-карте на разных уровнях api ( API23 + во время выполнения ).

Поскольку KitKat, разрешения не нужны, если вы используете каталоги, специфичные для приложения, в противном случае:

С Kitkat ваши шансы на «полное решение» без укоренения практически нулевые: проект Android определенно испортил здесь. Приложения не имеют полного доступа к внешней SD-карте:

  • Файловые менеджеры: вы не можете использовать их для управления внешней SD-картой. В большинстве областей они могут читать, но не писать.
  • Медиа-приложения: вы больше не можете перенастраивать / реорганизовывать медиа-коллекцию, так как эти приложения не могут писать на нее.
  • Офисные приложения: почти то же самое

Единственное место, которое 3-х сторонним приложениям разрешено записывать на вашу внешнюю карту, – это «их собственные каталоги» (т.е. /sdcard/Android/data/

Единственные способы исправления, требующие либо производителя (некоторые из них исправили его, например, Huawei с обновлением Kitkat для P6) – или root … (объяснение Иззи продолжается)

ContextCompat.getExternalFilesDirs решает проблему, если вам не нужен доступ к другим папкам .

2. Об универсальном решении.

В истории говорится, что нет универсального способа записи на внешнюю SD-карту, но продолжается …

Этот факт демонстрируется этими примерами конфигураций внешнего хранилища для устройств .

Доступ к внешнему хранилищу защищен различными разрешениями на Android. Начиная с Android 1.0, доступ на запись защищен с WRITE_EXTERNAL_STORAGE разрешения WRITE_EXTERNAL_STORAGE . Начиная с Android 4.1, доступ на чтение защищен с READ_EXTERNAL_STORAGE разрешения READ_EXTERNAL_STORAGE .

Начиная с Android 4.4, владелец, группа и режимы файлов на внешних устройствах хранения теперь синтезируются на основе структуры каталогов. Это позволяет приложениям управлять своими каталогами, зависящими от пакета, на внешнем хранилище, не требуя, чтобы они имели широкое разрешение WRITE_EXTERNAL_STORAGE . Например, приложение с именем пакета com.example.foo теперь может свободно получить доступ к файлам Android/data/com.example.foo/ на внешних устройствах хранения без каких-либо разрешений. Эти синтезированные разрешения выполняются путем упаковки необработанных устройств хранения данных в демон FUSE.

Android 6.0 представляет новую модель разрешений времени выполнения, где приложения запрашивают возможности, когда это необходимо во время выполнения. Поскольку новая модель включает разрешения READ/WRITE_EXTERNAL_STORAGE , платформа должна динамически предоставлять доступ к хранилищу, не убивая или не перезапуская уже запущенные приложения. Он делает это, сохраняя три разных вида всех установленных устройств хранения:

  • / Mnt / runtime / default отображается приложениям без специальных разрешений на хранение …
  • / Mnt / runtime / read отображается в приложениях с READ_EXTERNAL_STORAGE
  • / Mnt / runtime / write отображается приложениям с WRITE_EXTERNAL_STORAGE
Читайте также:  Как найти объем воздуха зная объем кислорода

3. О вашем обновлении 1.

Я бы использовал каталоги конкретных приложений, чтобы избежать проблемы с вашим обновленным вопросом и ContextCompat.getExternalFilesDirs() используя документацию getExternalFilesDir в качестве ссылки.

Улучшите эвристику, чтобы определить, что представляет собой съемный носитель на основе различных уровней api, таких как android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT

Помните, что Android 6.0 поддерживает переносные устройства хранения данных, а сторонние приложения должны проходить через систему доступа к хранилищу . Ваши устройства HTC10 и Shield K1 , вероятно, являются API 23.

В вашем журнале показано разрешение, /mnt/media_rw доступ к исключениям /mnt/media_rw , как это исправление для API 19+:

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

Возможно , альтернатива Gizm0 для вашего getStorageDirectories() – хорошая отправная точка.

ContextCompat.getExternalFilesDirs решает проблему, если вам не нужен доступ к другим папкам .

4. Запросить разрешения в манифесте (Api = 23).

Добавьте следующий код в ваш AndroidManifest.xml и прочитайте « Получение доступа к внешнему хранилищу».

Чтобы … написать файлы на внешнем хранилище, ваше приложение должно получить … системные разрешения:

Если вам нужно обоим …, вам нужно запросить только разрешение WRITE_EXTERNAL_STORAGE .

Игнорируйте следующую заметку из-за ошибок, но попробуйте использовать ContextCompat.getExternalFilesDirs() :

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

Запросить разрешения во время выполнения, если уровень API 23+ и прочитать Запрос разрешений во время выполнения

Начиная с Android 6.0 (уровень API 23), пользователи предоставляют разрешения для приложений во время работы приложения, а не когда они устанавливают приложение … или обновляют приложение … пользователь может отменить разрешения.

5. До того, как KitKat попытается использовать метод Doomsknight 1, метод 2 в противном случае.

Прочитайте объяснение Марка Мерфи и рекомендовали Дайан Хакборн и Дейв Смит

  • До Android 4.4 официальная поддержка съемных носителей в Android, начиная с KitKat, в FMW API возникает концепция «первичного» и «вторичного» внешнего хранилища.
  • Предыдущие приложения просто полагаются на индексацию MediaStore, поставляют аппаратное обеспечение или проверяют точки монтирования и применяют некоторые эвристики для определения того, что представляет собой съемный носитель.
  • Начиная с Android 4.2, у разработчиков устройств был запрос на блокировку съемных носителей для обеспечения безопасности (многопользовательская поддержка), а новые тесты были добавлены в 4.4.
  • Поскольку KiKat getExternalFilesDirs() и другие методы были добавлены, чтобы вернуть полезный путь на всех доступных томах хранения (первым возвращенным элементом является основной том).
  • В приведенной ниже таблице указано, что разработчик может попытаться сделать и как ответит KitKat:

До того, как KitKat попытается использовать метод Doomsknight 1 или прочитать этот ответ Gnathonic или gist :

Также прочитайте объяснение Паоло Ровелли и попробуйте использовать решение Джеффа Шарки с KitKat:

В KitKat теперь существует общедоступный API для взаимодействия с этими вторичными устройствами хранения данных.

Новые Context.getExternalFilesDirs() и Context.getExternalCacheDirs() могут возвращать несколько путей, включая как первичные, так и вторичные устройства.

Затем вы можете перебрать их и проверить Environment.getStorageState() и File.getFreeSpace() чтобы определить наилучшее место для хранения ваших файлов.

Эти методы также доступны в ContextCompat в библиотеке поддержки-v4.

6. Lollipop также ввел изменения и вспомогательный класс DocumentFile .

getStorageState Добавлено в API 19, устаревшее в API 21, использует getExternalStorageState(File)

Вот отличный учебник для взаимодействия с платформой доступа к хранилищу в KitKat.

Взаимодействие с новыми API в Lollipop очень похоже (объяснение Джеффа Шарки) .

7. Android 7.0 предоставляет упрощенный API для доступа к внешним хранилищам.

Доступ к ограниченному каталогу В Android 7.0 приложения могут использовать новые API для запроса доступа к определенным внешним каталогам хранилища , включая каталоги на съемных носителях, таких как SD-карты …

Дополнительные сведения см. В разделе Обучение с ограниченным доступом к каталогам .

8. Изменения Android O.

Начиная с Android O , платформа доступа к хранилищу позволяет заказчикам документов создавать дескрипторы файлов для поиска файлов, находящихся в удаленном источнике данных …

Разрешения перед Android O , если приложение запрашивало разрешение во время выполнения и разрешение было предоставлено, система также неправильно предоставила приложению остальные разрешения, принадлежащие той же группе разрешений и которые были зарегистрированы в манифесте.

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

Например, READ_EXTERNAL_STORAGE и WRITE_EXTERNAL_STORAGE …

9. Связанные вопросы и рекомендуемые ответы.

Как я могу получить внешний путь SD-карты для Android 4.0+?

Mkdir () работает во внутренней памяти флеш-памяти, но не SD-карта?

Разница между getExternalFilesDir и getExternalStorageDirectory ()

Почему getExternalFilesDirs () не работает на некоторых устройствах?

Как использовать новый API доступа к SD-карте, представленный для Android 5.0 (Lollipop)

Запись на внешнюю SD-карту в Android 5.0 и выше

Разрешение записи на SD-карту Android SD с использованием SAF (Storage Access Framework)

SAFFAQ: Часто задаваемые вопросы о доступе к хранилищу

10. Связанные ошибки и проблемы.

Ошибка: на Android 6 при использовании getExternalFilesDirs он не позволит вам создавать новые файлы в своих результатах

Запись в каталог, возвращенный getExternalCacheDir () на Lollipop, не выполняется без разрешения на запись

Я считаю, что для этого есть два способа:

МЕТОД 1: ( НЕ работает на 6.0 и выше, из-за изменений разрешения)

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

Он вернет все смонтированные носители (включая Real SD Cards) в список местоположений каталога строк. Со списком вы можете попросить пользователя, где сохранить и т. Д.

Вы можете вызвать его следующим образом:

СПОСОБ 2:

Использовать библиотеку поддержки v4

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

Однако места отличаются от использования.

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

Внешние запоминающие устройства, возвращаемые сюда, считаются постоянной частью устройства, включая как эмулированное внешнее хранилище, так и физические слоты для мультимедиа, такие как SD-карты в батарейном отсеке. Возвращенные пути не включают переходные устройства, такие как USB-накопители.

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

Дополнительная информация о ContextCompat

Они похожи на файлы приложений. Скрыт от других приложений.

Еще один ответ. Этот ответ показывает только 5.0+, потому что я считаю, что ответ Doomknight, представленный здесь, – лучший способ сделать для Android 4.4 и ниже.

Это изначально размещено здесь ( есть ли способ получить размер SD-карты в Android? ), Чтобы получить внешний размер SD-карты на Android 5.0+

Чтобы получить внешнюю SD-карту в виде File :

Примечание. Я получаю только «первую» внешнюю SD-карту, но вы можете ее изменить и вернуть ArrayList вместо File и продолжить цикл вместо вызова break после того, как будет найден первый.

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

Первый ресурс – от Android Programming, The Big Nerd Ranch Guide 2nd edition , глава 16, стр. 294.

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

Следующая часть из книги:

Внешнее хранилище

Для вашей фотографии требуется больше места на экране. Полноразмерные изображения слишком велики, чтобы вставлять их в базу данных SQLite, а тем более в Intent . Им понадобится место для работы с файловой системой вашего устройства. Обычно вы помещаете их в свое личное хранилище. Напомним, что вы использовали свое личное хранилище для сохранения базы данных SQLite. С помощью таких методов, как Context.getFileStreamPath(String) и Context.getFilesDir() , вы можете сделать то же самое и с обычными файлами (которые будут жить во Context.getFilesDir() папке, расположенной рядом с подпапкой баз данных, в которой живет ваша база данных SQLite)

Основные методы файлов и каталогов в контексте

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

С другой стороны, если вам нужно другое приложение для записи в эти файлы, вам не повезло: хотя есть флаг Context.MODE_WORLD_READABLE вы можете перейти к openFileOutput(String, int) , он устарел и не полностью надежен В его воздействии на новые устройства. Если вы храните файлы для совместного использования с другими приложениями или получения файлов из других приложений (таких файлов, как сохраненные изображения), вам необходимо сохранить их на внешнем хранилище.

Существует два вида внешнего хранилища: первичное и все остальное. Все устройства Android имеют по крайней мере одно местоположение для внешнего хранилища: основное местоположение, которое расположено в папке, возвращенной Environment.getExternalStorageDirectory() . Это может быть SD-карта, но в настоящее время она чаще всего интегрируется в устройство. Некоторые устройства могут иметь дополнительное внешнее хранилище. Это подпадает под «все остальное».

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

Внешние методы файла и каталога в Контексте

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

Разрешение на внешнее хранение

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

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

В Android 4.4, KitKat они ослабили это ограничение. Поскольку Context.getExternalFilesDir(String) возвращает папку, специфичную для вашего приложения, имеет смысл, что вы захотите читать и записывать файлы, которые там живут. Таким образом, на Android 4.4 (API 19) и выше, вам не нужно это разрешение для этой папки. (Но вы все еще нуждаетесь в этом для других видов внешнего хранилища.)

Добавьте строку в манифест, запрашивающий разрешение на чтение внешнего хранилища, но только до листинга API 16.5. Запрос разрешения на внешнее хранилище ( AndroidManifest.xml )

Атрибут maxSdkVersion делает это так, чтобы ваше приложение запрашивало это разрешение только на версиях Android старше API 19, Android KitKat. Обратите внимание, что вы запрашиваете только внешнее хранилище. Существует также разрешение WRITE_EXTERNAL_STORAGE , но оно вам не нужно. Вы не будете писать ничего на внешнее хранилище: приложение для камеры сделает это за вас

Второй ресурс – это эта ссылка, прочитав все это, но вы также можете перейти к разделу «Внешнее хранилище ».

Справка:

Больше материалов для чтения:

Отказ от ответственности: эта информация была взята из Android Programming: The Big Nerd Ranch Guide с разрешения авторов. Для получения дополнительной информации об этой книге или для покупки копии, пожалуйста, посетите bignerdranch.com.

Вот способ создания нового файла во внешнем хранилище (SDCard, если он присутствует в устройстве или устройстве External Storage, если нет). Просто замените «имя папки» на имя нужной папки назначения и «имя файла» с именем файла, который вы сохраняете. Конечно, здесь вы можете увидеть, как сохранить общий файл, теперь вы можете искать, как сохранить изображения, возможно, здесь или что-то в файле.

Это также контролирует этот файл и добавляет номер в конце имени нового файла для его сохранения.

EDIT: Извините, я забыл, что вам нужно попросить в вашем манифестах (или программно, если вы предпочитаете Marshmallow)

Для версий ниже Marshmallow вы можете напрямую предоставить разрешения в манифесте.

Но для устройств с Marshmallow и выше вам необходимо предоставить разрешения на время выполнения.

Вы можете напрямую получить доступ к внешней SD-карте (установленной). Надеюсь, это поможет.

Всем хорошего дня! На днях на мой HTC ONE Dual Sim вышла свежая кастомная прошивка на Android 4.4.2 Kit Kat и сразу же озадачила большинство пользователей устройства тем, что Google заблокировал приложениям свободную запись на SD — карты.

Далее тривиальный интерес, немного гугления и после нескольких проб и ошибок у меня получилось обойти ограничение.
Отбросив тени сомнения, решил поделиться с сообществом, возможно кому-то это решение пригодится.
Работает этот вариант только под устройствами имеющими root-доступ, т.к. нужно править системные файлы.
Итак, нам нужно отредактировать файл /system/etc/permissions/platform.xml
В нем находим секции android.permission.WRITE_EXTERNAL_STORAGE и android.permission.WRITE_MEDIA_STORAGE
Их то нам и надо отредактировать. В моем устройстве данные секции должны выглядеть так:

После сохранения файла и перезапуска устройства мой любимый файл — менеджер получил права на запись на SD-карточку.
На данный фикс меня натолкнула статья на androidpolice.
Думаю, что продвинутые Android — разработчики знают это решение, но решил все-таки поделиться.
Да и навряд ли производители смартфонов оставят это ограничение, если захотят использовать внешний SD слот.

Ссылка на основную публикацию
Как поставить старую версию скайпа
Программа Skype, как и любой другой активно развивающийся софт, постоянно обновляется. Однако не всегда новые версии выглядят и работают лучше...
Как повернуть диаграмму на 90 градусов
Научимся вращать (поворачивать) график функции относительно начала координат. Для примера используем график функции y=x*sin(10*x). Координаты (x'; y') в результате поворота...
Как повернуть купольную камеру видеонаблюдения
Страница 12 5 Регулировка положения видеокамеры Положение купольной видеокамеры можно регулировать по двум осям. Следя за изображением на мониторе, отрегулируйте...
Как поставить фотографию на контакт в андроид
На любом смартфоне реализована возможность установки изображения на телефонный контакт. Оно будет отображаться при поступлении входящих звонков от этого контакта...
Adblock detector