Возможно ли иметь "необязательные" разрешения в Android?

Есть ли способ для приложения Android объявить запрошенные разрешения как необязательные?

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

Есть ли способ и приложение сказать "Я хочу разрешение X, но вы можете отказаться от него, и в этом случае я буду счастлив работать с ограниченной функциональностью?"

3 ответа

Решение

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

Можно предоставить привилегии уже установленному приложению, не запрашивая разрешения в "основном" приложении и создав другое приложение ("заглушку"), используя то же самое android:sharedUserId, который запрашивает особенности. Затем вы можете проверить, было ли установлено приложение-заглушка, проверив,

context.checkCallingOrSelfPermission(permission) == PackageManager.PERMISSION_GRANTED

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

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

Теперь вы можете запросить привилегии у пользователя, запустив установку (одно из) ваших приложений-заглушек. Поэтому, если ваши привилегии требуются после некоторого пользовательского ввода в активности, запустите apk, чтобы выскочить, если привилегия не была предоставлена ​​(конечно, вы можете поместить объяснительную операцию перед ней), и выполнить функцию при возвращении из менеджер пакетов или когда разрешение было предоставлено ранее. Вы также можете включить или отключить разрешения где-нибудь в ваших настройках или в диалоговом окне первого запуска.

Для ленивых (как и я) краткое резюме о том, как запустить установщик пакета: Создать Intent с помощью Intent.ACTION_VIEW для file://-URI, используя тип "application/vnd.android.package-archive", Ресурсы и ресурсы не работают напрямую, вы можете, например, связать его как актив и скопировать его в папку кэша или аналогичную.


Предупреждение. Этот ответ может не соответствовать требованиям Google Play ToS, поскольку этот метод имеет некоторые проблемы с удалением (могут привести к утечке приложений, см. Ниже), особенно при удалении с помощью сторонних механизмов (например, Google Play), так как пользователь не видит вспомогательные приложения используя эти методы) и в качестве необязательных привилегий не могут отображаться в магазине игр afaik.

Для проблем удаления я бы рекомендовал использовать такие имена, как "MyApp: разрешения XXX", учитывая, что имя приложения - "MyApp", чтобы пользователь мог легко удалить их все в списках по алфавиту. В качестве альтернативы, если вы можете жить с более сложными приложениями-заглушками, используйте ACTION_PACKAGE_REMOVED, как упомянуто здесь.

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

Ссылка: http://code.google.com/p/android/issues/detail?id=6266

Другие вопросы по тегам