name="AppTheme"
parent="
Theme.AppCompat.Light.DarkActionBar
">
name="colorPrimary">@color/colorPrimary
name="colorPrimaryDark">@color/colorPrimaryDark
name="colorAccent">@color/colorAccent
photoButton
=
view.findViewById(R.id.crime_camera)
as
ImageButton
photoView
=
view.findViewById(R.id.crime_photo)
as
ImageView
return view
}
...
}
На этом ненадолго оставим пользовательский интерфейс
(через несколько страниц будет дано объяснение, как эти
кнопки подключить к логике приложения).
Хранилище файлов
Одного лишь места на экране вашим фотографиям
недостаточно. Полноразмерная фотография слишком велика
для хранения в базе данных SQLite, не говоря уже об интенте.
Ей необходимо место для хранения в файловой системе
устройства.
Обычно такие данные размещаются в закрытом
(приватном) хранилище. Вспомните, что именно в закрытой
области хранится наша база данных SQLite. Такие функции, как
Context.getFileStreamPath(String)
и
Context.getFilesDir()
, позволяют хранить в этой же
области и обычные файлы (в папке по соседству с папкой
databases
, в которой размещается база данных SQLite).
Основные функции для работы с внешними файлами и
каталогами в классе
Context
:
getFilesDir():File
возвращает дескриптор каталога для приватных файлов
приложения.
openFileInput(name:String):FileInputStream
открывает существующий файл для ввода (относительно
каталога файлов).
openFileOutput(name:String,mode:Int):FileOutputS
tream
открывает существующий файл для вывода, возможно,
создает его (относительно каталога файлов).
getDir(name:String,mode:Int):File
получает (и, возможно, создает) подкаталог в каталоге
файлов.
fileList(...):Array
получает список имен файлов в главном каталоге файлов
(например, для использования с
openFileInput(String)
).
getCacheDir():File
возвращает дескриптор каталога, используемого для
хранения кэш-файлов. Будьте внимательны, поддерживайте
порядок в этом каталоге и старайтесь использовать как
можно меньше пространства.
Тут есть подвох. Поскольку эти файлы объявлены
приватными, взаимодействовать с ними может только ваше
собственное приложение. Если доступ к этим файлам не
понадобится другому приложению, можно обойтись и этими
функциями.
Но их окажется недостаточно, если какому-то другому
приложению потребуется выполнить запись в ваши файлы. Это
как раз случай CriminalIntent, потому что приложению камеры
нужно будет сохранить файл снимка в вашем приложении.
С другой стороны, если запись в файлы должна
осуществляться другим приложением, вам не повезло: хотя
существует флаг
Context.MODE_WORLD_READABLE
, который
можно передать при вызове
openFileOutput(String,int)
,
он официально считается устаревшим, а на новых устройствах
его надежность не гарантирована. Когда-то существовала
возможность передачи файлов в общедоступное внешнее
хранилище, но в последних версиях она была заблокирована по
соображениям безопасности.
Если вы сохраняете файлы, которые должны использоваться
другими приложениями, или получаете файлы от других
приложений (как, например, сохраненные фотографии), к
файлам
необходимо
организовать
доступ
через
ContentProvider
.
ContentProvider
позволяет открыть
доступ к URI контента другим приложениям. Тогда эти
приложения смогут загружать или записывать данные по этим
URI. В любом случае ситуация находится под вашим контролем,
и вы всегда можете запретить чтение или запись по своему
желанию.
Do'stlaringiz bilan baham: |