package com.example.watch
import android.app.Activity
import android.content.Context
import android.content.Intent
import android.content.pm.PackageManager
import android.os.Bundle
import android.util.Log
import androidx.core.app.ActivityCompat
import androidx.fragment.app.FragmentActivity
import java.util.*
class PermissionActivity : FragmentActivity() {
private var mPermissions: ArrayList<String?>? = null
override fun onNewIntent(intent: Intent) {
super.onNewIntent(intent)
finish()
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
mPermissions = if (savedInstanceState != null) {
savedInstanceState.getStringArrayList(PERMISSION_KEY)
} else {
ArrayList(Arrays.asList(*intent.getStringArrayExtra(PERMISSION_KEY)))
}
Log.i(TAG, "onCreate()")
requestPermission()
}
fun requestPermission() {
val it = mPermissions!!.iterator()
while (it.hasNext()) {
if (ActivityCompat.checkSelfPermission(
this,
it.next()!!
) == PackageManager.PERMISSION_GRANTED
) {
it.remove()
}
}
if (mPermissions!!.isEmpty()) { // all allowed
setResult(RESULT_OK)
Log.i(TAG, "finished")
finish()
} else {
var permissions: Array<String?>? = arrayOfNulls(
mPermissions!!.size
)
permissions = mPermissions!!.toArray(permissions)
ActivityCompat.requestPermissions(this, permissions, PERMISSION_REQ_TAG)
Log.i(TAG, "requestPermissions")
}
}
override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(outState)
outState.putStringArrayList(PERMISSION_KEY, mPermissions)
}
override fun onRequestPermissionsResult(
requestCode: Int,
permissions: Array<String>,
grantResults: IntArray
) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
Log.i(TAG, "onRequestPermissionsResult() requestCode = " + "requestCode")
if (requestCode == PERMISSION_REQ_TAG) {
if (permissions.size == 0) {
Log.i(TAG, "onRequestPermissionsResult : permission is 0")
return
}
for (p in grantResults) {
if (p == PackageManager.PERMISSION_DENIED) {
Log.i(TAG, "onRequestPermissionsResult : permission denied")
finish()
return
}
}
setResult(RESULT_OK)
finish()
}
}
companion object {
private val TAG = PermissionActivity::class.java.simpleName
private const val PERMISSION_KEY = "permissions"
private const val PERMISSION_REQ_TAG = 1
fun checkPermission(context: Context?, permissions: Array<String>): Boolean {
for (permission in permissions) {
if (context == null || ActivityCompat.checkSelfPermission(
context,
permission!!
) == PackageManager.PERMISSION_DENIED
) {
Log.i(TAG, "checkPermission : PERMISSION_DENIED : " + "permission")
return false
} else {
Log.i(TAG, "checkPermission : PERMISSION_GRANTED : " + "permission")
}
}
return true
}
fun showPermissionPrompt(
callingActivity: Activity,
requestCode: Int,
permissions: Array<String>
) {
val intent = Intent(callingActivity, PermissionActivity::class.java)
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_SINGLE_TOP)
intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION)
intent.putExtra(PERMISSION_KEY, permissions)
callingActivity.startActivityForResult(intent, requestCode)
}
}
}
代码如上所示,错误为:
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.watch, PID: 32569
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.watch/com.example.watch.PermissionActivity}: java.lang.NullPointerException: Attempt to get length of null array
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3456)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3612)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2073)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:246)
at android.app.ActivityThread.main(ActivityThread.java:7690)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:593)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:995)
Caused by: java.lang.NullPointerException: Attempt to get length of null array
at com.example.watch.PermissionActivity.onCreate(PermissionActivity.kt:42)
at android.app.Activity.performCreate(Activity.java:8033)
at android.app.Activity.performCreate(Activity.java:8013)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1309)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3429)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3612)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2073)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:246)
at android.app.ActivityThread.main(ActivityThread.java:7690)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:593)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:995)
I/Process: Sending signal. PID: 32569 SIG: 9
请帮助我尝试通过此代码给予权限,但收到java.lang.NullPointerException错误:尝试在com.example.watch.PermissionActivity.onCreate(PermissionActivity.kt:42)中获取空数组的长度。要运行这段代码,我应该做哪些更改
2条答案
按热度按时间rqcrx0a61#
您正在使用
mPermissions!!.size
,并且mPermissions似乎为null
,您应该进行调试以检查其为null的原因。另外,请尝试避免使用!!,而是使用if
语句或作用域函数执行null检查sxpgvts32#
根据堆栈跟踪,出错的行似乎是
if (mPermissions!!.isEmpty())
。正如Kotlindocs在这里所述,!!操作符是为NPE爱好者准备的,应该避免使用。因为它似乎只是试图检查权限数组是否为空,所以可以使用mPermissions.isNullOrEmpty()
。