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

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

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

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

Ответ 1

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

Ответ 3

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

context.checkCallingOrSelfPermission(permission) == PackageManager.PERMISSION_GRANTED

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

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

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

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


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

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