Права доступа Андроид: "Мне не нужны ваши разрешения"!

Перевод статьи I don't need your permission!, автор - Daniel Lew

Разрешения для Андроид – это системная функция, которая позволяет получить от пользователя права. Как правило, разработчикам необходимо получить "добро" для небольших функций, порой весьма незначительных. По факту, система дает гораздо больше полномочий, чем требуется: например, доступ ко ВСЕ контактам.

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

Что меня беспокоит: вы не всегда должны просить разрешения для выполнения некоторых действий.

К примеру: android.permission.CALL_PHONE. Вам нужно инициировать телефонные звонки в приложении. Таким же образом вы звоните.


Intent intent = new Intent(Intent.ACTION_CALL);
intent.setData(Uri.parse("tel:1234567890"))
startActivity(intent);

Неправильно. Вам нужны эти права для того, чтобы с этим кодом вы могли позвонить в любое время без согласия пользователя. Имея эти права, я могу позвонить 1–900-CAT-FACTS в 3 часа каждое утро.

Правильней будет делать это через ACTION_VIEW или ACTION_DIAL:

Intent intent = new Intent(Intent.ACTION_DIAL);
intent.setData(Uri.parse("tel:1234567890"))
startActivity(intent);

Красота этого решения состоит в том, что вам не нужно предоставлять права доступа. Это происходит потому, что вам не нужно делать вызов, а вместо этого открывается Телефон (или адресная книга) Андроид и появляется номер телефона, но при этом пользователю нужно самостоятельно нажать на кнопку дозвона. Честно говоря, это лучший вариант из возможных; я не хочу, чтобы приложение меня “удивляло”.

Еще один показательный пример. Я написал Quick Map для моей жены после того, как она пожаловалась на то, что нужно много кликать для навигации через ее телефон. Все, что ей нужно – список ее контактов и возможность навигации по ним.

Вы подумаете, что мне нужны права доступа к ее контактам для написания приложения: опять неправильно! Если вы посмотрите на исходный кож, вы увидите, что ACTION_PICK используется для запуска другого приложения для выбора адреса:

Intent intent = new Intent(Intent.ACTION_PICK);
intent.setType(StructuredPostal.CONTENT_TYPE);
startActivityForResult(intent, 1);

Это не только не требует прав, но и пользовательского интерфейса. Это повышает пользовательский опыт приложения, из которого вы берете контакты.

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

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

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

Чем меньше разрешений – тем больше доверие пользователя. Кроме того, у пользователя будет улучшен пользовательский опыт (UX), так как в его руках будут предпочитаемые им приложения.