こんにちは。
端末で保持している画像を、カーソルを使って取得する処理があります。
(カーソルは、外部ストレージに対する権限許可が必要です)
AndroidOSが6.0以上でかつ権限許可が得られなかった場合、アプリを終了させます。
許可が得られた場合、カーソルを閉じる処理が必要です。
Javaであれば、onStopに
if (cursor != null ) cursor.close();
と書けば済んだのですが、Kotlinの場合、例外が発生します。
kotlin.UninitializedPropertyAccessException: lateinit property cursor has not been initialized
そこで、苦肉の策として、一旦カーソルを作ってfinishする、と書きました。
cursor = contentResolver.query( MediaStore.Images.Media.INTERNAL_CONTENT_URI, null, null, null, null)
これにより例外が発生しなくなりましたが、不要なコードを書いているようで、なんだかすっきりしません。
かといって、cursorをlateinitしない(宣言時になんらかのカーソルを割り当てる)のも、無駄なコードだと思います。
宣言時に、private var cursor : Cursor? = null
とすると、null判定コードが各所に必要となり、Kotlin的に正しくない気がします。
どのように書くのが最善なのか、アドバイス頂ければ幸いです。
Activityの中のコード
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() }

回答2件
あなたの回答
tips
プレビュー
下記のような回答は推奨されていません。
このような回答には修正を依頼しましょう。
また依頼した内容が修正された場合は、修正依頼を取り消すようにしましょう。
2017/10/10 22:42
2017/10/11 01:12
2017/10/11 01:31