Лекция__ . Интерфейс приложений: работа со звуком, использование камеры




 

План лекции:

1. Работа со звуком

2. Использование встроенной камеры

 

1. Мультимедиа

 

Еще одна особенность смартфонов состоит в том, что для большинства их владельцев не последнюю роль играет возможность использования этого "умного телефона" в качестве аудио или видеоплеера, поэтому современные устройства становятся все более и более мультимедийными. В первой лекции обсуждалось, что в состав платформы Android входит набор библиотек для обработки мультимедиа Media Framework, в котором реализована поддержка большинства общих медиа-форматов. В связи с чем, в приложения, разрабатываемые для смартфонов под управлением Android, можно интегрировать запись и воспроизведение аудио и видео, а также работу с изображениями. Важной и часто используемой особенностью смартфонов является наличие камеры, которая позволяет снимать все самое интересное: от первых шагов ребенка до падения метеорита. Телефон всегда под рукой и готов к работе, в связи с этим количество фотографий и небольших видеороликов резко увеличилось, и любое интересное событие в жизни индивидуума может быть запечатлено и сохранено для потомков. С ростом возможностей получения фото и видео материалов увеличивается потребность в приложениях, способных работать с этими материалами. Платформа Android позволяет разрабатывать такие приложения, которые предоставляют пользователям возможности делать фотоснимки или записывать видео, какимто образом обрабатывать полученные материалы и использовать их далее.

Большинство смартфонов оснащены GPS-модулем, а некоторые даже комбинированным модулем GPS/ГЛОНАСС, что позволяет использовать такое устройство в качестве инструмента для ориентирования на местности. Во многих случаях смартфон с установленным соответствующим программным обеспечением вполне может заменить GPS навигатор. В разрабатываемых приложениях иногда бывает очень полезно добавить возможность получения координат устройства и хозяина, если оба находятся в одном месте, и использовать эти координаты для каких-либо целей. Например, уже существуют приложения, которые позволяют отслеживать параметры человека (спортсмена) во время преодоления некоторых расстояний бегом, на велосипеде, на лыжах и т. д. Такое приложение работает во время тренировки (устройство должно перемещаться вместе со спортсменом), по окончанию можно получить полную статистику маршрута: точное время в пути, расстояние, подъемы/спуски, среднюю скорость, потраченные калории и т. д. Заметим, что большая часть информации опирается на данные, полученные со спутников GPS.

Рассмотрение особенностей смартфонов будет неполным, если оставить без внимания датчики и сенсоры, которыми оснащены большинство устройств. Эти микроустройства обеспечивают связь смартфона с окружающей средой и добавляют новые удивительные функции. С помощью датчика приближения, например, можно отключать подсветку экрана при приближении телефона к уху пользователя во время разговора, блокировать экран, чтобы не было возможности случайно нажать на отбой. Акселерометр может использоваться для смены ориентации экрана, для управления в играх, особенно симуляторах, а также в качестве шагомера. Датчик освещенности позволяет регулировать яркость экрана. Гироскоп может применяться для определения более точного позиционирования устройства в пространстве. Все рассмотренные особенности в совокупности увеличивают привлекательность смартфонов, позволяют разработчикам создавать приложения с разнообразными, полезными, интересными и иногда неожиданными функциями. Далее в лекции рассмотрим перечисленные возможности смартфонов более подробно и узнаем как можно их использовать при разработке приложений.

Мультимедиа библиотека Android включает поддержку воспроизведения множества наиболее распространенных форматов, что позволяет легко использовать в приложениях аудио, видео и изображения. Можно проигрывать аудио или видео из медиа файлов сохраненных как ресурсы приложения (raw ресурсы), из файлов, расположенных в файловой системе или из потока данных, получаемого через сетевое соединение, для всего этого используется MediaPlayer API. Замечание: проигрывать аудиофайлы можно только на стандартном устройстве вывода, невозможно воспроизводить аудио во время звонка.

