Что такое android permission camera

Введение

Большинство телефонов на Android сейчас уже имеют по крайней мере одну камеру. Это позволяет разработчиками добавлять в приложения возможность создания фотографий. Самый простой способ работы с камерой заключается в использовании приложения, которое уже есть в составе операционной системы Android. Кроме того в составе Android Framework есть набор API для непосредственной работы с камерой. Это предоставляет разработчику большую гибкость в использовании камеры, но требует написания большего количества кода.

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

Camera Permission

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

Если работа с камерой — это обязательная часть вашего приложения, необходимо установить свойство android:required равным true. В этом случае приложение будет отображаться в Google Play только для тех телефонов, которые имеет камеру.

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

Делаем фотографию с помощью intent

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

Ниже вы видите пример кода:

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

Получение миниатюры

Для обработки результата работы приложения камеры, в Activity вашего приложения нужно переопределить метод onActivityResult(). Ему будет передаваться intent, к которому прикреплен Bundle объект, который в свою очередь содержит ссылку на bitmap объект. Ссылку можно получить с помощью метода get() и ключа «data». Ниже вы видите пример кода.

Миниатюра изображения, получаемая таким способом, подходит только для иконки. Для получения полноразмерного изображения требуется немного больше кода.

Получение полноразмерной фотографии

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

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

Разрешение на запись одновременно позволяет производить и чтение.

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

Читайте также:  Как посмотреть пароль от wifi android xiaomi

Обратите внимание, при удалении вашего приложения, директория, возвращаемая методом getExternalFilesDir(), будет тоже удалена.

Когда вы определите директорию для фотографии, вам нужно создать файл с уникальным именем и, возможно, сохранить путь к нему. Ниже приведен пример метода, который выполняет эту процедуру, используя текущую дату и время.

Этот метод создает файл для фотографии и запускает приложение камеры с помощью интента.

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

Созданную фотографию можно сделать общедоступной с помощью системного Media Provider.

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

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

Масштабирование фотографии

Работа с несколькими полноразмерными изображениями может быть сложной задачей в условиях ограниченной памяти. Но вы можете значительно уменьшить количество используемой памяти, преобразовав JPEG к соответствующему размеру View компонента. Следующий пример демонстрирует эту технику.

Тестовый проект можно скачать на GitHub.
По материалам документации.
Вольный перевод — Pavel Bobkov.

Источник

Android permissions

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

Разрешения могут быть двух типов: normal и dangerous. Отличие между ними в том, что dangerous разрешения опасны, т.к. могут быть использованы для получения ваших личных данных или информации о вас, или еще каким-то способом могут навредить вам. Примеры dangerous разрешений — это доступ к контактам или смс.

Полный список существующих разрешений можно посмотреть здесь. Характеристика Protection level подскажет насколько опасно это разрешение. А здесь можно сразу просмотреть весь список normal разрешений.

Если приложению необходимо получить какое-либо разрешение, то оно должно быть указано в AndroidManifest.xml, в корневом теге . Тег разрешения — .

Вот пример манифеста с разрешениями:

Здесь мы указываем, что приложению понадобятся разрешения на работу с интернет, контактами, bluetooth, локацией, камерой и смс. Пользователю необходимо будет подтвердить, что он предоставляет приложению эти разрешения.

В этом материале мы подробно рассмотрим, как происходит это подтверждение.

До Android 6

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

Система показывает разрешения, которые были прописаны в манифесте. Сначала те, которые могут быть опасными с точки зрения приватности (отправка смс, доступ к камере/местоположению/контактам), а затем — обычные (интернет, bluetooth).

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

Нажав кнопку Install, пользователь автоматически подтверждает свое согласие, что приложению будут предоставлены эти запрашиваемые разрешения. И далее, когда приложение, например, пытается в коде получить список контактов, то оно без проблем их получает.

Если же в манифесте не указать разрешение READ_CONTACTS, то его не будет и в списке тех разрешений, которые подтверждает пользователь. Соответственно, система не предоставит этому приложению доступ к контактам. И при попытке получить список контактов, будет ошибка:
java.lang.SecurityException: Permission Denial: opening provider com.android.providers.contacts.ContactsProvider2

Android 6

С выходом Android 6 механизм подтверждения поменялся. Теперь при установке приложения пользователь больше не видит списка запрашиваемых разрешений. Приложение автоматически получает все требуемые normal разрешения, а dangerous разрешения необходимо будет программно запрашивать в процессе работы приложения.

Читайте также:  Android intent open maps

Т.е. теперь недостаточно просто указать в манифесте, что вам нужен, например, доступ к контактам. Когда вы в коде попытаетесь запросить список контактов, то получите ошибку SecurityException: Permission Denial. Потому что вы явно не запрашивали это разрешение, и пользователь его не подтверждал.

Перед выполнением операции, требующей разрешения, необходимо спросить у системы, есть ли у приложения разрешение на это. Т.е. подтверждал ли пользователь, что он дает приложению это разрешение. Если разрешение уже есть, то выполняем операцию. Если нет, то запрашиваем это разрешение у пользователя.

Давайте посмотрим, как это выглядит на практике.

Проверка текущего статуса разрешения выполняется методом checkSelfPermission

