使用cursors来获取android所保存的图像,需要对cursors进行外部存储授权。如果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 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()
}
不,这不是lateInit
的最佳用法。首先,lateInit
的使用是为了一个在使用时应该可用的变量。使用nullable mean,变量可以为null,这与lateInit
不同,这意味着它不应该为null。
在Android中,它作为oncreate
而不是构造函数中的初始变量非常有用。它对依赖注入也很好,就像匕首一样。
它抛出uninitializedPropertyAccessException
表示您的游标
在访问时没有初始化。这意味着您的代码中存在一个逻辑错误,即光标在没有初始化的情况下被访问。
注意,保持游标
不是一个好的做法。它保存到数据库的连接。您应该在使用它后关闭,并重新创建一个新的,而不是持有它。
问题内容: 首先,我必须说我对API java.util.concurrent很陌生,所以也许我正在做的事情是完全错误的。 我想怎么办? 我有一个Java应用程序,它基本上运行2个单独的处理(称为 myFirstProcess , mySecondProcess ),但是这些处理必须同时运行。 因此,我尝试这样做: myFirstProcess 和 mySecondProcess 是实现的类,它们
我和JNI有一个Android项目。在实现侦听器类的CPP文件中,有一个回调x()。调用x()函数时,我想调用java类中的另一个函数。然而,为了调用该java函数,我需要访问JNIEnv*。 我知道在回调的同一个cpp文件中,有一个函数: 当
本文向大家介绍VScode格式化ESlint方法(最全最好用方法),包括了VScode格式化ESlint方法(最全最好用方法)的使用技巧和注意事项,需要的朋友参考一下 ESlint:是用来统一JavaScript代码风格的工具,不包含css、html等。 背景: 近来研究前端,然后一直在百度上找VScode格式化(ESlint)的插件,结果找了半天都不靠谱。目前没有一个可以格式化html、css、
我需要根据一些配置数据启动多个独立的周期性任务——总数事先不知道。例如,我想检查具有不同间隔和不同参数的不同目录的内容,其中列表和参数是从配置中读取的。 在我看来,夸克斯调度器只能调度固定的、预先已知的方法。动态/编程调度的最佳方法是什么?<代码>vertx.set周期 是正确的方法还是我应该以某种方式访问Quartz?
rank ▲ ✰ vote url 15 789 144 1269 url 检查列表是否为空的最好方法 例如,传递下面: a = [] 我怎么检查a是空值? if not a: print "List is empty" 用隐藏的空列表的布尔值才是最Pythonic的方法.
问题内容: 我对某些外部jar具有运行时依赖性,因此我希望将这些外部jar重新“打包”成单个jar。这些外部依赖项存储在external_jars目录中,我希望不必将它们全部列出(即,如果我的依赖项发生更改,则无需更改构建脚本)。有什么想法吗? 粗略地讲,我需要遵循以下内容,它将lib目录中的所有jar组合到out.jar中(带有一些合理的覆盖规则)。 问题答案: 只需与Ant Zip任务一起使用