Проверьте разрешения в отдельном классе - дождитесь результата запроса, несмотря на асинхронность - PullRequest
0 голосов
/ 07 января 2020

Я пытаюсь проверить необходимые разрешения в своем классе. Важно то, что приложение ожидает «ответа» на 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 не вызывается в отдельном классе? Я прав, и это как будто оно отрезано? Или это та же самая проблема, которую я читал в других вопросах с фрагментами и операциями - я работаю с фрагментами, но я подумал, что можно сделать разрешение на проверку активности. Заранее спасибо за вашу задержку, я действительно застрял здесь на некоторое время.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...