Как разработчик приложения, вы можете использовать любой медиа-кодек, доступный на любом устройстве под управлением Android, включая те, которые предоставляются платформой Android, и те, которые зависят от устройства. Однако рекомендуется использовать профили кодирования медиа, которые не зависят от устройства.

 

В таблицах ниже описана поддержка медиаформатов, встроенных в платформу Android. Кодеки, которые гарантированно не будут доступны на всех версиях платформы Android, указаны в скобках, например: (Android 3.0+). Обратите внимание, что любое данное мобильное устройство может поддерживать другие форматы или типы файлов, которые не перечислены в таблице.

Аудио форматы и кодеки

Формат / Кодек кодировщик дешифратор подробности Поддерживаемые типы файлов / форматы контейнеров
AAC LC Поддержка моно / стерео / 5.0 / 5.1 контента со стандартной частотой дискретизации от 8 до 48 кГц. • 3GPP (.3gp) • MPEG-4 (.mp4,.m4a) • ADTS raw AAC (.aac, декодирование в Android 3.1+, кодирование в Android 4.0+, ADIF не поддерживается) • MPEG-TS (.ts, не доступный для Android 3.0+)
HE-AACv1 (AAC +) • (Android 4.1+)
HE-AACv2 (улучшенный AAC +)   Поддержка стерео / 5.0 / 5.1 контента со стандартной частотой дискретизации от 8 до 48 кГц.
AAC ELD (улучшенная AAC с низкой задержкой) • (Android 4.1+) • (Android 4.1+) Поддержка моно / стерео контента со стандартной частотой дискретизации от 16 до 48 кГц
AMR-NB 4,75 до 12,2 кбит / с с частотой дискретизации 8 кГц 3GPP (.3gp)
AMR-WB 9 скоростей от 6,60 кбит / с до 23,85 кбит / с с частотой дискретизации 16 кГц 3GPP (.3gp)
FLAC • (Android 4.1+) • (Android 3.1+) Моно / Стерео (без многоканальности). Частота дискретизации до 48 кГц (но рекомендуется использовать до 44,1 кГц на устройствах с выходом 44,1 кГц, поскольку понижающий дискретизатор от 48 до 44,1 кГц не включает фильтр нижних частот). Рекомендуется 16 бит; для 24-битного режима не применяется дизеринг. Только FLAC (.flac)
GSM   Android поддерживает декодирование GSM на телефонных устройствах GSM (.gsm)
MIDI   MIDI типа 0 и 1. DLS версии 1 и 2. XMF и мобильный XMF. Поддержка форматов рингтонов RTTTL / RTX, OTA и iMelody • Введите 0 и 1 (.mid,.xmf,.mxmf) • RTTTL / RTX (.rtttl,.rtx) • OTA (.ota) • iMelody (.imy)
MP3   Постоянная моно / стерео 8-320 Кбит / с (CBR) или переменная скорость передачи данных (VBR) MP3 (.mp3)
опус   • (Android 5.0+)   Матроска (.мкв)
PCM / WAVE • (Android 4.1+) 8- и 16-битный линейный PCM (скорость до предела аппаратного обеспечения). Частота дискретизации для необработанных записей PCM на 8000, 16000 и 44100 Гц. ВОЛНА (.WAV)
Vorbis     • Ogg (.ogg) • Matroska (.mkv, Android 4.0+)

 

Видео форматы и кодеки

Формат / Кодек кодировщик дешифратор подробности Поддерживаемые типы файлов / форматы контейнеров
H.263 Поддержка H.263 не является обязательной в Android 7.0+ • 3GPP (.3gp) • MPEG-4 (.mp4)
Базовый профиль AVC H.264 (BP) • (Android 3.0+)   • 3GPP (.3gp) • MPEG-4 (.mp4) • MPEG-TS (.ts, только аудио AAC, без поиска, Android 3.0+)
Основной профиль AVC H.264 (MP) • (Android 6.0+) Требуется декодер, рекомендуется кодировщик.  
H.265 HEVC   • (Android 5.0+) Основной профиль уровня 3 для мобильных устройств и Основной профиль уровня 4.1 для Android TV • MPEG-4 (.mp4)
MPEG-4 SP     3GPP (.3gp)
VP8 • (Android 4.3+) • (Android 2.3.3+) Streamable только в Android 4.0 и выше • WebM (.webm) • Matroska (.mkv, Android 4.0+)
VP9   • (Android 4.4+)   • WebM (.webm) • Matroska (.mkv, Android 4.0+)

 

Рекомендации по кодированию видео

 

В приведенной ниже таблице перечислены профили и параметры кодирования видео для мультимедийной платформы Android, рекомендуемые для воспроизведения с использованием кодека H.264 Baseline Profile. Те же рекомендации применимы к кодеку Main Profile, который доступен только в Android 6.0 и более поздних версиях.

 

  SD (низкое качество) SD (Высокое качество) HD 720p (н / д на всех устройствах)
Разрешение видео 176 х 144 пикс. 480 х 360 пикселей 1280 х 720 пикселей
Частота кадров видео 12 кадров в секунду 30 кадров в секунду 30 кадров в секунду
Видео битрейт 56 кбит / с 500 кбит / с 2 Мбит / с
Аудио кодек AAC-LC AAC-LC AAC-LC
Аудио каналы 1 (моно) 2 (стерео) 2 (стерео)
Аудио битрейт 24 кбит / с 128 кбит / с 192 кбит / с

 

Рекомендации по декодированию видео

 

Реализации устройств должны поддерживать динамическое разрешение видео и переключение частоты кадров через стандартные API-интерфейсы Android в одном потоке для всех кодеков VP8, VP9, ​​H.264 и H.265 в режиме реального времени и до максимального разрешения, поддерживаемого каждым кодеком на устройство.

 

Реализации, которые поддерживают декодер Dolby Vision, должны следовать этим рекомендациям:

· Обеспечьте экстрактор с поддержкой Dolby Vision.

· Правильно отображать содержимое Dolby Vision на экране устройства или на стандартном видеовыходе (например, HDMI).

· Установите индекс дорожки обратно совместимого базового (ых) слоя (ов) (если имеется) таким же, как индекс дорожки объединенного слоя Dolby Vision.

 

Для воспроизведения аудио и видео Android предоставляет класс MediaPlayer. Причем при работе с аудиоконтентом этот класс позволяет воспроизводить необработанные данные, т. е. возможно проигрывание динамически генерируемого аудио.

Диаграмма жизненного цикла экземпляра класса MediaPlayer представлена на рис. 1. Овалы представляют состояния объекта MediaPlayer, дуги показывают вызовы каких методов необходимо выполнить, чтобы сменить состояние объекта MediaPlayer. Дуги с одной стрелкой представляют вызовы синхронных методов, с двумя стрелками - вызовы асинхронных методов.

В ходе жизненного цикла объект MediaPlayer проходит через несколько состояний:

бездействие (Idle) - создан экземпляр класса MediaPlayer для создания может использоваться оператор new или вызов метода reset() (см. рис. 1);

Рис. 1. Жизненный цикл экземпляра класса MediaPlayer

 

· инициализирован (Initialized) - задан источник медиаинформации, для задания источника используется метод setDataSource();

· ошибка (Error) - появилась какая-то ошибка, например, не поддерживаемый аудио/видео формат, слишком высокое разрешение, чтобы вывести объект из этого состояния, необходимо вызвать методreset();

· подготовка (Preparing) - MediaPlayer занимается подготовкой медиаисточника к воспроизведению, подготовка инициируется методом prepareAsync();

· готов (Prepared) - состояние готовности к воспроизведению, может быть достигнуто двумя способами: o синхронный способ: вызов метода prepare(), который переводит объект в готовое состояние; o асинхронный способ: срабатывание метода onPrepared() интерефейса OnPreparedListener() в состоянии подготовки, как реакция на событие готовности;

· запущен (Started) - выполняется воспроизведение медиаконтента, в это состояние объект переходит после вызова метода start();

· приостановлен (Paused) - воспроизведение приостановлено, MediaPlayer переходит в это состояние после вызова метода pause();

· остановлен (Stopped) - воспроизведение остановлено, MediaPlayer переходит в это состояние после вызова метода stop();

· воспроизведение завершено (Playback Completed) - достигнут конец воспроизводимого содержания, в это состояние объект переходит после срабатывания метода onCompleted() интерфейсаслушателя OnCompitionListener, как реакции на конец воспроизводимого материала; Замечание: из состояний Paused, Playback Completed можно вернуться к воспроизведению вызовом метода start(). Из состояния Stopped прежде, чем вернуться в состояние воспроизведения, необходимо пройти через подготовку медиа-содержимого. Вызов метода seekTo() позволяет поменять место воспроизведения.

· конец (End) - конец жизненного цикла MediaPlayer объекта, в это состояние объект переходит после вызова метода release().

 

Для записи аудио и видео Android предоставляет класс MediaRecorder. Диаграмма жизненного цикла экземпляра класса MediaRecorder представлена на рис. 2. Овалы представляют состояния объектаMediaPlayer, дуги показывают вызовы каких методов необходимо выполнить, чтобы сменить состояние объекта MediaPlayer. Дуги с одной стрелкой представляют вызовы синхронных методов, с двумя стрелками - вызовы асинхронных методов.

 

Рис. 2. Жизненный цикл экземпляра класса MediaRecorder

В ходе жизненного цикла объект MediaRecorder проходит через несколько состояний:

· Начальное (Initial) - создан объект класса MediaRecover, для создания может использоваться оператор new или вызов метода reset() (см. рис. 2);

· Инициализирован (Initialized) - объект MediaRecover готов к использованию, в данное состояние объект переходит после вызова одного из методовsetAudioSource() или setVideoSource(), которые задают источники аудио или видео для записи;

· Сконфигурирован приемник данных для записи (Data Source Configured) - задаются основные свойства приемника данных, состояние инициируется методом setOutputFormat(), для настройки свойств должны быть выполнены некоторые методы из списка: setAudioEncoder(), setVideoEncoder(), setOutputFile(),setVideoSize(), setVideoFrameRate(), setPreviewDisplay();

· готов (Prepared) - состояние готовности к записи, инициируется методом prepare();

· записывает (Recording)- идет запись, инициируется вызовом метода start();

· освобожден (Released) - запись завершена, все ресурсы освобождены.

 

2. Использование встроенной камеры

 

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

1. непосредственное обращение к камере;

2. использование намерений (Intent) для вызова существующего приложения.

Рассмотрим основные относящиеся к делу классы:

 

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

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

MediaRecorder - класс, используемый для записи видео с камеры.

Intent - класс, содержащий абстрактное описание выполняемой операции, которое передается системе Android, а ОС сама находит и запускает необходимое приложение и возвращает результат его работы.

Для работы с камерой используются два типа намерений:

· MediaStore.ACTION_IMAGE_CAPTURE - для запроса на выполнение фотоснимков;

· MediaStore.ACTION_VIDEO_CAPTURE - для запроса на запись видео.

 

Запросить функцию камеры

Если важной функцией вашего приложения является фотосъемка, ограничьте ее доступность в Google Play для устройств с камерой. Чтобы объявить, что ваше приложение зависит от наличия камеры, поместите тег в файл манифеста: <uses-feature>

 

<manifest... > < uses-permission android: name = "android.hardware.camera" android: required = "true" />... </ manifest>

 

Если ваше приложение использует, но не требует камеры для функционирования, вместо этого установите android:requiredна false. При этом Google Play позволит устройствам без камеры загружать ваше приложение. Тогда вы обязаны проверить доступность камеры во время выполнения, позвонив по телефону hasSystemFeature (PackageManager.FEATURE_CAMERA_ANY). Если камера недоступна, вам следует отключить ее функции.

 

Сфотографировать с помощью приложения камеры

