【发布时间】:2018-03-21 06:52:54
【问题描述】:
有处理使用游标获取android持有的图像。游标需要授权到外部存储。 如果AndroidOS为6.0或更高版本且未获得授权许可,应用程序将被终止。 如果获得许可,则需要进行关闭游标的处理。
如果是 Java,最好如下写 onStop,除了 Kotlin,会引发异常。
if (cursor != null )
cursor.close();
kotlin.UninitializedPropertyAccessException: lateinit property cursor has not been initialized
所以我写了我们初始化光标并完成它。
cursor = contentResolver.query(
MediaStore.Images.Media.INTERNAL_CONTENT_URI,
null, null, null, null
)
这不再导致异常,但是您似乎编写了不必要的代码,并且没有变得更清晰。
但是,我没有延迟初始化光标,我认为在声明时初始化它是无用的代码。
还有,在声明private var cursor: Cursor? = Null的时候,我觉得各个地方都需要一个空判断代码,我觉得不像Kotlin。
如果你能就如何写出最好的作品给我建议,我会很高兴。
这是使用的代码:
private lateinit var cursor : Cursor
private val PERMISSIONS_REQUEST_CODE = 100
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
// Android Version 6.0 later
if(checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {
initCursor()
} else {
requestPermissions(arrayOf(Manifest.permission.READ_EXTERNAL_STORAGE), PERMISSIONS_REQUEST_CODE)
}
} else {
// Android Version under 6.0
initCursor()
}
}
override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {
when (requestCode) {
PERMISSIONS_REQUEST_CODE ->
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
initCursor()
} else {
finishApp()
}
else ->
finishApp()
}
}
private fun finishApp() {
// It prevents kotlin.UninitializedPropertyAccessException of cursor(lateinit valiant). It's last resort...
cursor = contentResolver.query(
MediaStore.Images.Media.INTERNAL_CONTENT_URI,
null, null, null, null)
/*
if(cursor != null)
cursor.close()
*/
finish()
}
override fun onStop() {
super.onStop()
cursor.close()
}
private fun initCursor() {
cursor = contentResolver.query(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
null, null, null, null)
cursor.moveToFirst()
}
【问题讨论】: