Запрос разрешений камеры из представления

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

Android документация объясняет, как это делается с помощью методов checkSelfPermission, shouldShowRequestPermissionRationale и requestPermissions.

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

Причина, по которой мне не удается этого добиться, заключается в том, что, похоже, нет способа сообщить Android, где найти обратный вызов ActivityCompat.OnRequestPermissionsResultCallback. Похоже, Android автоматически ожидает, что он станет частью Activity или Fragment, в котором размещено мое измененное представление.

Я пропустил вызов <whatever>.setCallback(this), который мог бы добавить в свой пользовательский код представления после реализации ActivityCompat.OnRequestPermissionsResultCallback непосредственно в представлении.

Действительно ли нет не хакерского способа запросить разрешения из представления Android?

1
0
131
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

It seems that Android automatically expects it to be part of the Activity or Fragment that hosts my modified view

Правильный.

Is there really no non-hacky-looking way to request permissions from within an Android View?

Правильный.

Это неудачно. Я использую методы surfaceCreated и surfaceDestroyedSurfaceView для запуска и остановки видеопотока с камеры. Извне представления я не знаю, когда запускаются эти методы, что означает, что мне нужно запросить разрешения еще до того, как представление будет создано.

ackh 16.05.2019 17:32

Поместите метод onPermissionResult в действие/фрагмент, который его вызывает, и создайте общедоступный метод внутри представления «proceedAfterPermission» и вызовите его из родительского действия/фрагмента.

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

Мне все равно пришлось бы реализовать ActivityCompat.OnRequestPermissionsResultCallback в Activity/Fragment, даже если я вызываю ActivityCompat.requestPermissions((Activity)getContext()... из SurfaceView и, следовательно, не могу должным образом абстрагировать все в SurfaceView.

ackh 16.05.2019 17:38

Да, вы должны реализовать результат onRequestPermission в действии/фрагменте, но после того, как вы получите обратный вызов, просто вызовите любой общедоступный метод, чтобы уведомить представление об обратном вызове. Другого пути нет, братан, прости :(

Atul Gupta 16.05.2019 17:43

Да, просто еще один недостаток Android (без обид). В любом случае спасибо за ваш ответ, добро пожаловать в StackOverflow.

ackh 16.05.2019 17:47

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