Некоторые устройства Android рассматривают внутреннее хранилище как SD-карты и внешнее хранилище как EXTSD
У меня есть группа устройств Android от разных поставщиков.
Некоторые из них прикрепляют /mnt/sdcard к внутреннему хранилищу и /mnt/extsd к внешнее хранилище (сценарий 1) и другие прикрепляют /mnt/sdcard к внешнему хранилищу (сценарий 2)
Я думаю, что второй сценарий является стандартным, так как Android API предоставляет дескриптор этого пути. Теперь проблема в том, что в сценарии 1 /mnt/extsd
становится readonly
даже с разрешением WRITE_EXTERNAL_STORAGE
!
Это означает, что я могу читать данные только с реальной внешней SD-карты и не иметь возможности писать на нее.
Есть ли обходной путь для этого, поэтому я могу писать в папку extsd?
Ответы
Ответ 1
Единственная работа, которую я нашел до сих пор, чтобы получить доступ на запись на устройстве, - это укоренение устройства:(
Samsung обеспечивает работу с манифестной записью
Более подробная информация доступна в следующих ссылках
http://www.xda-developers.com/android/android-3-2-code-inadvertently-preventing-write-access-to-external-storage/
и
http://www.chainfire.eu/articles/113/Is_Google_blocking_apps_writing_to_SD_cards_/
Выдержки:
Казалось бы, у Google есть ошибка в коде AOSP, который был представленный на Android 3.2, который влияет на то, как ОС управляет USB Хранение и может препятствовать доступу на запись к SD-картам и USB-накопителям. XDA Elite Recognized Developer, старший модератор и редактор новостей Chainfire подводит итог этой проблеме в своем блоге:
"В прошлом приложение запрашивало" WRITE_EXTERNAL_STORAGE "разрешение, которое предоставило бы доступ на запись во все внешние хранилища (пользователь/группа" sdcard_rw "). По-видимому, это было изменено только на предоставить доступ на запись к основному внешнему хранилищу. Второй было введено разрешение" WRITE_MEDIA_STORAGE ", которое предоставит доступ к другим внешним хранилищам (пользователь/группа" Media_rw ").
Проблема в том, что третьей стороне на самом деле не будет предоставлено это разрешение, только системные приложения и приложения, предоставляемые устройством изготовителю обычно предоставляется такое разрешение. Есть исключения, по-видимому, на некоторых устройствах сторонние приложения будут предоставил это разрешение, но, согласно источникам AOSP, theyre конечно, не предполагается".
Ответ 2
Environment.getExternalStorageState() returns path to internal SD mount point like "/mnt/sdcard"
Environment.getExternalStorageDirectory()
относится к тому, что производитель устройства считается "внешним хранилищем". На некоторых устройствах это съемный носитель, например SD-карта. На некоторых устройствах это часть вспышки на устройстве. Здесь "внешнее хранилище" означает "материал, доступный через режим USB Mass Storage при установке на хост-машине", по крайней мере для Android 2.x и выше.
But the question is about external SD. How to get a path like "/mnt/sdcard/external_sd" (it may differ from device to device)?
Android не имеет понятия "внешний SD", кроме внешнего хранилища, как описано выше.
Если производитель устройства выбрал внешнюю память на борту, а также имеет SD-карту, вам необходимо связаться с этим производителем, чтобы определить, можете ли вы использовать SD-карту (не гарантируется), и что правила для его использования, например, какой путь использовать для него.
Ответ 3
На корневом устройстве вы можете изменить /system/etc/permissions/platform.xml, чтобы "исправить" проблему с разрешениями. Для меня работали следующие:
- adb pull/system/etc/permissions/platform.xml
-
Измените файл platform.xml таким образом, чтобы media_rw был включен в разрешение WRITE_EXTERNAL_STORAGE следующим образом:
<permission name="android.permission.WRITE_EXTERNAL_STORAGE" >
<group gid="sdcard_rw" />
<group gid="media_rw" />
</permission>
-
adb push platform.xml/system/etc/permissions/platform.xml
- Перезагрузите устройство