Uygulama ayarlarını ve izinlerini programlı olarak nasıl açılır (Intent)
Belirli bir uygulamanın ayarlar ekranını veya "İzinler" bölümünü açmak için ACTION_APPLICATION_DETAILS_SETTINGS ve data = Uri.fromParts("package", packageName, null) içeren bir Intent kullanın. Bu çağrı, uygulama sayfası için API 9+ üzerinde çalışır ve API 23+ üzerindeki çalışma zamanı izinlerinin yönetimi için geçerlidir.
Hızlı cevap ve ne zaman uygulanır
Uygulama sayfasını (izinler dahil) şu şekilde açın:
- data = Uri.fromParts("package", packageName, null) ile Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS) kullanın.
- Activity'den çağırın, servisden çağırıyorsanız FLAG_ACTIVITY_NEW_TASK ekleyin. Şu durumlarda uygulayın: "Bir daha sorma" seçeneğiyle izin reddedildiğinde, onboarding sırasında, kullanıcıya erişimi nasıl etkinleştireceğini açıklamanız gerektiğinde (kamera, mikrofon, kişiler vb.).
Pratik kod örnekleri (Kotlin ve Java)
Kotlin — uygulama sayfasını / izinleri açma:
import android.content.Intent
import android.net.Uri
import android.provider.Settings
fun openAppSettings(packageName: String, startActivityFunc: (Intent) -> Unit) {
val intent = Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS).apply {
data = Uri.fromParts("package", packageName, null)
flags = Intent.FLAG_ACTIVITY_NEW_TASK
}
startActivityFunc(intent)
}
Activity'de çağrı:
openAppSettings(packageName) { startActivity(it) }
Java — aynı örnek:
import android.content.Intent;
import android.net.Uri;
import android.provider.Settings;
private void openAppSettings(String packageName) {
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
intent.setData(Uri.fromParts("package", packageName, null));
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
}
Bildirim ayarlarını açma (Android 13+ channel id gönderimini destekler):
val notifIntent = Intent(Settings.ACTION_APP_NOTIFICATION_SETTINGS).apply {
putExtra(Settings.EXTRA_APP_PACKAGE, packageName)
putExtra(Settings.EXTRA_CHANNEL_ID, yourChannelId) // isteğe bağlı
}
startActivity(notifIntent)
Ayarlar için sık kullanılan Intent'ler (kullanışlı bir kopya kağıdı)
| Intent | Ne açar | Minimum API |
|---|---|---|
| Settings.ACTIONAPPLICATIONDETAILS_SETTINGS | Uygulama sayfası (izinler içinde) | 9 |
| Settings.ACTIONAPPNOTIFICATION_SETTINGS | Uygulama için bildirim ayarları | 26 |
| Settings.ACTIONREQUESTIGNOREBATTERYOPTIMIZATIONS | Pil optimizasyonundan muaf tutma | 23 |
| Settings.ACTIONUSAGEACCESS_SETTINGS | Kullanım istatistiklerine erişim | 21 |
| Settings.ACTIONMANAGEOVERLAY_PERMISSION (Intent URI aracılığıyla) | "Diğer uygulamaların üzerinde göster" izni | 23 |
Intent'i Service veya BroadcastReceiver'dan çağırırken Intent.FLAG_ACTIVITY_NEW_TASK ekleyin; startActivity öncesinde resolveActivity() kontrolü yapın.
Hata işleme ve uyumluluk önerileri
- Intent'in cihazda izin verildiğini her zaman kontrol edin:
private fun safeStart(intent: Intent): Boolean {
return if (intent.resolveActivity(packageManager) != null) {
startActivity(intent); true
} else {
// Kullanıcıya açıklama göster
false
}
}
- MIUI/EMUI/diğer özel ROM'lar bazı Intent'leri engelleyebilir — yedek plan hazırlayın: ayarları manuel olarak nasıl açacağınıza dair talimat içeren bir iletişim kutusu gösterin.
- QUERY_ALL_PACKAGES iznini gereksiz yere istemeyin — bu, Android 11+ için hassas bir izindir.
- Yeni platformlar için değişiklikleri takip edin: Google periyodik olarak belirli ayarlar için yeni ACTION_* eklemektedir.
Bazı üreticiler sistem ayarlarının davranışını değiştirebilir — Intent genel bir bölümü açabilir, belirli bir ekranı değil. Her zaman popüler arayüzlere sahip gerçek cihazlarda test edin.
Sık yapılan hatalar
- FLAG_ACTIVITY_NEW_TASK olmadan Service'den Intent başlatmaya çalışmak → ActivityNotFoundException.
- resolveActivity() kontrolünün eksik olması → özel ROM'da uygulama çöker.
- Uri.fromParts içinde yanlış paket → genel ayarlar sayfası açılır.
- Ayarlara geçtikten sonra uygulamanın otomatik olarak izin alacağını beklemek — kullanıcı izni manuel olarak etkinleştirmelidir.
SSS
- Ayarları açmak için QUERY_ALL_PACKAGES izni istemek gerekir mi?
- Hayır. Belirli bir uygulamanın ayarlarını açmak için QUERY_ALL_PACKAGES gerekmez.
- Uygulama sayfası içindeki belirli "İzinler" ekranını nasıl açarım?
- Çoğu cihazda ACTION_APPLICATION_DETAILS_SETTINGS doğrudan uygulama sayfasına gider, burada kullanıcı "İzinler"e geçebilir. Ayrıntı düzeyi sürüme ve arayüze bağlıdır.
- Intent kullanarak bir izni otomatik olarak etkinleştirmek mümkün mü?
- Hayır. Intent sadece ayarlar sayfasını açar — karar ve eylem kullanıcıya aittir.
Gerekirse Jetpack Compose, Navigation Component veya ayrıntılı hata işleme ile Service/Receiver'dan çağrı örnekleri ekleyebilirim.