Освой Android играючи
/* Моя кошка замечательно разбирается в программировании. Стоит мне объяснить проблему ей - и все становится ясно. */
John Robbins, Debugging Applications, Microsoft Press, 2000
URI - это специальный идентификатор, по которому можно определить абстрактный или физический ресурс. Самый понятный пример с URI - это обычная веб-страница. Возьмём к примеру страницу https://developer.alexanderklimov.ru/android/catshop/catshop.php. Данный адрес можно разбить на несколько частей:
У протокола https есть и другие параметры, которые рассматривать не будем. Существует также протокол ftp, имеющий свои параметры. Ниже вы увидите другие примеры. Главное здесь - возможность определить нахождение ресурса по представленным данным.
Допустим, мы хотим загрузить видеоматериал в компонент VideoView. Само видео может находиться в ресурсах программы или на SD-карте. С помощью URI мы можем подсказать программе, откуда следует загрузить файл.
Например, если видеофайл playcat.3gp находится в папке /res/raw, то получить адрес для загрузки можно следующим образом:
val catUri = Uri.parse("android.resource://$packageName/raw/playcat")
Если файл хранится на внешней карточке, то код будет следующим (опустим правильное определение имени карточки):
val catUri = Uri.parse("file:///sdcard/playcat.3gp") // файл в корне карточки
У компонента VideoView есть метод setVideoURI(URI uri), в котором нужно указать объект класса URI:
val catUri = Uri.parse("android.resource://$packageName/raw/playcat")
// или получим URI файла на карточке
catURI = Uri.parse("file:///sdcard/playcat.3gp")
val videoView: VideoView = findViewById(R.id.videoView)
//...ваш код
videoView.setURI(catUri)
Аналогично и для картинок. Выводим картинку в ImageView. Сама картинка находится в папке ресурсов drawable. Также мы можем открыть картинку как файл и получить доступ к её байтам.
val imageView: ImageView = findViewById(R.id.imageView)
val catUri = Uri.parse("android.resource://$packageName/drawable/cat")
val catBytes = contentResolver.openInputStream(catUri)?.use{
it.readBytes()
}
imageView.setImageURI(catUri)
println("Cat size: ${catBytes?.size}")
Посмотрим на другие примеры:
val uri = Uri.parse("geo:54.354183,37.34011")
Метод uri.getScheme() вернёт geo, а метод uri.getSchemeSpecificPart() - 54.354183,37.34011. В Kotlin используйте свойства scheme и schemeSpecificPart.
val uri = Uri.parse("tel:1234578")
В данном случае метод uri.getScheme() вернёт tel, а uri.getSchemeSpecificPart() - 1234578.
URI также используется при работе с контент-провайдерами, в частности, с контактами. Пример на Java.
Uri uri = Uri.parse("content://contacts/people/1");