У меня есть настроенный Android SurfaceView, который я использую для отображения видеопотока с камеры. Для доступа к камере мне необходимо получить соответствующие разрешения от пользователя.
Android документация объясняет, как это делается с помощью методов checkSelfPermission, shouldShowRequestPermissionRationale и
requestPermissions.
Теперь я хотел бы запросить разрешения непосредственно из настроенного представления (пожалуйста, не пытайтесь объяснить мне, что это плохая практика и т. д.).
Причина, по которой мне не удается этого добиться, заключается в том, что, похоже, нет способа сообщить Android, где найти обратный вызов ActivityCompat.OnRequestPermissionsResultCallback. Похоже, Android автоматически ожидает, что он станет частью Activity или Fragment, в котором размещено мое измененное представление.
Я пропустил вызов <whatever>.setCallback(this), который мог бы добавить в свой пользовательский код представления после реализации ActivityCompat.OnRequestPermissionsResultCallback непосредственно в представлении.
Действительно ли нет не хакерского способа запросить разрешения из представления Android?
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?
Правильный.
Поместите метод onPermissionResult в действие/фрагмент, который его вызывает, и создайте общедоступный метод внутри представления «proceedAfterPermission» и вызовите его из родительского действия/фрагмента.
А для запроса разрешения от представления вы можете передать контекст из действия/фрагмента в представление, просто сделайте переменную контекста общедоступной.
Мне все равно пришлось бы реализовать ActivityCompat.OnRequestPermissionsResultCallback в Activity/Fragment, даже если я вызываю ActivityCompat.requestPermissions((Activity)getContext()... из SurfaceView и, следовательно, не могу должным образом абстрагировать все в SurfaceView.
Да, вы должны реализовать результат onRequestPermission в действии/фрагменте, но после того, как вы получите обратный вызов, просто вызовите любой общедоступный метод, чтобы уведомить представление об обратном вызове. Другого пути нет, братан, прости :(
Да, просто еще один недостаток Android (без обид). В любом случае спасибо за ваш ответ, добро пожаловать в StackOverflow.
Это неудачно. Я использую методы
surfaceCreatedиsurfaceDestroyedSurfaceViewдля запуска и остановки видеопотока с камеры. Извне представления я не знаю, когда запускаются эти методы, что означает, что мне нужно запросить разрешения еще до того, как представление будет создано.