If your Kotlin Android app is not asking for runtime permissions, you’re not alone. This is a common issue especially for apps targeting Android 6.0 (API 23) and above, where runtime permissions are required for sensitive features like Camera, Location, Storage, and more.

This guide explains why your Kotlin app fails to ask for permissions and how to implement a correct runtime permission request using best practices in 2025.
Common Causes
- Missing permission in
AndroidManifest.xml - Not requesting runtime permissions in code
- Target SDK version too low
- Ignoring
ActivityCompat.shouldShowRequestPermissionRationale
Complete Kotlin Code Solution
Below is a complete working Kotlin example with separate classes. This code demonstrates how to request and handle permissions properly.
AndroidManifest.xml
<uses-permission android:name="android.permission.CAMERA"/> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
MainActivity.kt
import android.Manifest
import android.content.pm.PackageManager
import android.os.Bundle
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat
class MainActivity : AppCompatActivity() {
private val REQUEST_CODE_PERMISSIONS = 101
private val REQUIRED_PERMISSIONS = arrayOf(
Manifest.permission.CAMERA,
Manifest.permission.READ_EXTERNAL_STORAGE
)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
if (!hasPermissions()) {
requestPermissions()
} else {
proceedWithAppLogic()
}
}
private fun hasPermissions(): Boolean {
return REQUIRED_PERMISSIONS.all {
ContextCompat.checkSelfPermission(this, it) == PackageManager.PERMISSION_GRANTED
}
}
private fun requestPermissions() {
ActivityCompat.requestPermissions(this, REQUIRED_PERMISSIONS, REQUEST_CODE_PERMISSIONS)
}
override fun onRequestPermissionsResult(
requestCode: Int,
permissions: Array<String>,
grantResults: IntArray
) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
if (requestCode == REQUEST_CODE_PERMISSIONS) {
if (grantResults.all { it == PackageManager.PERMISSION_GRANTED }) {
Toast.makeText(this, "Permissions granted", Toast.LENGTH_SHORT).show()
proceedWithAppLogic()
} else {
Toast.makeText(this, "Permissions denied", Toast.LENGTH_LONG).show()
}
}
}
private fun proceedWithAppLogic() {
// Your app logic here
}
}
Related Resource
Read more about Android runtime permissions guide from the official documentation.
Extra Tips
- Always request permissions before accessing protected features.
- Consider adding a custom dialog before system permission dialog for better UX.
- Check
shouldShowRequestPermissionRationale()for denied permissions.