В Android способ делегирования действий другим приложениям заключается в вызове Intent, описывающем то, что вы хотите сделать. Этот процесс состоит из трех частей: Intent самого, вызова внешнего Activity и некоторого кода для обработки данных изображения, когда фокус возвращается к вашей деятельности.

 

Вот функция, которая вызывает намерение сделать снимок.

 

static final int REQUEST_IMAGE_CAPTURE = 1;

 

private void dispatchTakePictureIntent () {

Намерение takePictureIntent = новый Намерение (MediaStore. ACTION_IMAGE_CAPTURE);

if (takePictureIntent. resolActivity (getPackageManager ())! = null) {

startActivityForResult (takePictureIntent, REQUEST_IMAGE_CAPTURE);

}

}

 

Обратите внимание, что startActivityForResult() метод защищен вызывающим условием resolveActivity(), которое возвращает первый компонент действия, который может обработать намерение. Выполнение этой проверки важно, потому что если вы звоните startActivityForResult() с намерением, которое не может обработать ни одно приложение, ваше приложение будет аварийно завершено. Поэтому, пока результат не равен нулю, безопасно использовать намерение.

 

Получить фото

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

 

Приложение Android Camera кодирует фотографию в виде возврата, Intent полученную onActivityResult() как небольшую Bitmap в дополнительных функциях, под ключом "data". Следующий код извлекает это изображение и отображает его в виде ImageView.

 

@Override

protected void onActivityResult (int requestCode, int resultCode, данные намерения) {

if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) {

Bundle extras = data.getExtras ();

Bitmap imageBitmap = (Bitmap) extras.get ("данные");

imageView.setImageBitmap (imageBitmap);

}

}

Примечание. Это уменьшенное изображение "data" может быть хорошим для иконки. Работа с полноразмерным изображением требует немного больше работы.

 

Сохранить полноразмерное фото

Приложение Android Camera сохраняет полноразмерную фотографию, если вы даете ей файл для сохранения. Вы должны указать полное имя файла, в котором приложение камеры должно сохранить фотографию.

 

Как правило, любые фотографии, сделанные пользователем с помощью камеры устройства, следует сохранять на устройстве в общем внешнем хранилище, чтобы они были доступны для всех приложений. Правильный каталог для общих фотографий предоставляется getExternalStoragePublicDirectory() с DIRECTORY_PICTURES аргументом. Поскольку каталог обеспечивается с помощью этого метода является общим для всех приложений, чтение и запись на него требует READ_EXTERNAL_STORAGE и WRITE_EXTERNAL_STORAGE разрешения, соответственно. Разрешение на запись неявно разрешает чтение, поэтому, если вам нужно выполнить запись во внешнее хранилище, вам нужно запросить только одно разрешение:

 

<manifest...>

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

...

</manifest>

Однако, если вы хотите, чтобы фотографии оставались конфиденциальными только для вашего приложения, вы можете вместо этого использовать каталог, предоставленный getExternalFilesDir(). На Android 4.3 и ниже, для записи в этот каталог также требуется WRITE_EXTERNAL_STORAGEразрешение. Начиная с Android 4.4, разрешение больше не требуется, поскольку каталог недоступен для других приложений, поэтому вы можете объявить, что разрешение следует запрашивать только в более низких версиях Android, добавив maxSdkVersion атрибут:

 

<manifest... >

< uses-permission android: name = "android.permission.WRITE_EXTERNAL_STORAGE"

android: maxSdkVersion = "18" />...

</ manifest>

 

Примечание. Файлы, которые вы сохраняете в каталогах, предоставленных getExternalFilesDir() или getFilesDir() удаляются при удалении пользователем вашего приложения.

 

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

 

String currentPhotoPath;

 

private File createImageFile() throws IOException {

// Create an image file name

String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());

String imageFileName = "JPEG_" + timeStamp + "_";

File storageDir = getExternalFilesDir(Environment.DIRECTORY_PICTURES);

File image = File.createTempFile(

imageFileName, /* prefix */

".jpg", /* suffix */

storageDir /* directory */

);

 

// Save a file: path for use with ACTION_VIEW intents

currentPhotoPath = image.getAbsolutePath();

