如何从 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)
我是来自 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)