Возможно ли иметь "необязательные" разрешения в 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