Программный доступ к внутреннему хранилищу (не SD-карта) на Verizon HTC Droid Incredible (Android)
Я пытаюсь найти информацию о том, как программно получить доступ к HTC Droid Incredible's
предположительно 8GB
Internal Storage Memory
.
Чтобы определить External Storage (SD Card) Location
, я использую команду:
android.os.Environment.getExternalStorageDirectory().
Я не смог найти никаких следствий для Internal phone Storage
.
При изучении HTC/Google Nexus One, Motorola Droid и телефонов HTC Dream/G1, там (как и следовало ожидать) не кажутся Mount Point
для такого Arbitrary Internal Storage
.
На этих телефонах Internal Storage
разделен между разделами /data
, /system
и /cache
.
Невероятный Internal Storage
, безусловно, не будет находиться в /system
. /cache
также маловероятен, если он глобально не читается/не исполняется.
Я бы прочитал в обзорах, что телефон по-прежнему будет ограничен 512MB
или так для приложений, предполагая, что это не просто подкаталог /data
.
У меня нет доступа к блоку Droid Incredible
, конечно.
Ответы
Ответ 1
Здесь есть дополнительная информация: Droid Невероятные точки подключения к хранилищу. Кажется, что Droid Incredible монтирует внутреннее хранилище в /emmc, предположительно смонтированное r/w. Пока еще не проверено, требуется ли разрешение WRITE_EXTERNAL_STORAGE
для получения доступа к r/w - я пытаюсь получить эту информацию из Код Google
Я, вероятно, разрешу это, предоставив пользователю два параметра для хранения данных:
- SD-карты
- Droid Incredible-only Внутреннее хранилище
Изменить: кажется, что разрешения WRITE_EXTERNAL_STORAGE
достаточно: согласно droidForums both/sdcard и /emmc имеет тот же GID, что и 1015.
Edit2: В соответствии с Group Group Thread Incredible возвращает /sdcard в качестве значения результата Environment.getExternalStorageDirectory()
. Поэтому пользователь должен решить, хочет ли он использовать /sdcard или/emmc. Автоматическое обнаружение Incredible может основываться на существовании пути/emmc.
Ответ 2
Как вам известно, доступ к внутреннему хранилищу обычно ограничен определенными каталогами для каждого приложения с помощью разрешений. Это означает, что одно приложение считывает данные из другого и не обращается к системным файлам без использования API. Это имеет смысл, поскольку, например, если у вас было приложение для интернет-банкинга, вы не хотели бы, чтобы другие приложения могли получать доступ к любой из своих кэшированных данных.
Каждое приложение получает данные в каталоге под /data/data
. Однако обычно вы не указываете пути явно, но использовали такие методы, как Context.openFileOutput()
, который создает файл в соответствующем подкаталоге вашего приложения напрямую.
Я согласен с вами в том, что вряд ли большинство 8GB Невероятного хранилища будут использоваться для раздела /data
.
Итак, если у них будет отдельный раздел, позволяющий легко хранить музыку и фотографии на внутренней памяти телефона, тогда они должны будут делать это так, чтобы они совместимы с существующими приложениями. Это означает использование Environment.getExternalStorageDirectory()
, но поскольку Incredible также поддерживает SD-карты, вы правы в том, что неясно, как это может работать.
В группе разработчиков Android Google есть поток, в котором обсуждается этот точный вопрос. Пока нет ответа (на момент написания) о том, как работает Incredible там сообщение, в котором говорится, что Samsung Galaxy решает ту же проблему следующим образом:
- Внутреннее хранилище установлено на
/sdcard
- Если доступна SD-карта, ее можно найти в
/sdcard/sd
Это кажется разумным решением, поскольку оно будет совместимо с существующими приложениями, включая те, которые ошибочно жестко закодированы /sdcard
вместо использования Environment.getExternalStorageDirectory()
.
Поэтому я бы посоветовал использовать Environment.getExternalStorageDirectory()
, когда вы ищете большие области для хранения - либо SD-карту, либо внутреннюю для телефона, и надейтесь, что каждый телефон вернет что-то разумное.
Ответ 3
Просто используйте это:
String primary_sd = System.getenv("EXTERNAL_STORAGE");
if(primary_sd != null)
Log.i("EXTERNAL_STORAGE", primary_sd);
String secondary_sd = System.getenv("SECONDARY_STORAGE");
if(secondary_sd != null)
Log.i("SECONDARY_STORAGE", secondary_sd)