Я пытаюсь проверить необходимые разрешения в своем классе. Важно то, что приложение ожидает «ответа» на go дальше. Конечно, я могу использовать функцию onRequestPermissionsResult () и делать остальную часть кода здесь, но я не знаю, как с этим справиться, если функция не входит в мою mainActivity. Таким образом, асинхронность приводит к тому, что приложение движется неправильно. Фактически мой рекордер должен просто инициализироваться, если разрешение предоставлено, но моя функция checkNeededPermissions () возвращает false даже до того, как запрос на разрешение полностью выполнен.
Я вызываю PermissionChecker в моей ViewModel:
fun initializeRecorder(context: Context) {
if(PermissionsChecker(context).checkNeededPermissions()){
//initialize Recorder}}
else {PermissionsChecker(context).checkNeededPermissions()}
Я снова вызываю checkNeededPermissions () в else l oop, потому что мое приложение нельзя использовать без разрешений, и пользователь должен застрял в запросе / dialog-l oop, если он не предоставляет разрешения.
Мой PermissionChecker выглядит так:
class PermissionsChecker(val context: Context) : AppCompatActivity(), ActivityCompat.OnRequestPermissionsResultCallback{
private val recordPermission = Manifest.permission.RECORD_AUDIO
private val writePermission = Manifest.permission.WRITE_EXTERNAL_STORAGE
private val readPermission = Manifest.permission.READ_EXTERNAL_STORAGE
private val requestCode = 101
private var allPermissionsGranted = false
fun checkNeededPermissions(): Boolean {
if (ContextCompat.checkSelfPermission(
context,
recordPermission
) != PackageManager.PERMISSION_GRANTED || ContextCompat.checkSelfPermission(
context,
writePermission
) != PackageManager.PERMISSION_GRANTED || ContextCompat.checkSelfPermission(
context,
readPermission
) != PackageManager.PERMISSION_GRANTED
) {
/** Permission/s not granted */
when {
/** Permission/s have been denied */
ActivityCompat.shouldShowRequestPermissionRationale(
context as Activity,
recordPermission
) -> {
showDialog(recordPermission)
}
ActivityCompat.shouldShowRequestPermissionRationale(
context,
writePermission
) -> {
showDialog(writePermission)
}
ActivityCompat.shouldShowRequestPermissionRationale(
context,
readPermission
) -> {
showDialog(readPermission)
}
/** Not asked yet */
else -> {
makeRequest()
}
}
} else {
allPermissionsGranted = true
}
return allPermissionsGranted
}
private fun showDialog(missingPermission: String) {
val builder = AlertDialog.Builder(context)
when (missingPermission) {
recordPermission -> builder.setMessage(R.string.permission_record)
writePermission -> builder.setMessage(R.string.permission_write)
readPermission -> builder.setMessage(R.string.permission_read)
}
builder.setTitle(R.string.permission_title)
builder.setPositiveButton(
R.string.permission_button
) { _, _ ->
makeRequest()
}
val dialog = builder.create()
dialog.show()
}
private fun makeRequest() {
val permissions = arrayOf(
recordPermission,
writePermission,
readPermission
)
ActivityCompat.requestPermissions(context as Activity, permissions, requestCode)
}
override fun onRequestPermissionsResult(
requestCode: Int, permissions: Array<String>, grantResults: IntArray
) {
when (requestCode) {
this.requestCode -> {
allPermissionsGranted =
when (grantResults.isEmpty() || grantResults[0] != PackageManager.PERMISSION_GRANTED ||
grantResults[1] != PackageManager.PERMISSION_GRANTED || grantResults[2] != PackageManager.PERMISSION_GRANTED) {
true -> false
false -> true
}
}
}
}
}
Есть ли возможность ждать с остальными приложения, пока запрос не будет полностью обработан, несмотря на асинхронность? И кто-нибудь знает, почему onRequestPermissionsResult не вызывается в отдельном классе? Я прав, и это как будто оно отрезано? Или это та же самая проблема, которую я читал в других вопросах с фрагментами и операциями - я работаю с фрагментами, но я подумал, что можно сделать разрешение на проверку активности. Заранее спасибо за вашу задержку, я действительно застрял здесь на некоторое время.