Система разрешений в 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 комментариев

  1. 17.12.2014 at 16:37

    «Правда, возникают некоторые риски для безопасности, но мы ведь не будем эксплуатировать эти баги, правда?» — ага, базаришь. :)))

  2. 17.12.2014 at 22:03

    А ничё, что если ты не задекларируешь эти разрешения при публикации в Play маркете тебя ВыИпУт БеЗ СмАзКи

  3. 17.12.2014 at 23:18

  4. 18.12.2014 at 09:19

    концепция безопасной разработки программ это как раз предполагает. но программерам многим просто влом что-то нормально сделать.

  5. 21.12.2014 at 00:48

    Это не баг, эта фича для рекламодателей. Если гугл встроит нормальную систему разрешений, то активность по написанию приложений под андроид упадёт раз в 100. Поэтому это и не было сделано изначально: нет программ, есть программы для айос, которая не позволяла тогда ограничивать => андроид не взлетает.

    Если встроит разраб форка АОСП, рекламодатели прикрутят детект этого форка и неработу на нём приложений. Поэтому не будет.

    xprivacy можно обойти, и уже есть примеры приложений, намеренно не работающих при xprivacy.

  6. 13.01.2015 at 09:41

    Ребят, изыините меня за мой вопрос, но подалуйста , кому не сложно, объясните мне куда вводить эти комвнды ? Просто я новичёк в этом .надеюсь на вашу доброту)

    • 06.03.2015 at 11:13

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

  7. 18.03.2015 at 12:18

    первые две вставки кода абсолютно одинаковы…

Оставить мнение