#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:
Привет, вы можете добиться этого с помощью фрагментов. Вы должны проверить разрешение, запрос и обработать ответ
Если разрешение предоставлено -> перейдите к фрагменту
Если разрешение не предоставлено, подождите, пока пользователь не предоставит его, и после ответа -> перейдите к фрагменту