return image;

}

 

С этим методом, доступным для создания файла для фотографии, теперь вы можете создавать и вызывать Intent так:

 

static final int REQUEST_TAKE_PHOTO = 1;

 

private void dispatchTakePictureIntent() {

Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

// Ensure that there's a camera activity to handle the intent

if (takePictureIntent.resolveActivity(getPackageManager())!= null) {

// Create the File where the photo should go

File photoFile = null;

try {

photoFile = createImageFile();

} catch (IOException ex) {

// Error occurred while creating the File

...

}

// Continue only if the File was successfully created

if (photoFile!= null) {

Uri photoURI = FileProvider.getUriForFile(this,

"com.example.android.fileprovider",

photoFile);

takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI);

startActivityForResult(takePictureIntent, REQUEST_TAKE_PHOTO);

}

}

}

Примечание: мы используем, getUriForFile(Context, String, File)который возвращает content:// URI. Для более новых приложений, ориентированных на Android 7.0 (уровень API 24) и выше, передача file://URI через границу пакета вызывает a FileUriExposedException. Поэтому теперь мы представляем более общий способ хранения изображений с помощью FileProvider.

 

Теперь вам нужно настроить FileProvider. В манифесте вашего приложения добавьте провайдера в ваше приложение:

<application>

...

<provider

android:name="android.support.v4.content.FileProvider"

android:authorities="com.example.android.fileprovider"

android:exported="false"

android:grantUriPermissions="true">

<meta-data

android:name="android.support.FILE_PROVIDER_PATHS"

android:resource="@xml/file_paths"></meta-data>

</provider>

...

</application>

 

Убедитесь, что строка полномочий соответствует второму аргументу getUriForFile(Context, String, File). В разделе метаданных определения поставщика вы можете видеть, что поставщик ожидает, что допустимые пути будут настроены в выделенном файле ресурсов, Рез / XML / file_paths.xml, Вот содержимое, необходимое для этого конкретного примера:

<?xml version="1.0" encoding="utf-8"?>

<paths xmlns:android="https://schemas.android.com/apk/res/android">

<external-files-pathname="my_images" path="Android/data/com.example.package.name/files/Pictures" />

</paths>

Компонент пути соответствует пути, который возвращается getExternalFilesDir() при вызове с Environment.DIRECTORY_PICTURES. Убедитесь, что вы заменили com.example.package.name фактическое имя пакета вашего приложения. Также ознакомьтесь с документацией FileProvider для подробного описания спецификаторов пути, которые вы можете использовать помимо external-path.


 

Добавить фото в галерею

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

 

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

 

В следующем примере метода показано, как вызвать системный мультимедийный сканер, чтобы добавить фотографию в базу данных поставщика мультимедиа, сделав ее доступной в приложении «Галерея Android» и других приложениях.

 

private void galleryAddPic() {

Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);

File f = new File(currentPhotoPath);

Uri contentUri = Uri.fromFile(f);

mediaScanIntent.setData(contentUri);

this.sendBroadcast(mediaScanIntent);

}

 

Декодировать масштабированное изображение

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

 

private void setPic () {

// Получить размеры представления

int targetW = imageView. getWidth ();

int targetH = imageView. getHeight ();

 

// Получить размеры растрового изображения

BitmapFactory. Опции bmOptions = new BitmapFactory. Варианты ();

bmOptions. inJustDecodeBounds = true;

 

int photoW = bmOptions. outWidth;

int photoH = bmOptions. outHeight;

 

// Определяем, насколько уменьшить изображение

int scaleFactor = Math. мин (фотоW / цельW, фотоH / цельH);

 

// Декодируем файл изображения в растровое изображение, чтобы заполнить вид

bmOptions. inJustDecodeBounds = false;

bmOptions. inSampleSize = scaleFactor;

bmOptions. inPurgeable = true;

 

Bitmap bitmap = BitmapFactory. decodeFile (currentPhotoPath, bmOptions);

imageView. setImageBitmap (bitmap);

}



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2022-09-06 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: