Как установить Content в activity после первого запроса разрешения

#android #android-permissions #android-jetpack-compose

#Android #android-разрешения #android-jetpack-compose

Вопрос:

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

 class MainActivity : AppCompatActivity() {

    val viewModel by viewModels<MainViewModel>()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        if (allPermissionsGranted()) {
            // the setContent code not executed after getting the permission first time
            setContent {
                MyTheme {
                    Main(
                        viewModel = viewModel,
                        backDispatcher = onBackPressedDispatcher
                    )
                }
            }
        } else {
            ActivityCompat.requestPermissions(
                this, REQUIRED_PERMISSIONS, REQUEST_CODE_PERMISSIONS)
        }
    }

    private fun allPermissionsGranted() = REQUIRED_PERMISSIONS.all {
        ContextCompat.checkSelfPermission(
            baseContext, it) == PackageManager.PERMISSION_GRANTED
    }

    companion object {
        private const val REQUEST_CODE_PERMISSIONS = 10
        private val REQUIRED_PERMISSIONS = arrayOf(Manifest.permission.CAMERA)
    }
}
  

Ответ №1:

Действия не воссоздаются после предоставления разрешения. Итак, в вашем случае после предоставления разрешения в приложении ничего не произойдет. Это не связано с Compose; вы получите то же поведение setContentView() , что и у вас setContent {} .

Переместите свою setContent {} логику в другую функцию. Вызовите его оттуда onCreate() , где он у вас есть сейчас. И переопределите onRequestPermissionsResult() и вызовите эту функцию оттуда, если вам было предоставлено разрешение.

Более сложным способом было бы определить, есть remember ли у вас разрешение, и обновить это состояние, onRequestPermissionsResult() если вам было предоставлено разрешение. Сделайте все это изнутри setContent() , и Compose перекомпилирует при изменении состояния.

Комментарии:

1. Если я отклоню разрешение, ActivityCompat.requestPermissions оно не будет выполнено снова. Есть ли способ это исправить?

2. @ccd: requestPermissions() будет выполнен снова, если вы договоритесь о его выполнении. Вы можете сделать это на основе пользовательского ввода, или вы можете finish() свою активность с «извините!» Toast и повторите попытку, если пользователь повторно запустит ваше приложение.

Ответ №2:

Привет, вы можете добиться этого с помощью фрагментов. Вы должны проверить разрешение, запрос и обработать ответ

Если разрешение предоставлено -> перейдите к фрагменту

Если разрешение не предоставлено, подождите, пока пользователь не предоставит его, и после ответа -> перейдите к фрагменту