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.