На вход метод требует Context и название разрешения. Он вернет константу PackageManager.PERMISSION_GRANTED (если разрешение есть) или PackageManager.PERMISSION_DENIED (если разрешения нет).

Если разрешение есть, значит мы ранее его уже запрашивали, и пользователь подтвердил его. Можем получать список контактов, система даст нам доступ.

Если разрешения нет, то нам надо его запросить. Это выполняется методом requestPermissions. Схема его работы похожа на метод startActivityForResult. Мы вызываем метод, передаем ему данные и request code, а ответ потом получаем в определенном onResult методе.

Добавим запрос разрешения к уже имеющейся проверке.

Проверяем разрешение READ_CONTACTS. Если оно есть, то читаем контакты. Иначе запрашиваем разрешение READ_CONTACTS методом requestPermissions. На вход метод требует Activity, список требуемых разрешений, и request code. Обратите внимание, что для разрешений используется массив. Т.е. вы можете запросить сразу несколько разрешений.

После вызова метода requestPermissions система покажет следующий диалог

Здесь будет отображено разрешение, которое мы запросили методом requestPermissions. Пользователь может либо подтвердить его (ALLOW), либо отказать (DENY). Если будет запрошено сразу несколько разрешений, то на каждое из них будет показан отдельный диалог. И пользователь может какие-то разрешения подтвердить, а какие-то нет.

Решение пользователя мы получим в методе onRequestPermissionsResult

Проверяем, что requestСode тот же, что мы указывали в requestPermissions. В массиве permissions придут название разрешений, которые мы запрашивали. В массиве grantResults придут ответы пользователя на запросы разрешений.

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

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

Далее поговорим про некоторые дополнительные возможности, нюансы и прочие мелочи.

Манифест

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

Всегда проверяйте разрешение

Каждый раз (а не только первый) перед выполнением операции, требующей определенного разрешения, необходимо проверять, что это разрешение есть. Потому что, даже если пользователь уже давал это разрешение, он всегда может зайти в настройки приложения и отменить его. И если вы после этого не выполните проверку, то получите ошибку при выполнении операции.

Читайте также:  Web view source android

Don’t ask again

Когда вы первый раз делаете запрос на какое-либо разрешение, пользователь может отказать. При последующих запросах этого же разрешения, в диалоге появится чекбокс Don’t ask again

Если пользователь включит этот чекбокс, то при последующих ваших запросах диалог не будет отображаться, а в onRequestPermissionsResult сразу будет приходить отказ.

Объяснение для пользователя

Когда вы запрашиваете разрешение, пользователю должно быть очевидно, зачем приложению понадобилось это разрешение, и у него не должно возникать вопросов. Но случаи бывают разные, и вы можете решить, что вам надо явно объяснить пользователю, почему приложению понадобилось это разрешение.

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

Есть метод shouldShowRequestPermissionRationale, который может быть полезен в данной ситуации. Передаете ему название разрешения, а он вам в виде boolean ответит, надо ли показывать объяснение для пользователя.

Т.е. вы сначала проверяете наличие разрешения. Если его нет, то вызываете shouldShowRequestPermissionRationale, чтобы решить, надо ли показывать объяснение пользователю. Если не надо, то делаете запрос разрешения. А если надо, то показываете ваш диалог с объяснением, а после этого диалога делаете запрос разрешения.

Алгоритм работы метода shouldShowRequestPermissionRationale прост.

Если вы еще ни разу не запрашивали это разрешение, то он вернет false. Т.е. перед первым запросом разрешения ничего объяснять не надо.

Если вы ранее уже запрашивали это разрешение и пользователь отказал, то метод вернет true. Т.е. пользователь не понимает, почему он должен давать это разрешение, и надо ему это объяснить.

Если пользователь ставил галку Don’t ask again, то метод вернет false. Запрос полномочий все равно не будет выполнен. Объяснять что-то не имеет смысла.

Разумеется, вы можете показывать дополнительную информацию согласно вашим правилам и не использовать метод shouldShowRequestPermissionRationale.

Группы

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

Например, разрешения READ_CONTACTS и WRITE_CONTACTS принадлежат группе CONTACTS. И если пользователь уже подтверждал разрешение на READ_CONTACTS, то при проверке WRITE_CONTACTS вы получите PERMISSION_GRANTED.

Android 6 и targetSdkVersion 23

Схема работы разрешений зависит от версии Android, на которой запущено приложение и от параметра targetSdkVersion приложения.

Новая схема будет работать, если версия Android >= 6 И targetSdkVersion >= 23.

В остальных случаях, т.е. когда targetSdkVersion

Присоединяйтесь к нам в Telegram:

— в канале StartAndroid публикуются ссылки на новые статьи с сайта startandroid.ru и интересные материалы с хабра, medium.com и т.п.

— в чатах решаем возникающие вопросы и проблемы по различным темам: Android, Kotlin, RxJava, Dagger, Тестирование

— ну и если просто хочется поговорить с коллегами по разработке, то есть чат Флудильня

— новый чат Performance для обсуждения проблем производительности и для ваших пожеланий по содержанию курса по этой теме

Источник

Оцените статью