如何从 LibGdx 核心模块检查 Android 运行时 Permissions/Get Android 当前 Activity?

How to Check Android Runtime Permissions/Get Android Current Activity from LibGdx Core Module?

我是来自 cmusphinx 的 learning/developing Android/Kotlin/Ktx game that will need a live speech recognizer

现在我很难在运行时检查权限。我已经从核心编码了一个 interface 到 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

我猜是因为我没有得到当前的 activity。 我找不到解释这个的教程。

如何获取当前 activity 来检查 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)
  ...
}

}

您永远不应该自己实例化 Activity 或 Context。 Android 为您提供上下文。如果您简单地实例化一个 Activity,它是一个无用的对象,并且肯定没有您的应用程序的上下文与 OS。

您的接口实现需要像这样引用实际的 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)