Система разрешений в Android реализована не очень удобно. Обычно приложению требуется сделать что-то незначительное и тривиальное (например, один раз заполнить поля формы), но в реальности приложение получает разрешение на доступ ко всем контактам навсегда. Например, плееру VLC нужно останавливать музыку при поступлении входящего звонка. Ничего не поделаешь, но для этого приходится запрашивать полный доступ к состоянию телефона (READ_PHONE_STATE), а это номер телефона, серийник, информация о вызовах.

В таких условиях можно понять, почему пользователи относятся подозрительно ко всем этим разрешениям. Мол, а зачем программа требует доступ ко всем моим контактам? Особенно в тех случаях, когда исходный код недоступен, у человека нет гарантии, что программа не попытается выгрузить его контакты на удалённый сервер (такое уже случалось).

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

Чтобы избежать подобных проблем, разработчик Дэн Лью (Dan Lew) рекомендует несколько способов, как реализовать некоторые функции под Android, не спрашивая разрешения.

Например, нужно инициировать голосовой звонок с телефона. Обычно это делают с помощью метода android.permission.CALL_PHONE.

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

Для android.permission.CALL_PHONE требуется разрешение пользователя на совершение звонков. Такое разрешение даёт возможность впоследствии звонить на любой номер в любое время незаметно от владельца.

Более правильный метод следующий:

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

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

Ещё один пример — доступ к списку контактов. Для этого тоже необязательно получать разрешение, а можно воспользоваться помощью другого приложения, у которого такое разрешение уже есть (метод ACTION_PICK).

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

Такой же трюк проходит со списком телефонных номеров, текстовыми сообщениями и т.д.

Отказ от запроса разрешений имеет ряд преимуществ, говорит Дэн Лью. Повышается удобство работы пользователя, он больше доверяет вашему приложению. Правда, возникают некоторые риски для безопасности, но мы ведь не будем эксплуатировать эти баги, правда?

Подписаться
Уведомить о
9 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии