Как проверить разрешения Android Runtime / Получить текущую активность Android из ядра модуля LibGdx? - PullRequest
1 голос
/ 24 октября 2019

Я изучаю / разрабатываю игру для Android / Kotlin / Ktx , для которой потребуется распознаватель живой речи от cmusphinx.

Сейчас я пытаюсь проверить разрешения во время выполнения. Я уже закодировал интерфейс от ядра к Android.

Журнал выдает мне эту ошибку при выполнении функции 'setupPermissions' (код ниже):

java.lang.NullPointerException: Attempt to invoke virtual method 'int android.content.Context.checkPermission(java.lang.String, int, int)' on a null object reference

Iдумаю, это потому, что я не получаю текущую активность. Я не могу найти учебник, объясняющий это.

Как получить текущую активность для проверки разрешений на Android?


Код выглядит следующим образом:

Основной модуль:

package com.folotera.controller

interface PermissionManager {
    fun checkPermissions()
}

Модуль Android:

class AndroidPermissionChecker : PermissionManager {

    private val RECORD_REQUEST_CODE = 101

    override fun checkPermissions(){
        setupPermissions()
    }

    private fun setupPermissions() {

        val permission = ContextCompat.checkSelfPermission(Activity(),
            Manifest.permission.RECORD_AUDIO)

        if (permission != PackageManager.PERMISSION_GRANTED) {
            Log.i("TAG", "Permission to record denied")
            makeRequest()
        }
    }

    private fun makeRequest() {
        ActivityCompat.requestPermissions(Activity(),
            arrayOf(Manifest.permission.RECORD_AUDIO, Manifest.permission.WRITE_EXTERNAL_STORAGE),
            RECORD_REQUEST_CODE)
    }
}

..

class AndroidLauncher : AndroidApplication() {
...
 override fun onCreate(savedInstanceState: Bundle?) {
 ... 
     val config = AndroidApplicationConfiguration()
     initialize(aGame(AndroidPermissionChecker()), config)
  ...
}

}

1 Ответ

2 голосов
/ 24 октября 2019

Вы никогда не должны создавать экземпляр Activity или Context самостоятельно. Android предоставляет вам контекст. Если вы просто создаете экземпляр Activity, это бесполезный объект и, конечно, он не имеет контекста вашего приложения с ОС.

Для реализации вашего интерфейса потребуется ссылка на фактическую активность, подобную этой:

class AndroidPermissionChecker(private val activity: Activity) : PermissionManager {
    //...

    private fun makeRequest() {
        ActivityCompat.requestPermissions(activity,
            arrayOf(Manifest.permission.RECORD_AUDIO, Manifest.permission.WRITE_EXTERNAL_STORAGE),
            RECORD_REQUEST_CODE)
    }
}

И вы передаете это в конструктор так:

initialize(aGame(AndroidPermissionChecker(this)), config)
...