Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何检查Android运行时权限/从LibGdx核心模块获取Android当前活动?_Android_Kotlin_Libgdx - Fatal编程技术网

如何检查Android运行时权限/从LibGdx核心模块获取Android当前活动?

如何检查Android运行时权限/从LibGdx核心模块获取Android当前活动?,android,kotlin,libgdx,Android,Kotlin,Libgdx,我正在学习/开发一款Android/Kotlin/游戏,需要cmusphinx的帮助 现在我正努力在运行时检查权限。我已经编写了一个从core到android的代码 执行“setupPermissions”功能时,日志显示此错误(代码如下): 我想这是因为我没有得到当前的活动。 我找不到解释这一点的教程 如何让当前活动检查Android上的权限 代码如下: 核心模块: package com.folotera.controller interface PermissionManager {

我正在学习/开发一款Android/Kotlin/游戏,需要cmusphinx的帮助

现在我正努力在运行时检查权限。我已经编写了一个从core到android的代码

执行“setupPermissions”功能时,日志显示此错误(代码如下):

我想这是因为我没有得到当前的活动。 我找不到解释这一点的教程

如何让当前活动检查Android上的权限


代码如下:

核心模块:

package com.folotera.controller

interface PermissionManager {
    fun checkPermissions()
}
安卓模块:

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)
    }
}


您不应该自己实例化活动或上下文。Android为您提供了上下文。如果您只是实例化一个活动,那么它是一个无用的对象,并且肯定没有您的应用程序与操作系统的上下文

您的接口实现将需要对实际活动的引用,如下所示:

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)
然后将其传递给构造函数,如下所示:

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)

星星是为了突出文本。既然核心模块无法使用Activity类,我应该如何编写PermissionManager接口构造函数?正如上面所示。PermissionManager的AndroidPermissionChecker实现仅在Android模块中,因此它可以自由引用活动。核心模块中的界面声明不需要更改。请注意,在授予权限后,您仍需要回拨到游戏。您的AndroidLauncher需要实现ActivityCompat.OnRequestPermissionsResultCallback,在那里,当它收到肯定的结果时,它必须调用游戏中的某个函数,告诉它权限现在已授予。因此,您需要制作一个
lateinit val游戏:YourGame
,该游戏存储对您的游戏的引用,并将其传递给
initialize
。它成功了。非常感谢你。我发现libgdx屏幕不是活动。这也帮助我理解了这个问题。“游戏的不同屏幕在libgdx中实现,而不是作为单独的活动。”