Как приватно хранить большой объем данных в Android?

Вопрос в том, как хранить большой объем данных (несколько сотен мегабайт и более) и при этом сделать его доступным только для моего приложения?

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

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


person Ilya Blokh    schedule 27.08.2014    source источник


Ответы (3)


Внутреннее хранилище, как я выяснил, ограничено и его размер зависит от модели устройства.

Только на Android 1.x/2.x. На подавляющем большинстве устройств Android 3.0+ внутреннее и внешнее хранилище находятся в одном разделе и, следовательно, имеют одинаковый объем пространства.

Могу ли я хранить 500 МБ и более во внутренней памяти?

На Android 3.0+, наверное. У пользователя может не быть свободных 500 МБ, но это не ограничение внутреннего хранилища, а просто ограничение «хранилища» в целом.

Есть ли способ сделать данные, которые хранятся во внешнем хранилище, приватными, как если бы они хранились во внутреннем?

Не совсем. Например, вы не можете запретить пользователю или другим приложениям удалять эти файлы. Вы можете использовать библиотеку Facebook Conceal для шифрования файлов во внешнем хранилище с помощью сгенерированного ключа шифрования, хранящегося во внутреннем хранилище, чтобы пользователи или другие приложения не могли изменить содержимое файлов (кроме простого их повреждения). Однако, опять же, это будет актуально только в том случае, если вы все еще поддерживаете Android 1.x/2.x; на Android 3.0+ используйте только внутреннюю память.

person CommonsWare    schedule 27.08.2014

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

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

какой вариант выбрать, зависит от продукта.

person Budius    schedule 27.08.2014

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

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

person theDarkPriest    schedule 27.08.2014